向用户指示宏在Outlook中运行的最佳做法是什么? 宏可能需要大约1-30秒才能完成。
我想避免在运行宏之前弹出一个模态'msgbox',因为这可能很烦人。
如果可能的话,我宁愿避开沙漏光标,并想知道是否有更好的方法。
有没有办法在宏运行时放置非模态“状态”消息?
(我针对当前选择的mailItem运行的宏 - 它是通过快速访问工具栏上的按钮启动的。)
答案 0 :(得分:3)
This article(also this)说使用状态栏。
Outlook上的更改状态栏
没有 改变状态栏文本的方法 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的答案,一个很好的方法是使用非模态用户表单。只需一个标签和标题就可以让事情变得非常简单:
我喜欢将userform设置为:
ShowModal
设置为false)
StartupPosition
设置为0-Manual
,将Top
和Left
设置为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代码本身中始终保持最佳状态