Outlook VBA宏:指示“请稍候”的最佳方式

时间:2010-02-06 01:44:13

标签: vba outlook hourglass

向用户指示宏在Outlook中运行的最佳做法是什么? 宏可能需要大约1-30秒才能完成。

我想避免在运行宏之前弹出一个模态'msgbox',因为这可能很烦人。

如果可能的话,我宁愿避开沙漏光标,并想知道是否有更好的方法。

有没有办法在宏运行时放置非模态“状态”消息?

(我针对当前选择的mailItem运行的宏 - 它是通过快速访问工具栏上的按钮启动的。)

3 个答案:

答案 0 :(得分:3)

关于最佳做法的

This articlealso this)说使用状态栏。

Outlook上的

This article说:

  

更改状态栏
  没有   改变状态栏文本的方法   Microsoft Outlook。状态栏是   没有暴露在其他地方   Microsoft Office对象模型。

Outlook.com提供code for a progress box

答案 1 :(得分:2)

令人印象深刻的事情,我相信其他人也会有想法。

1.如果您无法报告进度,请在其上显示一个带有进度条的表单,该表单会报告进度或者在marque模式下具有进度条 2.用一个带有你最喜欢的动画GIF的图片框显示一个表格(spinny pizza等)。你可以关掉按钮等。 3.使用win api来玩outlook staus bar

不知道你在宏中做了什么,你可能不得不处理保持“在顶部”的形式并将异步进程引入其中​​。

干杯

马库斯

答案 2 :(得分:0)

扩展@ 76mel的答案,一个很好的方法是使用非模态用户表单。只需一个标签和标题就可以让事情变得非常简单:EG status

我喜欢将userform设置为:

  • 非模态(在属性 F4 中,将ShowModal设置为false)
    • 这意味着您可以在状态栏外单击,但不会阻止您。
  • 我将StartupPosition设置为0-Manual,将TopLeft设置为100,以便状态窗体显示在屏幕的左上角(默认情况下出现在中心的任何其他消息的方式)

将标签的value设置为Userform首次加载时的默认文本

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实例中使用它,则必须将userform重置为其默认值 也可以选择使用它

'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

在userform代码本身中始终保持最佳状态