Закрыть текущий открытый MsgBox с помощью кода - PullRequest
3 голосов
/ 16 июля 2009

Есть ли возможность закрыть открытый MsgBox, используя какой-либо код в приложении формы доступа VBA? \

Ответы [ 8 ]

6 голосов
/ 16 июля 2009

Ознакомьтесь с ответом Рэнди Берча на этой ветке в microsoft.public.vb.general.discussion

Он рекомендует создать функцию в файле .bas с именем MsgBox. Это заставит VB вызывать вашу функцию, а не встроенную.

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

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

Примечание: я никогда не делал этого, но я обнаружил, что Рэнди Бёрч - осведомленный ресурс.

1 голос
/ 02 февраля 2016

Раньше у меня был простой ответ на этот вопрос: используйте объект Windows Scripting Shell, который имеет функцию «Popup» - окно сообщений, как и функцию VBA MsgBox (), с параметром SecondsToWait, который обеспечивает точно время ожидания, которое вы хотели.

With CreateObject("Scripting.WsShell")
    .Popup "Watch me disappear in 5 seconds", 5, Application.Name & ": test", vbInformation + vbOkCancel
End With

Если вы включите кнопку «Отмена», она может по-прежнему работать: доступны следующие параметры: vbOkCancel, vbYesNoCancel и vbRetryCancel.

Если вы пытаетесь закрыть диалоговое окно, которое вы не открыли своим собственным вызовом функции msgBox (), это бесполезно: и, как я уже говорил, параметр SecondsToWait на самом деле не работает, дни - кому-то в Редмонде действительно не нравится идея, что один поток закрывает полезные предупреждения другого потока и важные прерывания рабочего процесса пользователя.

Однако вы можете запустить отложенную команду «Закрыть» окна сообщений, используя функцию API Timer () - не совсем 'закрыть текущий открытый MsgBox' , так как для этого требуется предварительное предупреждение о том, что вы намеревались открыть это - но это самое близкое, что у меня есть, оно вписывается в автономный модуль VBA, и Я отправил код в ответ на очень похожий вопрос StackOverflow к вашему .

Я должен предупредить вас, что в данном ответе используется кувалда, чтобы расколоть гайку, с подробным объяснением в боковом порядке.

1 голос
/ 17 июля 2009

Как отмечает MarkJ, может ли это быть диалог, сгенерированный Access (а не VBA.MsgBox, вызываемый в вашем собственном коде)?

Например, при использовании таблицы «dataview» в пользовательском интерфейсе Access для добавления строки вы получаете сообщение «Вы собираетесь добавить 1 запись ...» (или подобное). Это то, что вы имеете в виду? Если так, то действительно есть способы их подавить ...

1 голос
/ 16 июля 2009

MsgBoxes не предназначены для программного закрытия, поэтому это трудно сделать. Если вы оказались в проекте, где вы должны принудительно закрыть MsgBox, вам, вероятно, следует пересмотреть свой дизайн.

1 голос
/ 16 июля 2009

Я могу ошибаться, но MsgBox - это блокирующий вызов, создающий модальную форму, поэтому я не думаю, что есть простой способ, например, сделать это. У вас есть конкретный вариант использования для этого?

0 голосов
/ 22 июля 2009

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

Вы можете использовать sendkeys или win API.

Спасибо, pkrg

0 голосов
/ 22 июля 2009

У меня похожая проблема, и теоретически вы можете использовать функцию «SendKeys» (см. http://msdn.microsoft.com/en-us/library/8c6yea83%28VS.85%29.aspx).. Однако MsgBox блокирует запуск, поэтому вы не можете использовать команду. Если вы знаете, когда она появится, вы можете запустить (из скрипта) внешний whshell, который ждет некоторое время, а затем использует SendKeys. Но если вы знаете, как это сделать, скажите мне (здесь). Другая похожая возможность - открыть для него другой поток / процесс, который не будет блокироваться. , но я не знаю, возможно ли это в VBA.

Одед

0 голосов
/ 16 июля 2009

Вместо того, чтобы писать альтернативу Access MsgBox с нуля, вы можете подумать об использовании (или хотя бы изучить) Arvin Meyer Custom MessageBox Creator (можно загрузить на на этой странице ).

...