Outlook VBA Macro: лучший способ указать «пожалуйста, подождите» - PullRequest
3 голосов
/ 06 февраля 2010

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 06 февраля 2010

Эта статья ( также эта ) о лучших практиках гласит: используйте строку состояния

Эта статья в Outlook гласит:

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

Outlook.com предоставляет код для поля прогресса .

2 голосов
/ 06 февраля 2010

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

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

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

Приветствия

Марк

0 голосов
/ 05 июня 2017

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

Мне нравится, когда пользовательская форма установлена ​​как:

  • Немодально (в свойствах F4 , установить ShowModal в false)
    • Это означает, что вы можете щелкнуть за пределами строки состояния, и это не остановит вас.
  • Я установил 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

Обратите внимание, как и в случае с Application.Statusbar в Excel, вы должны сбросить пользовательскую форму до значения по умолчанию, если вы планируете использовать ее позже в том же экземпляре 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

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

...