Вопрос:
Заранее спасибо.
Я пытаюсь вызвать функцию, используя имя переменной. Он бросает ошибку
Макрос “testfunc” не найден. Возобновить без ошибок
Мой код: я пробовал ниже трех операторов, но все они бросают ту же ошибку.
sFuncName = «testfunc» ExtractData = Application.Run(«Sheet.xls» & sFuncName, s1, s2) ExtractData = Application.Run(sFuncName, s1, s2) ExtractData = CallByName(«Sheet.xls», sFuncName, VbMethod, s1, s2)
Обратите внимание, что sFuncName возвращает значение & у меня есть 2 Excels, открытых в тот момент, я пытаюсь скопировать данные из одного Excel в другой.
Пожалуйста, помогите мне в этом.
Private Function ABC sFuncName = oMapWksht.Cells(sMapRowItr, 3).Value ‘sFuncName = «testfunc» ExtractData = Application.Run(«Sheet.xls» & sFuncName, s1, s2) ‘ExtractData = Application.Run(sFuncName, s1, s2) ‘ExtractData = CallByName(«Sheet.xls», sFuncName, VbMethod, s1, s2) End Function Public Function testfunc(ByVal s1 As String, ByVal s2 As String) As Boolean — — —- End Function Лучший ответ:
Если функция, которую вы вызываете, находится в той же книге, что и вызывающий, неважно, сколько книг открыто.
Если вызываемая процедура не имеет уникального имени во всем проекте, вам нужно квалифицировать имя функции хотя бы с именем модуля. Это должно заставить вас идти:
Модуль 1 (вызывающий)
Sub DoSomething() Debug.Print Application.Run(«Module2.Test», «Test») End Sub
Модуль2 (вызываемый)
Public Function Test(ByVal title As String) As VbMsgBoxResult Test = MsgBox(«Works?», vbQuestion + vbYesNo, title) End Function Ответ №1
Вы можете использовать переменную String для хранения имени Sub. Ниже приведен пример Sub в том же модуле, что и вызывающий:
Sub MAIN() Dim st As String st = «whatever» Application.Run st End Sub Public Sub whatever() MsgBox «whatever» End Sub
Если вызывающий и вызываемый подсистемы находятся в разных модулях, синтаксис может несколько отличаться.
EDIT # 1:
Если мы хотим вызвать Sub в другом модуле в одной книге, синтаксис будет таким же.
Если мы хотим вызвать Sub в другой книге, и обе рабочие книги открыты, то вызывающий будет выглядеть так:
Sub MAIN() Dim st As String st = «Book2.xlsm!whatever» Application.Run st End Sub
Обычно я объявляю вызванный Sub Public, но я не знаю, если это необходимо.
EDIT # 2
Чтобы использовать другую рабочую книгу UDF() в ячейке рабочего листа, выполните следующие действия:
где qwerty() является Public UDF()