具有变量名称的 Excel VBA 调用函数

Posted

技术标签:

【中文标题】具有变量名称的 Excel VBA 调用函数【英文标题】:Excel VBA call function with variable name 【发布时间】: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

【问题讨论】:

【参考方案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
'-----------------------------------------------------------------------------------

【讨论】:

以上是关于具有变量名称的 Excel VBA 调用函数的主要内容,如果未能解决你的问题,请参考以下文章

java 调用excel vba

从 Excel 调用 Access VBA 函数

用户定义的函数在 vba 中工作正常,而从显示“值”错误的 excel 表调用时

从excel单元格调用excel工作表函数

用Excel使用VBA时显示运行错误5,错误调用参数,程序特别简单,如图,求问哪里出错了

excel vba 调用ADODB 问题?