Vba 在函数调用之前或函数内部检查错误?

Vba 在函数调用之前或函数内部检查错误?,vba,excel,Vba,Excel,我很想知道在运行函数之前检查错误的最佳方法是什么。最好是在调用函数之前进行检查,还是在函数本身内部进行检查 例如,我正在处理的一个简化版本包含以下Click子例程: Private Sub MyButton1_Click() For j = 1 to 3 CreateChart Sheets(j) Next j End Sub 它调用的函数定义如下: Function CreateChart(Sht As Worksheet) As Boolean Se

我很想知道在运行函数之前检查错误的最佳方法是什么。最好是在调用函数之前进行检查,还是在函数本身内部进行检查

例如,我正在处理的一个简化版本包含以下Click子例程:

Private Sub MyButton1_Click()
    For j = 1 to 3
        CreateChart Sheets(j)
    Next j
End Sub
它调用的函数定义如下:

Function CreateChart(Sht As Worksheet) As Boolean
    Set ChtObj = Sht.ChartObjects.Add(40, 40, 600, 300)
    Set Cht = ChtObj.Chart
...
End Function
我处理的代码包含多个模块,在许多情况下,在函数成功运行之前需要执行某些检查。在单击子例程的循环中进行检查是否最合适,例如:

If DoesSheetExist(Sheets(j)) Then CreateChart(Sheets(j))
Sub mainSub()
    If validateCreateChart Then
        CreateChart
    End If
End Sub

Sub CreateChart()
    On Error Goto errHandler
    'do stuff
    exit sub
    errHandler:
        msgbox  "Unexpected error: " & err.description
End Sub

Function validateCreateChart() As Boolean


    If ConditionOne Then
        validateCreateChart = False
        MsgBox "error condition 1"
        Exit Function
    End If


    If ConditionTwo Then
        validateCreateChart = False
        MsgBox "error condition 2"
        Exit Function
    End If

    'etc

End Function
或者最好将其放入函数中,如:

If Not DoesSheetExist(Sht) Then CreateChart = False: Exit Function
目前,我在代码中分散了一些实践,我想将其清理干净。最好在函数外部或内部运行此检查

我处理的代码包含多个模块,在许多情况下,在函数成功运行之前需要执行某些检查。在单击子例程的循环中进行检查是否最合适,例如:

If DoesSheetExist(Sheets(j)) Then CreateChart(Sheets(j))
Sub mainSub()
    If validateCreateChart Then
        CreateChart
    End If
End Sub

Sub CreateChart()
    On Error Goto errHandler
    'do stuff
    exit sub
    errHandler:
        msgbox  "Unexpected error: " & err.description
End Sub

Function validateCreateChart() As Boolean


    If ConditionOne Then
        validateCreateChart = False
        MsgBox "error condition 1"
        Exit Function
    End If


    If ConditionTwo Then
        validateCreateChart = False
        MsgBox "error condition 2"
        Exit Function
    End If

    'etc

End Function
一般来说,如果您要对每一个代码都执行相同的检查,我会避免在主代码中重复相同的检查


如果我有4个检查,并且我想知道当函数通过MsgBox失败时,哪个问题是导致问题的原因,那么有时我会将检查留在主代码中的循环之外,以便只显示一个通知。是否有办法在功能中进行检查,但只报告一次问题

听起来,对于每个CreateChart方法,您都有一些相同的检查。我会这样做:

If DoesSheetExist(Sheets(j)) Then CreateChart(Sheets(j))
Sub mainSub()
    If validateCreateChart Then
        CreateChart
    End If
End Sub

Sub CreateChart()
    On Error Goto errHandler
    'do stuff
    exit sub
    errHandler:
        msgbox  "Unexpected error: " & err.description
End Sub

Function validateCreateChart() As Boolean


    If ConditionOne Then
        validateCreateChart = False
        MsgBox "error condition 1"
        Exit Function
    End If


    If ConditionTwo Then
        validateCreateChart = False
        MsgBox "error condition 2"
        Exit Function
    End If

    'etc

End Function
您不希望错误/提示的逻辑到处都是。特别是如果您正在执行相同的检查,并且每个检查都会有相同的错误提示


不要在没有错误处理的情况下留下子/函数,否则当出现“这永远不会发生”的情况时,你会后悔的。

我会避免在主代码中重复检查,并将其放入你的
函数中。保持简单——例如,如果你想改变你的检查逻辑,考虑什么是最容易的:在整个代码还是在单个函数中改变逻辑?在我说4个检查的情况下,我想知道当函数通过MSGBOX失败时,哪个问题引起了问题,然后,有时我会在主代码中的循环之外保留检查,以便只显示一个通知。是否有一种方法可以在函数中进行检查,但只报告一次问题?您可以做的是将函数的返回类型从
布尔值更改为
整数,当没有问题时返回
1
,当第一次检查代码失败时返回
-1
-2
-当代码在第二次检查中失败时,依此类推。在主代码的循环中,可以为每个错误“代码”添加单个msgbox。我坚信每个子/函数都应该有某种类型的错误处理代码。正如@simoco所说,您可以将函数中的值返回到:(a)表示失败,(b)采用不同的路径。如果没有陷阱,如果调用嵌套在四到五层的深度,那么试图找到罪犯就没有那么有趣了@Dunn,所以你也主张在内部和外部进行检查?我喜欢这个解决方案。我必须先解开网络,然后才能把所有的东西都整理好,但这应该行得通。@teepee我已经开始把我所有的支票都换成这种格式了。否则,不可避免地,我会得到多个“几乎相同但不相同”的检查序列。让我告诉你,当你必须更新它们时,这是一种痛苦:)你可能会发现相关的。