VBA:if语句的子例程并返回true或false?

时间:2013-02-07 21:16:56

标签: excel vba excel-vba subroutine

解决!

我必须验证某些单元格不是空的,所以我想创建一个子程序并传递我需要检查的变量。

这就是我提出的:

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

现在当我从我的按钮调用它时,它是否会实际结束按钮的子项?

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子中的大量代码行,你有什么想法?

请记住,在执行sendEmail子程序之前,这件事必须检查大约25个空白问题....

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

2 个答案:

答案 0 :(得分: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通知,将类似的逻辑组合在一起,并保持Button Click Event Sub清洁:

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

答案 1 :(得分:1)

这里存在一些误解。

首先,不,它默认不会结束按钮例程。您需要在按钮内处理。

接下来,你在这里错过了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