Excel VBA call function with variable name

后端 未结 4 1145
不思量自难忘°
不思量自难忘° 2020-12-28 10:34

I\'m trying to call a function with a variable name that is generated at run time based upon a combo box value. This is straightforward in most languages but I can\'t seem

相关标签:
4条回答
  • 2020-12-28 10:48

    CallByName is what you'll need to accomplish the task.

    example: Code in Sheet1

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

    Code is Module1 (bas module)

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

    Running the method testSum calls the method Sum using the name of the method given in a string variable, passing 2 parameters (1 and 2). The return value of the call to function is returned as output of CallByName.

    0 讨论(0)
  • 2020-12-28 10:49

    The above will work but not with a large number of names

    Use Application.Run(MacroName, Parameters)

    You have to may sure that there is a macro but it is better than the above as there is no select statement.

    0 讨论(0)
  • 2020-12-28 10:51

    You should write a function that accepts the CB value as a parameter and then uses a select case to call the appropriate formatting function.

    Something similar to this

    Function SelectFormatting(Name as String) As Boolean
    Select Case CBinst.Value
    Case "Text1":
       SelectFormatting = Text1FormattingFunction()
    Case "Text2":
       .
       .
       .
    End Select
    End Function
    
    0 讨论(0)
  • 2020-12-28 10:55

    With respect to my answer above you might also find this useful to check whether the macro exists

    '=================================================================================
    '- 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
    '-----------------------------------------------------------------------------------
    
    0 讨论(0)
提交回复
热议问题