Всплывающее сообщение "Пожалуйста, подождите" - PullRequest
7 голосов
/ 23 декабря 2011

Я пытаюсь создать сообщение Please Wait в Excel VBA.Это напоминает пользователю, обрабатывающему запрос SQL, о том, что процесс все еще продолжается.Я хотел бы, чтобы это сообщение отображалось в пользовательской форме.

В настоящее время пользователь подключается к базе данных SQL, выбирает базу данных и некоторые другие параметры, нажимает кнопку Перейти ... и форма не выгружается.В точке Go у меня есть другая форма, которая появляется с сообщением Please Wait, но эта форма не выгружается, т.е. команда SQL execute не запускается.

Мой код для вызова пользовательской формы Please Wait, включаяметка:

   Call WaitShowSQl.ExecuteCall KillWaitCall WaitShow
   SQl.Execute
   Call KillWait

В другом модуле кода у меня есть:

   Sub WaitShow()
   Wait.Show
   End Sub

   Sub KillWait()
   Unload Wait
   End Sub

У меня есть пользовательская форма с именем wait со следующим кодом:

Private Sub UserForm_Activate()
Call PleaseWait
End Sub 

Sub PleaseWait()
Wait.Label1.Caption = "Calculating...Please Wait!"
End Sub

Теперь, когдапри выполнении кода среда выполнения не перемещается назад через модуль для выполнения следующего:

SQl.ExecuteSQl.Execute

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

Ответы [ 4 ]

6 голосов
/ 23 декабря 2011

Поведение по умолчанию метода Form.Show - показ формы в виде модального диалога.То, что вы ищете, это немодальное диалоговое окно, поэтому вам нужно указать его, например:

Sub WaitShow()
   Wait.Show vbModeLess
End Sub

Обновление:

Если вы не можете использовать немодальное диалоговое окно, у васдругие варианты, как указано в комментарии.Один из них - позволить пользовательской форме ожидания выполнить SQL.Это можно сделать так:

В форме ожидания сначала объявите переменные

Private mySomeParameter1 As String
Private mySomeReturnValue1 As String

'Input parameters to the form
Public Sub Init(ByVal some_parameter1 As String, ...)
... Initialize your SQL, NOT execute it
End Sub

'Output values from the from
Public Sub GetReturns(ByRef some_return_value1 As String, ...)
... set the output parameters...
End Sub

'Do the work
Private Sub UserForm_Activate()
  Call PleaseWait
  'Either call DoEvents or a manual Refresh to let the label display itself
  Call ExecutSQL    ' A function that executes the SQL
  Unload Me
End Sub

И в основной форме:

Sub WaitShow()
   Wait.Init(the parameters...)
   Wait.Show
   Wait.GetReturns(the results...)
End Sub

Еще один вариант для васбыло бы полностью пропустить форму ожидания и вместо этого показать изображение «Ожидание» в основной форме и скрыть его после завершения обработки SQL.

1 голос
/ 29 мая 2012

Вот как показать индикатор выполнения, пока ваши пользователи ожидают завершения обработки в Excel:

https://stackoverflow.com/a/10791349/138938

Excel progress bar

В вашем случае вы можете угадать разумное «среднее» время для ваших запросов и обновить индикатор выполнения в процентах от этого времени, что убедит ваших пользователей в том, что Excel работает, и им не нужно паниковать.

0 голосов
/ 07 марта 2018

Я использую командную кнопку в форме, установленной на очень маленький размер, скрытую при загрузке формы, с надписью «Пожалуйста, подождите, обработка ...»событие (я просто изменяю размер до размера формы, используя свойства top, left, width & height).Вы, конечно, можете сделать его любым размером, который вам нравится.

Я делаю командную кнопку видимой непосредственно перед моим трудоемким кодом и делаю ее скрытой снова в конце кода.DoEvents ", но отлично работает.

0 голосов
/ 16 декабря 2013

Мое решение гораздо менее элегантно и впечатляюще, чем другие.К вашему сведению, мой сценарий выполняет обработку для ряда партнеров в цикле FOR ... NEXT, и я хочу обновить экран с обрабатываемым в данный момент партнером.

Я создал вкладку рабочего листа под названием «Сообщения»,Я расширил ячейку A1 настолько широко и высоко, насколько мог, и выбрал шрифт, который мне понравился, и цветовую гамму, которая мне понравилась.Мой скрипт начинается с отключения ScreenUpdating.Я тогда

Sheets("Messages").Select
Cells(1, 1).Value = "Processing " & Partner
Application.ScreenUpdating = True
Application.ScreenUpdating = False

После этого я возвращаюсь на тот лист, который мне нужен.Ничего особенного, но это быстро, легко и делает то, что мне нужно.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...