2009-07-07 4 views
2

У меня есть публичную функцию в виде доступамс-VBA доступ к функции Eval поведение

Public Function PopupProcess() as long 
    MsgBox Me.ActiveControl 
    PopupProcess = 1 
End Function 

Когда я называю

eval("forms('MyForm').popupprocess") 

он показывает окно с сообщением 2 раза. Кто-нибудь знает, почему это так?

У меня есть доступ 2003 с SP3.

EDIT: Основная идея - вызывать функцию из этой формы для пользовательского управления CommandBanAction. Возможно, у вас есть лучший способ вызвать функцию из формы для управления командной строкой.

+1

Есть ли другая функция в форме, которая также может вызывать функцию? Например, если вы добавите пустую функцию в форму (например, «Public Function DoesNothing») и вызовите eval («forms (« MyForm »). DoesNothing»), вы получаете окно сообщения? – anschauung

ответ

8

Это очень долго стоять ошибка, которая была вокруг со времен доступа 97, (около 4-5 версий доступа).

Решения здесь НИКОГДА не используйте форму спецификатора, просто поместите его в вашем на действие события, и вы будете просто отлично

=PopUpProcess() 

Обратите внимание, что вы должны предшествовать его с = и суффикс должен иметь скобки()

Имейте в виду, что вы можете использовать поведение в своих интересах. Функция, которая запускается, будет из формы, которая в настоящее время фокусируется на экране. Это означает, что у вас могут быть разные формы с одним и тем же именем функции, и в зависимости от того, какая форма имеет фокус, функция с этим именем будет запускаться из этого модуля кода формы.

Еще лучше, если одна из форм не имеет этой функции как общедоступной в модуле кода форм, то используется функция в стандартном модуле кода. Таким образом, у вас может быть девять форм, которые используют стандартную одну функцию в основном стандартном модуле кода. Тем не менее, для 10-й формы может потребоваться запуск специального кода, поэтому вы просто помещаете этот код функции в модуль кода формы как общедоступный, и он будет запускаться вместо публики в стандартном модуле кода.

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

Чтобы решить вашу проблему, просто не используйте квалификатор формы и используйте вышеуказанный формат.

Обратите внимание, что вы можете передать параметры из этих функций также, например

=PopUpProcess(‘hello’) 

А потом объявить функцию как:

Public Function PopUpProcess(strParm as string) 

Имейте в виду, что функции и синтаксис, и все то, что Я уже говорил выше, когда вы используете действие on в ленте для доступа 2007.

+0

+1. хороший ответ –

+0

Очень приятно! Но у меня создается впечатление, что Access 2007 имеет измененное поведение и что публичные функции формы больше не используются вне VBA (например, как источник вычисленного элемента управления). Может кто-нибудь подтвердить? –

+0

Я не знаю никаких изменений в этом поведении в отношении 2007 года. Для публичной функции в форме, называемой mytest, then = mytest() может быть источником элемента управления в этой форме. Вы все равно должны использовать общедоступное ключевое слово, и мы принимаем форму, которая имеет текущий фокус. Насколько я могу судить, я не вижу каких-либо разных способностей в том, как это работает в 2003 году, или в 2007 году. –

1

Не знаю. Что произойдет, если вы назовете это так?

Call Forms("MyForm").PopupProcess 

Попробуйте использовать функцию CallByName вместо eval для вызова вашей функции. Он должен только огонь вашей функции один раз, и он будет по-прежнему позволяют спараметрировать имя формы и функции или суб имя:

CallByName Forms("MyForm"), "PopupProcess", VbMethod 
+0

Вышеуказанное не может работать в этом случае. Плакат говорит о настраиваемых панелях меню, а не о кнопке в форме. В пользовательских полосах меню у вас есть только параметр onAction, и для вызова вашего кода вы должны использовать выражение, а не «Call subname». –

+0

Вы можете вызвать публичную функцию, которая вызывает функцию в форме. –

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