2014-02-13 2 views
4

У меня есть два модуля. В одном модуле я хочу косвенно использовать вспомогательный модуль из другого модуля. Согласно MS и множеству онлайн-ресурсов, это должно работать, но это не так. В чем может быть проблема?Application.run не работает с модулем

'Module: "Helpers" 

Public Sub ubTest() 
    MsgBox "ubTest is called" 
End Sub 


'Another Module -> I also tried this from a form and a class... 

Public Sub test() 
    Dim s As String 
    Helpers.ubTest    'works 

    s = "ubTest" 
    Application.Run s  'works 

    s = "Helpers.ubTest" 
    Application.Run s  'doesn't work 

End Sub 

(Очевидно, это тест - в реальном приложении у меня будет несколько модулей и не всегда есть контроль над именами процедур - так что я должен использовать модуль префикс)

Я пытался/декомпилировать и скомбинировать базу данных - тоже не повезло.

+3

Возможно, ошибка в ошибке? 's =" Helpers.ubTest "' в вашем вопросе у вас есть 's =" Helpes.ubTest "' – hstay

+0

Извините за орфографию. Нет, просто так не работает, но я все же нашел подходящее решение. Только то, что я ответил HansUp – Johanness

ответ

2

Доступ Application.Run Метод раздел справки говорит это о Имя параметра:

«Если вы вызываете процедуру в другую базу данных использовать имя проекта и имя процедуры, разделенные точкой в форме: «projectname.procedurename».

Так что я думаю, когда вы поставляете "modulename.procedurename" (т.е. «Helpers.ubTest»), доступ думает ваш имя_модуля это имя проекта VBA. Так как он не может найти проект под названием Помощники, он выдает ошибку # 2517, «... не может найти процедуру" Helpers.ubTest.»

К сожалению, я не могу найти способ сделать то, что я думаю, вы хотите с Application.Run. Я надеялся, что "projectname.modulename.procedurename" будет работать, но это также вызвало ошибку 2517.

+0

Спасибо HansUp. Я охотился за ошибкой больше часа. По-видимому, в MSDN есть разные страницы справки для одного офиса (где вы находите «слово» в пути) и отдельный для доступа. На странице доступа ничего не говорится о параметре модуля. (Хотя вы найдете некоторые ресурсы доступа в Интернете, которые утверждают, что есть один). Я прибегну к методу вызова в каждом модуле под названием «Helpers_CallbackRunner», который затем я могу позвонить с помощью «Application.run modulename &» CallbackRunner », SubName – Johanness

Смежные вопросы