Vba 在函数调用之前或函数内部检查错误?
我很想知道在运行函数之前检查错误的最佳方法是什么。最好是在调用函数之前进行检查,还是在函数本身内部进行检查 例如,我正在处理的一个简化版本包含以下Click子例程: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
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我已经开始把我所有的支票都换成这种格式了。否则,不可避免地,我会得到多个“几乎相同但不相同”的检查序列。让我告诉你,当你必须更新它们时,这是一种痛苦:)你可能会发现相关的。