VBA: подпрограмма с оператором if и возвратом true или false?

РЕШЕНО!

Я должен проверить, что определенные ячейки не пусты, поэтому я хочу создать подпрограмму и передать нужные мне переменные.

Вот что я придумал:

Sub errorMessage(errMsg As String, errRange As String)
If Range(errRange) = "" Then
    MsgBox errMsg, , "Error:"
    Range(errRange).Activate
    'this is what i was looking for :doh:, the 'end' line terminates everything..
    END
End Sub

Теперь, когда я вызываю его с моей кнопки, будет ли он фактически заканчивать кнопку?

i.e.

Private Sub CommandButton1_Click()

    Call errorMessage("name is missing", "D4")

    'this function shouldn't be called if there was a msgbox displayed with the above call 
sendEmail 


End Sub

Как я могу это сделать?

ИЗМЕНИТЬ:

ОК Итак, вот как я это сделал, причина, по которой я пытаюсь это сделать, заключается в том, чтобы избежать тонны строк кода в сабвуфере buttonClick, что вы думаете ??

имейте в виду, что эта штука должна проверить около 25 вопросов на наличие пробелов перед выполнением подпрограммы sendEmail....

Private Sub CommandButton1_Click()


    Call validateEntry("Client Name is missing.", "D4")
    Call validateEntry("# not complete.", "D5")


    Call validateEntry("Address same as CV?", "D6")


    Call validateEntry("Number missing.", "D8")
    Call validateEntry("Type missing.", "D9")
    Call validateEntry("Q1 requires a Yes or No.", "E19")
    Call validateEntry("Q2 requires a Yes or No.", "E21")
    Call validateEntry("Q3 requires a Yes or No.", "E23")
    Call validateEntry("Q4 requires a Yes or No.", "E25")
    Call validateEntry("Q5 requires a Date.", "D28")
    Call validateEntry("Q6 requires a Yes or No.", "E30")
    Call validateEntry("Q7 requires a Yes or No.", "E32")



MsgBox "passed"
'sendEmail
End Sub


Sub validateEntry(errMsg As String, errRange As String)
    If Range(errRange) = "" Then
        MsgBox errMsg, , "Error:"
        Range(errRange).Activate
        End
    End If
End Sub

person maxgohan    schedule 07.02.2013    source источник
comment
Использование Endдействительно плохая идея, см. здесь. При использовании End нет абсолютно никакой очистки объекта.   -  person LittleBobbyTables - Au Revoir    schedule 08.02.2013


Ответы (2)


Итак, в вашем примере вы ищете «пройденное» уведомление, которое будет отправлено только тогда, когда в ячейке D4 есть данные, верно?

Это должно работать:

Private Function errorMessage(errMsg As String, errRange As String) As Boolean
    errorMessage = False

    If Len(Trim(Range(errRange))) = 0 Then
        MsgBox errMsg, , "Error:"
        Range(errRange).Activate

        errorMessage = True
    End If
End Function

Public Sub CommandButton1_Click()
    If errorMessage("name is missing", "D4") = False Then
        MsgBox "passed"
    End If
End Sub

В качестве альтернативы вы можете обрабатывать все уведомления MsgBox из функции, чтобы сгруппировать аналогичную логику вместе и сохранить в чистоте подпрограмму события нажатия кнопки:

Private Function errorMessage(errMsg As String, errRange As String)
    If Len(Trim(Range(errRange))) = 0 Then
        MsgBox errMsg, , "Error:"
        Range(errRange).Activate
    Else
        MsgBox "passed"
    End If
End Function

Public Sub CommandButton1_Click()
    Call errorMessage("name is missing", "D4")
End Sub
person armstrhb    schedule 07.02.2013
comment
то, что я ищу, - это завершить функцию нажатия кнопки, если вызов errorMessage отображает msgbox; таким образом я могу избежать того, чтобы функция нажатия кнопки выполняла код отправки электронной почты, если произошла ошибка... - person maxgohan; 08.02.2013
comment
Хорошо, я понял, я могу сделать это, используя «Конец» в выражении if, мальчик, я чувствую себя тупым! - person maxgohan; 08.02.2013
comment
Не используйте End! См. ответ @LittleBobbyTables. Используйте Exit Sub. - person Doug Glancy; 08.02.2013

Здесь есть ряд заблуждений.

Во-первых, нет, это не завершит процедуру кнопки по умолчанию. Вам нужно будет справиться с этим в вашей кнопке.

Далее, вам не хватает End If где-то здесь:

Sub errorMessage(errMsg As String, errRange As String)
    If Range(errRange) = "" Then  ' This may not be the best way to check for 
                                  ' an empty range
        MsgBox errMsg, , "Error:"
        Range(errRange).Activate
        Exit Sub
End Sub

На самом деле вам даже не нужна подпрограмма, вам нужна функция, которая возвращает логическое значение, например:

Function errorMessage(errMsg As String, errRange As String) as Boolean
    ' Function returns True if an error occured
    errorMessage = False
    If Range(errRange) = "" Then
        MsgBox errMsg, , "Error:"
        Range(errRange).Activate
        errorMessage = True
    End If
End Sub

А потом здесь:

Private Sub CommandButton1_Click()

    If errorMessage("name is missing", "D4") Then
        Exit Sub
    End If

    'this msgbox should not display if the above msgbox is displayed
    MsgBox "passed"

    ' continue on with all of your fun processing here
End Sub
person LittleBobbyTables - Au Revoir    schedule 07.02.2013
comment
@maxgohan Вы пытались отредактировать этот пост с комментарием о том, что на самом деле вы не можете добавить ответ на свой вопрос ... но вы можете, и вам рекомендуется это сделать, если ваш ответ решает вашу проблему таким образом, который не t был представлен также или вообще другим ответом. - person Beska; 08.02.2013
comment
спасибо @Beska, я отредактировал свой исходный пост, указав то, что работает для меня, пожалуйста, укажите, какие проблемы могут возникнуть, если я сделаю это таким образом. - person maxgohan; 08.02.2013