【问题标题】:Excel VBA call function with variable name具有变量名称的 Excel VBA 调用函数
【发布时间】:2011-11-16 10:01:15
【问题描述】:

我正在尝试使用在运行时根据组合框值生成的变量名称调用函数。这在大多数语言中都很简单,但我似乎无法在 Excel VBA 中弄清楚,我怀疑这是因为我并不真正了解编译器的工作原理。我发现了几篇很接近但似乎不太有效的帖子。下面的代码是错误的,但应该让我知道我想要什么。

谢谢

Sub main()
    'run formatting macros for each institution on format button click

     Dim fn As String
     Dim x As Boolean

     'create format function name from CB value        
     fn = "format_" & CBinst.Value

     'run function that returns bool
     x = Eval(fn)

     ...

End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    CallByName 是您完成任务所需要的。

    示例: Sheet1中的代码

    Option Explicit
    Public Function Sum(ByVal x As Integer, ByVal y As Integer) As Long
        Sum = x + y
    End Function
    

    代码是 Module1(基本模块)

    Option Explicit
    
    Sub testSum()
    Dim methodToCall As String
    methodToCall = "Sum"
    
    MsgBox CallByName(Sheet1, methodToCall, VbMethod, 1, 2)
    End Sub
    

    运行方法testSum 调用方法Sum,使用字符串变量中给出的方法名称,传递2 个参数(1 和2)。函数调用的返回值作为CallByName的输出返回。

    【讨论】:

    • 不错。我会尝试评估,因为我不知道那个。
    • 嗨..如果我不想在 Sheet1 中使用“sum”函数怎么办..但在 Module1 中说。如何使用 CallByName 调用 Module1 的“sum”函数。这似乎不起作用。请指教。
    • @ihightower:这是不可能的。您可以使用Application.Run 并将方法名称、参数传递给它。
    • @shahkalpesh 谢谢.. 效果很好!与 CallByName 相比,Application.Run 有什么缺点吗?比如速度慢、效率低等。
    • @ihightower:关于性能,我想说两者都很慢,但这取决于衡量它。即如果您调用Application.Run a 100,000 次并将其与CallByName 进行比较,以查看它需要多长时间或内存消耗等
    【解决方案2】:

    您应该编写一个接受 CB 值作为参数的函数,然后使用 select case 调用适当的格式化函数。

    类似的东西

    Function SelectFormatting(Name as String) As Boolean
    Select Case CBinst.Value
    Case "Text1":
       SelectFormatting = Text1FormattingFunction()
    Case "Text2":
       .
       .
       .
    End Select
    End Function
    

    【讨论】:

    • 感谢您的回答。这确实是解决这个问题的直接方法。我希望抽象出我必须为每个 CB 值添加案例的方法,原因有两个:1)代码将由具有不同编码能力的人定期更新,允许他们添加新的 CB 选项和格式会很好在不触及程序内部的情况下运行 2) CB 列表可能会变得相当长。也许这对工程来说是荒谬的。
    【解决方案3】:

    上述方法可行,但不适用于大量名称

    使用 Application.Run(MacroName, 参数)

    你必须确定有一个宏,但它比上面的要好,因为没有选择语句。

    【讨论】:

      【解决方案4】:

      关于我上面的回答,您可能还会发现这对于检查宏是否存在很有用

      '=================================================================================
      '- CHECK IF A MODULE & SUBROUTINE EXISTS
      '- VBA constant : vbext_pk_Proc = All procedures other than property procedures.
      '- An error is generated if the Module or Sub() does not exist - so we trap them.
      '---------------------------------------------------------------------------------
      '- VB Editor : Tools/References - add reference TO ......
      '-    .... "Microsoft Visual Basic For Applications Extensibility"
      '----------------------------------------------------------------------------------
      '- Brian Baulsom October 2007
      '==================================================================================
      Sub MacroExists()
          Dim MyModule As Object
          Dim MyModuleName As String
          Dim MySub As String
          Dim MyLine As Long
          '---------------------------------------------------------------------------
          '- test data
          MyModuleName = "TestModule"
          MySub = "Number2"
          '----------------------------------------------------------------------------
          On Error Resume Next
          '- MODULE
          Set MyModule = ActiveWorkbook.VBProject.vbComponents(MyModuleName).CodeModule
          If Err.Number <> 0 Then
          MsgBox ("Module : " & MyModuleName & vbCr & "does not exist.")
          Exit Sub
          End If
          '-----------------------------------------------------------------------------
          '- SUBROUTINE
          '- find first line of subroutine (or error)
          MyLine = MyModule.ProcStartLine(MySub, vbext_pk_Proc)
          If Err.Number <> 0 Then
          MsgBox ("Module exists      : " & MyModuleName & vbCr _
                 & "Sub " & MySub & "( )  : does not exist.")
          Else
          MsgBox ("Module : " & MyModuleName & vbCr _
              & "Subroutine   : " & MySub & vbCr _
              & "Line Number : " & MyLine)
          End If
      End Sub
      '-----------------------------------------------------------------------------------
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-23
        • 2021-01-10
        • 1970-01-01
        • 2022-01-16
        • 2016-04-10
        • 1970-01-01
        相关资源
        最近更新 更多