Вызов функции Excel VBA с именем переменной - PullRequest
10 голосов
/ 13 сентября 2011

Я пытаюсь вызвать функцию с именем переменной, которая генерируется во время выполнения на основе значения поля со списком.Это просто в большинстве языков, но я не могу понять это в 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

Ответы [ 4 ]

17 голосов
/ 13 сентября 2011

CallByName - это то, что вам нужно для выполнения задачи.

Пример: Код в листе 1

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

Код - Модуль1 (базовый модуль)

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.

1 голос
/ 01 марта 2015

Выше будет работать, но не с большим количеством имен

Использовать Application.Run (MacroName, Параметры)

Вы должны быть уверены, что есть макрос, но он лучше, чем выше, поскольку нет оператора select

0 голосов
/ 01 марта 2015

Что касается моего ответа выше, вы также можете найти это полезным, чтобы проверить, существует ли макрос

'=================================================================================
'- 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 голосов
/ 13 сентября 2011

Вы должны написать функцию, которая принимает значение CB в качестве параметра, а затем использует регистр выбора для вызова соответствующей функции форматирования.

Что-то похожее на это

Function SelectFormatting(Name as String) As Boolean
Select Case CBinst.Value
Case "Text1":
   SelectFormatting = Text1FormattingFunction()
Case "Text2":
   .
   .
   .
End Select
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...