Ожидание действия OLE — автоматический «щелчок» ok?

#excel #vba

#excel #vba

Вопрос:

Существует множество потоков, связанных с VBA, ожидающих действия OLE, но большинство из них, похоже, по крайней мере немного отличаются от моих, Что приводит к возможным сбоям и т. Д.

Я использую Excel VBA и COM api для некоторого тестирования стороннего приложения (в основном перебираю тысячи файлов, передаю команду другому приложению и двигаюсь дальше). Я периодически получаю сообщение «Ожидание действия OLE», и когда оно появляется, все, что мне нужно сделать, это нажать кнопку «ОК», и все возобновляется, как ожидалось.

Я не думаю, что подавление сообщения — это то, чего я хочу, я думаю, это просто приведет к зависанию моего кода, но есть ли способ, которым я могу имитировать «нажатие ok» при возникновении ошибки? Или я застрял в этом коде?

Ответ №1:

Вы могли бы попробовать добавить Application.DisplayAlerts = False ?

Вы можете попробовать использовать Application.Wait или WinAPI Sleep , чтобы замедлить процесс.

Вы также можете попробовать использовать VBA DoEvents , чтобы убедиться, что ОС обрабатывает другие события.

Ответ №2:

Можно использовать COM API для удаления фильтра сообщений VBA. Я впервые нашел это здесь. Затем он использовался в некоторых других потоках. Я покажу вам объявление API, которое будет использоваться для 64-разрядного Office:

  1. Скопируйте этот код поверх стандартного модуля (в область объявлений):
 Private Declare PtrSafe Function CoRegisterMessageFilter Lib "OLE32.DLL" _
              (ByVal lFilterIn As Long, ByRef lPreviousFilter) As LongPtr
  
  1. Скопируйте следующий код в тот же модуль:
 Sub KillMessageFilter()  'Original script Rob Bovey   
    '''https://groups.google.com/forum/?hl=en#!msg/microsoft.public.excel.programming/ct8NRT-o7rs/jawi42S8Ci0J

    Dim lMsgFilter As Long

    ''' Remove the message filter before calling Reflections.
    CoRegisterMessageFilter 0amp;, lMsgFilter

    ''' Call your code here!!!

    ''' Restore the message filter after calling Reflections.
    CoRegisterMessageFilter lMsgFilter, lMsgFilter
End Sub
  

Но вы должны знать, что если процесс действительно был заблокирован по какой-либо причине, это не позволит вам получать какие-либо уведомления об этом

Комментарии:

1. @Mykenk: Вы нашли время, чтобы протестировать вышеупомянутое предложение?