2010-02-06 46 views
3

向用戶指示宏在Outlook中運行的最佳做法是什麼? 該宏可能需要大約1-30秒才能完成。Outlook VBA宏:指示'請稍等'的最佳方式

我想避免在運行宏之前彈出一個模式'msgbox',因爲這可能很煩人。

我寧願避免沙漏光標,如果可能的話,並想知道是否有更好的方法。

在宏運行時,是否有一種方法可以將非模態「狀態」消息向上放置?

(我已經對當前選定的mailItem運行的宏 - 它通過快速訪問工具欄上的按鈕啓動)。

回答

3

This articlealso this)最佳做法表示使用狀態欄。

This article上展望說:

更改狀態欄
沒有改變 Microsoft Outlook中的狀態欄文字 方式。狀態欄是 未公開,因爲它在其他 Microsoft Office對象模型中。

Outlook.com提供code for a progress box

+0

用戶窗體重置爲默認值Remou,你是正確的狀態欄沒有通過OOM暴露,但你可以使用Win Api來操縱它。 – 76mel 2010-02-06 13:02:48

2

幾個字符串的思想,我相信其他人也會有想法。

1.如果您無法上報進度,請在進度條上顯示進度條或報告進度條的進度條 2.使用帶有您最喜愛的動畫gif的圖片框菠菜披薩等)。您可以關閉按鈕等。 3.使用win api與outlook staus一起玩

不知道你在宏中做什麼,你可能不得不處理保持窗體「在頂部」並抽水異步進展。

乾杯

馬庫斯

0

擴展@ 76mel的答案,一個很好的方法是使用非模態用戶窗體。使事情只是一個標籤和標題像這樣很簡單:EG status

我喜歡做的是有用戶窗體設置爲:

  • 非模態(F4在屬性中,設置ShowModal爲false)
    • 這意味着你可以點擊狀態欄外部,它不會阻止你。
  • 我設置StartupPosition0-ManualTopLeft爲類似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 

,以保持它的頂部始終