如何最好地构造Excel VBA代码,以便于维护、清晰和错误处理

如何最好地构造Excel VBA代码,以便于维护、清晰和错误处理,vba,excel,Vba,Excel,让我们假设我想要运行一些漂亮的VBA代码,这些代码可以最好地分解为四个漂亮的小顺序函数 Call Init() Call FirstStep() Call SecondStep() Call CleanUp() 但是,如果前三个选项中的一个因错误或用户取消而失败,那么我希望整齐地退出并运行清理 我从 If Init() Then If FirstStep() Then If SecondStep() Then End If End If End

让我们假设我想要运行一些漂亮的VBA代码,这些代码可以最好地分解为四个漂亮的小顺序函数

Call Init()
Call FirstStep()
Call SecondStep()
Call CleanUp()
但是,如果前三个选项中的一个因错误或用户取消而失败,那么我希望整齐地退出并运行
清理

我从

If Init() Then
    If FirstStep() Then
        If SecondStep() Then
        End If
    End If
End If
Call CleanUp
但这很难看

接下来是

Select Case vbCancel
    Case Init()
    Case FirstStep()
    Case SecondStep()
End Select
Call CleanUp

这是一个进步,但我仍然想知道是否有更好的方法?我知道VBA并不是真正设计成结构良好的,但尽管如此,我还是想尝试一下。

错误处理对错误处理很有好处。使您的例程出错。如果出现错误,则您可以:

on error goto ERR_IN_PROCESS
    Init
    FirstStep
    SecondStep

ERR_IN_PROCESS:
    CleanUp
这还具有处理运行时错误的优点

如果您真的不想使用错误处理,那么可以使用更简短的Select表单

Select Case False
    Case Init(), FirstStep(), SecondStep()
End Select

CleanUp
我看不到循环的点,而是使用范围:

Sub Foo()
    Run
    CleanUp
End Sub

Sub Run()
    If Not Init Then Exit Sub
    If Not FirstStep Then Exit Sub
    If Not SecondStep Then Exit Sub
End Sub

@如果失败是由于运行时错误造成的,那么AlexK的答案是标准答案

但在某些情况下,我们需要:

1-运行一个正常的操作和检查序列,逻辑是这样的,当其中一个操作返回布尔值时,我们必须在某个地方停止

2-避免设置标准错误处理(有些情况下我们不希望这样)

3-避免大量嵌套的If(正如你所说的太难看)

Select Case
解决方案满足了这些要求,但您可能更喜欢另一个解决方案(意图更明确):


嗨,谢谢你。我忘了说我讨厌后藤另外,我将在下一步使用On error Resume处理每个函数中的错误捕获,然后测试Err.Number并尝试解决问题。在本地处理错误后,您可以重新抛出错误(或自定义错误)<错误转到时的代码>与在其他上下文中使用
goto
不同。只要假装它读的是
try{}
。我会假装它是try{},但这并不容易。颤抖我认为这与选择案例陈述是一致的。谢谢。问题的原因不是针对错误处理。这是为了清晰和良好的编码标准。我很高兴在答案中包含错误处理的讨论,但请不要将其误认为是问题的原因。IMHO错误处理应该在本地进行,以确保它不受库中代码的影响。公平地说,还有很多其他选择。
Do
  If Not FirstStep Then Exit Do
  If Not SecondStep Then Exit Do
  If Not ThirdStep Then Exit Do
  If Not FourthStep Then Exit Do
  ' ...
Loop Until True
Cleanup