2011-09-13 41 views
8

我试图调用基于组合框值在运行时生成的变量名称的函数。这在大多数语言中都很简单,但我似乎无法在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 

回答

15

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的输出返回。

+0

不错。我会尝试评估,因为我不知道这一个。 –

+0

非常好,谢谢! – BWG

+0

嗨..如果我不想在Sheet1中使用'sum'函数,但在Module1中说。我如何使用CallByName调用Module1的'sum'函数。这似乎并不奏效。请指教。 – ihightower

0

你应该写一个接受CB值作为参数,然后使用选择的情况下调用适当的格式化功能的函数。

类似的东西这个

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

感谢您的回答。这确实是解决这个问题的直接方法。我希望抽象的方式来为每个CB值添加案例,原因有两个:1)代码将由具有不同编码能力的人员定期更新,并允许他们添加新的CB选项并格式化功能不会触及程序的内容,并且2)CB列表可能变得相当长。也许这只是工程上的荒谬。 – BWG

1

上述工作,但不会有大量的名字

使用Application.Run(宏名称,参数)

你必须可以确保有一个宏,但它比上述更好的因为没有选择语句。

0

对于我的回答你上面也可以发现这很有检查宏是否存在

'================================================================================= 
'- 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 
'-----------------------------------------------------------------------------------