减少for循环中的Select语句



在vba中存在任何功能,我基本上可以在循环中索引方法,而不是索引匹配它们?

我想避免多次重复for循环,因为它会使代码变得混乱,因为在应用方法之前,for循环中会发生其他事情

For iRow = 1 to LargeNumber
'do lots of stuff here...
'...........
'to here....
Select Method
Case Method1
Call ApplyMethod1
Case Method2
Call ApplyMethod2
.......
Case Methodn
Call ApplyMethodn
end select
next iRow

然而,该方法是事先已知的,不需要为每一行找到。所以我可以更有效地应用这样的东西(如果功能存在!)。

For iRow = 1 to LargeNumber
'do lots of stuff here...
'...........
'to here....
goto Method
:Method1
Call ApplyMethod1
goto EndOfMethods
:Method2
Call ApplyMethod2
goto EndOfMethods
.......
:Methodn
Call ApplyMethodn
goto EndOfMethods
:EndOfMethods
end select
next iRow

除了@user3598756的类方法之外,您还可以从

中获益
  • 编码Run过程,需要输入字符串来定义所需的进程名,
  • 使用不可见元素的枚举(括号内)和可能循环的最大定义:

模块头示例代码

Option Explicit
Enum apply
[_Start] = 0
Method1
Method2
Method3
[_Limit]
max = [_Limit] - 1
End Enum

注意该枚举将空数值在未定义的前一项的基础上增加+1。

调用枚举过程序列的主过程

Sub TestRun()
Dim i As Long
For i = apply.Method1 To apply.max
Run "ApplyMethod" & i     ' << execute "methods" one by one
Next
End Sub
Sub ApplyMethod1(Optional ApplyIndex As Long = 1)
Debug.Print "ApplyMethod" & ApplyIndex
' further stuff
' ...
End Sub
Sub ApplyMethod2(Optional ApplyIndex As Long = 2)
Debug.Print "ApplyMethod" & ApplyIndex
' further stuff
' ...
End Sub
Sub ApplyMethod3(Optional ApplyIndex As Long = 3)
Debug.Print "ApplyMethod" & ApplyIndex
' further stuff
' ...
End Sub

如果你喜欢更直接的代码不带额外的枚举变量,它足以循环如下:

Option Explicit                   ' code module head
Sub TestRun()                     
Dim i As Long
For i = 1 To 3                ' << change 3 to actual maximum
Run "ApplyMethod" & i     ' << execute "methods" one by one
Next
End Sub

使用CallByName()函数(https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/callbyname-function),该函数需要一个对象调用

的方法因此你需要添加一个类来收集所有需要的方法

添加一个类模块,给它一个名字(我把它命名为"clMethods")

将此代码添加到类模块

Option Explicit
Sub a()
Debug.Print "a"
End Sub
Sub b()
Debug.Print "b"
End Sub
Sub c()
Debug.Print "b"
End Sub

在代码中使用

Dim methods_ As clMethods
Set methods_ = New clMethods

CallByName methods_, "a", VbMethod  

这是软件设计领域常见的"设计模式"。

在VBA中,最干净的方法是使用一个字典和一组暴露单个exec方法的小类。

加载一个字典,其中包含键值对和一个类的新实例,该实例具有链接到键的方法(或者,如果您了解如何操作,可以使用预先声明的类)。

如果你的字典名为'myMethods',你的方法选择器名为'myMethod',你可以直接使用

myMethods.Item(myMethod).exec

这是这类活动的基本水平。您可以通过在新阶段提供初始化参数等更复杂。

最新更新