excel 减少for循环中的Select语句

zz2j4svz  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(129)

在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
um6iljoc

um6iljoc1#

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

  • 编码需要输入 * 字符串 * 来定义想要的proc名称的Run procedure
  • 使用带有不可见元素(在括号内)的枚举和可能循环的最大定义:
    • 模块标题中的示例代码**
Option Explicit

Enum apply
    [_Start] = 0
    Method1
    Method2
    Method3
    [_Limit]
    max = [_Limit] - 1
End Enum
    • 注意**枚举将空数值加到未定义的前置任务上,然后再加1。
    • 调用枚举过程序列的主过程**

x一个一个一个一个x一个一个二个x
如果您喜欢更直接的代码而不附加的 * 枚举变量 *,则只需如下循环即可:

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
uidvcgyl

uidvcgyl2#

使用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
brccelvz

brccelvz3#

这是软件设计领域中常见的“设计模式”。
在VBA中,最简洁的方法是使用字典和一组公开单个exec方法的小类。
加载一个字典,其中包含键值对和类的一个新示例,该示例包含链接到键的方法(或者,如果您了解如何链接,则加载一个带有predeclaredid的类)。
如果字典名为“myMethods”,方法选择器名为“myMethod”,则可以使用

myMethods.Item(myMethod).exec

这是此类活动的基本级别。您可以通过在新阶段提供初始化参数等来进行更复杂的操作。

相关问题