具有变量名称的 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 调用函数的主要内容,如果未能解决你的问题,请参考以下文章
用户定义的函数在 vba 中工作正常,而从显示“值”错误的 excel 表调用时