Вызов Sub или Function, содержащейся в модуле, с использованием «CallByName» в VB / VBA - PullRequest
8 голосов
/ 23 апреля 2010

Легко вызвать функцию внутри classModule, используя CallByName Как насчет функций внутри стандартного модуля?

''#inside class module
''#classModule name: clsExample
  Function classFunc1()
     MsgBox "I'm class module 1"
  End Function
''# 
''#inside standard module
''#Module name: module1
  Function Func1()
     MsgBox "I'm standard module 1"
  End Function
''#
''# The main sub
Sub Main()
''# to call function inside class module
dim clsObj as New clsExample
Call CallByName(clsObj,"ClassFunc1")

''# here's the question... how to call a function inside a standard module
''# how to declare the object "stdObj" in reference to module1?
Call CallByName(stdObj,"Func1") ''# is this correct?

End Sub

Ответы [ 4 ]

4 голосов
/ 24 октября 2012

Я думаю, что ответ jtolle лучше всего отвечал на этот вопрос - небольшая ссылка на Application.Run может быть ответом.Спрашивающий не хочет использовать просто func1 или Module1.func1 - причина, по которой в первую очередь нужно использовать CallByName, заключается в том, что желаемое имя function.sub не известно во время компиляции.В этом случае Application.Run работает, например:

Dim ModuleName As String
Dim FuncName As String
Module1Name = "Module1"
FuncName = "func1"
Application.Run ModuleName & "." & FuncName

Вы также можете добавить имя проекта перед именем модуля и добавить еще один период ".".К сожалению, Application.Run не возвращает никаких значений, поэтому, пока вы можете вызывать функцию, вы не получите ее возвращаемое значение.

2 голосов
/ 23 апреля 2010

CallByName работает только с объектами класса.

Если ваша подпрограмма находится в стандартном модуле, вы можете сделать это:

Sub Main()
    Module1.Func1
End Sub

Если это функция, то вы, вероятно, захотитезахватить возвращаемое значение;как то так:

Sub Main()
    Dim var
    var = Module1.Func1
End Sub
1 голос
/ 04 сентября 2013

Модули в VB6 и VBA - это что-то вроде статических классов, но, к сожалению, VB не принимает Module1 в качестве объекта. Вы можете написать Module1.Func1 как C.Func1 (C является экземпляром некоторого Class1), но это, очевидно, выполняется компилятором, а не во время выполнения.

Идея: преобразовать Module1 в класс, создать «Public Module1 as Module1» в вашем Startup-модуле и «Set Module1 = New Module1» в вашем «Sub Main».

0 голосов
/ 17 июля 2013

К сожалению, невозможно добавить ProjectName перед ModuleName и добавить еще один период "." В MS Word это вызывает ошибку времени выполнения 438. Вызов ограничивается использованием просто ModuleName.ProcName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...