2016-12-19 2 views
5

В VBA вы можете позвонить своим методам/функциям с помощью Call, чтобы сообщить компилятору, что вы не хотите использовать возвращаемое значение, если оно есть.Почему я не могу использовать Call infront of DoEvents?

Теперь DoEvents function также можно вызвать через Call, но я не могу этого сделать.

Когда я типа:

Call DoEvents 

это просто говорит "ошибка синтаксиса" при компиляции.

Почему я не могу использовать Call infront от DoEvents?


Использование VBA из VBE в Excel 2016, IIRC он также не работает в 2013, 2010 и т.д.

+0

Я не думаю, что вы можете позвонить любому члену класса взаимодействия VBA (Environ, MsgBox и т. Д.) –

+0

@JiminyCricket 'Call MsgBox (« Test », vbOKOnly)' определенно работает. 'DoEvents' является первым (функция?) Я наткнулся на это, не позволил мне« позвонить » – Mafii

+0

Ах, я пробовал использовать его в качестве подзона MsgBox« Тест »не работает. Лучше всего не использовать Call и просто использовать DoEvents. Я использовал это как общую практику для всех подсистем и функций, поскольку он сокращает код/​​визуальный беспорядок. –

ответ

3

tldr; Вы можетCall это, но только явно из модуля VBA.

В документации, связанной с помощью @ Gary'sStudent (see the application agnostic version here) указывает, DoEvents на самом деле Function не Sub, и он всегда будет возвращать 0 в VBA. В unhosted Visual Basic (т. Е. VB6) он возвращает общее количество открытых окон. Мое совершенно необоснованное предположение о том, что , почему возвращает 0, заключается в том, что в VBA окно верхнего уровня процесса, в котором выполняется код, не принадлежит исполняемому вами коду.

Сама функция находится в VBA.Interaction модуле, как вы можете видеть в обозревателе объектов:

DoEvents in the Object Browser

Тем не менее, следует отметить, что можно использовать функцию DoEvents предшествуют в Call ключевое слово - но вы должны явно указать VBA сборки:

Sub Example() 
    'This is perfectly fine. 
    Call VBA.DoEvents 
End Sub 

Опять же, это просто предположение, но я подозреваю, что причина связана с внутренней реализацией. Обычно это вызывает функцию SwitchToThread (которую импортирует vbe7.dll). Но характер возвращаемого значения указывает на перечисление окон, которые получают , до, поэтому для запуска, вероятно, нужен только дескриптор VBA. Существует нет ничего в TypeLib, что наводит на мысль, что это отличается от любых других функций в модуле Interaction (хотя может быть флаг, который я пропустил где-то):

[entry(598), helpcontext(0x000f7900)] 
short _stdcall DoEvents(); 

природа из ошибка компиляции «Ожидаемый: идентификатор» означает, что есть что-то внутреннее, которое «скрывает» DoEvents от общедоступных функций VBA.


Конечная нота: Синтаксис Call Foo совершенно излишни - все это делает явно отбросить возвращаемое значение функции.Не , присваивая, возвращаемое значение делает то же самое.

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