Макрос Outlook VBA:Лучший способ указать "пожалуйста, подождите"

StackOverflow https://stackoverflow.com/questions/2211642

  •  18-09-2019
  •  | 
  •  

Вопрос

Как лучше всего указать пользователю, что макрос запущен в Outlook?Выполнение макроса может занять около 1-30 секунд.

Я хочу избежать появления модального "msgbox" перед запуском макроса, так как это может раздражать.

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

Есть ли способ разместить немодальное сообщение "статус" во время выполнения макроса?

(Макрос, который у меня есть, запускается против выбранного в данный момент почтового элемента - и он запускается кнопкой на панели быстрого доступа).

Это было полезно?

Решение

Эта статья (также это) в разделе "Лучшая практика" сказано использовать строку состояния.

Эта статья в Outlook говорится:

Изменение строки состояния
Нет способа изменить текст строки состояния в Microsoft Outlook.Строка состояния не отображается, как в других объектных моделях Microsoft Office.

Outlook.com обеспечивает код для окна выполнения.

Другие советы

Пара вещей, которые приходят на ум, я уверен, что у других тоже найдутся идеи.

1. Покажите форму с индикатором выполнения, в которой сообщается о ходе выполнения, или если вы не можете сообщить о ходе выполнения, индикатор выполнения отображается в режиме marque 2. Покажите форму с графическим полем с вашим любимым анимированным gif-файлом внутри (spinny pizza и т.д.).Вы можете отключить кнопки и т.д.3.Используйте win api, чтобы начать работу с панелью управления Outlook

Не зная, что вы делаете в своем макросе, вам, возможно, придется иметь дело с сохранением формы “Сверху" и закачкой в нее асинхронного прогресса.

Ваше здоровье

Маркус

Развивая ответ @76mel, хороший способ сделать это - использовать немодальную пользовательскую форму.Сделайте что-нибудь действительно простое, используя только ярлык и подпись, подобную этой: EG status

Что мне нравится делать, так это устанавливать пользовательскую форму как:

  • Немодальный (в свойствах 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

в самом коде пользовательской формы, чтобы всегда держать его на высоте

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top