变量名称的Excel VBA调用函数
我试图调用基于组合框值在运行时生成的变量名称的函数。这在大多数语言中都很简单,但我似乎无法在Excel VBA中找到它,我怀疑这是因为我不太了解编译器如何工作。我发现了几个贴近的帖子,但似乎并没有这么做。下面的代码是错误的,但应该给我想要的东西。变量名称的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
CallByName
是你需要完成的任务是什么。
例如: 代码在Sheet
Option Explicit
Public Function Sum(ByVal x As Integer, ByVal y As Integer) As Long
Sum = x + y
End Function
代码是模块1(BAS模块)
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
的输出返回。
你应该写一个接受CB值作为参数,然后使用选择的情况下调用适当的格式化功能的函数。
类似的东西这个
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列表可能变得相当长。也许这只是工程上的荒谬。 – BWG
上述工作,但不会有大量的名字
使用Application.Run(宏名称,参数)
你必须可以确保有一个宏,但它比上述更好的因为没有选择语句。
对于我的回答你上面也可以发现这很有检查宏是否存在
'=================================================================================
'- 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
'-----------------------------------------------------------------------------------
不错。我会尝试评估,因为我不知道这一个。 –
非常好,谢谢! – BWG
嗨..如果我不想在Sheet1中使用'sum'函数,但在Module1中说。我如何使用CallByName调用Module1的'sum'函数。这似乎并不奏效。请指教。 – ihightower