Макрос Outlook VBA:Лучший способ указать "пожалуйста, подождите"
Вопрос
Как лучше всего указать пользователю, что макрос запущен в Outlook?Выполнение макроса может занять около 1-30 секунд.
Я хочу избежать появления модального "msgbox" перед запуском макроса, так как это может раздражать.
Я бы предпочел избегать курсора в виде песочных часов, если это возможно, и подумал, есть ли способ получше.
Есть ли способ разместить немодальное сообщение "статус" во время выполнения макроса?
(Макрос, который у меня есть, запускается против выбранного в данный момент почтового элемента - и он запускается кнопкой на панели быстрого доступа).
Решение
Эта статья (также это) в разделе "Лучшая практика" сказано использовать строку состояния.
Эта статья в Outlook говорится:
Изменение строки состояния
Нет способа изменить текст строки состояния в Microsoft Outlook.Строка состояния не отображается, как в других объектных моделях Microsoft Office.
Outlook.com обеспечивает код для окна выполнения.
Другие советы
Пара вещей, которые приходят на ум, я уверен, что у других тоже найдутся идеи.
1. Покажите форму с индикатором выполнения, в которой сообщается о ходе выполнения, или если вы не можете сообщить о ходе выполнения, индикатор выполнения отображается в режиме marque 2. Покажите форму с графическим полем с вашим любимым анимированным gif-файлом внутри (spinny pizza и т.д.).Вы можете отключить кнопки и т.д.3.Используйте win api, чтобы начать работу с панелью управления Outlook
Не зная, что вы делаете в своем макросе, вам, возможно, придется иметь дело с сохранением формы “Сверху" и закачкой в нее асинхронного прогресса.
Ваше здоровье
Маркус
Развивая ответ @76mel, хороший способ сделать это - использовать немодальную пользовательскую форму.Сделайте что-нибудь действительно простое, используя только ярлык и подпись, подобную этой:
Что мне нравится делать, так это устанавливать пользовательскую форму как:
- Немодальный (в свойствах F4, установить
ShowModal
к ложному)- Это означает, что вы можете щелкнуть за пределами строки состояния, и это вас не остановит.
- Я установил
StartupPosition
Для0-Manual
иTop
иLeft
примерно до 100, чтобы форма статуса отображалась в верхнем левом углу экрана (вне поля зрения любых других сообщений, которые по умолчанию отображаются в центре)
Установите значение метки value
к некоторому тексту по умолчанию при первой загрузке пользовательской формы
Public strStatus As String
Public Const defaultStatus As String = "Default status text" 'set this to whatever you want
Sub statusReporter()
frmStatus.Show
'''
'Your code here
'''
frmStatus.lblStatus = "Step 1"
'...
frmStatus.lblStatus = "Step 2"
'...
'''
'Unload the form
'''
frmStatus.lblStatus = defaultStatus
frmStatus.Hide
End Sub
Обратите внимание, как и в случае с Excel Application.Statusbar
вы должны вернуть пользовательской форме значение по умолчанию, если планируете использовать ее позже в том же экземпляре Excel
При необходимости используйте и это
'Written By RobDog888 - VB/Office Guru™
'Add a Command Button so you can toggle the userform's topmost effect
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" ( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private mlHwnd As Long
Private Sub UserForm_Initialize()
Dim overTim As Single
overTim = Timer
mlHwnd = FindWindow("ThunderDFrame", "Status") 'Change "Status" to match your userforms caption
Do While mlHwnd = 0 And Timer - overTim < 5
mlHwnd = FindWindow("ThunderDFrame", "Status")
DoEvents
Loop
'Set topmost
SetWindowPos mlHwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub
в самом коде пользовательской формы, чтобы всегда держать его на высоте