2011-12-07 40 views
3

我有一些需要在連續階段向用戶發送通知的漫長過程,所以他不會相信Excel已經崩潰了。如何在漫長的過程中通知用戶?

如何使用VBAExcel中向用戶顯示異步消息?

+0

我使用窗體顯示進度信息。 [看我對這個問題的回答] [1] [1]:http://stackoverflow.com/questions/8360981/find-worksheet-name-and-row-number-for-an-excel-workbook/8367240#8367240 –

+1

除了其他人提出的建議之外,我還建議在執行過程中更改光標:Application.Cursor = xlWait – JimmyPena

回答

8

您可以使用Excel中的狀態欄要做到這一點:

Application.StatusBar = "status message" 

這裏是如何實現這樣一個例子:http://www.vbaexpress.com/kb/getarticle.php?kb_id=87

下面是從網站(添加換行的代碼使更容易閱讀):

Sub StatusBar() 

Dim x As Integer 
Dim MyTimer As Double 

'Change this loop as needed. 
For x = 1 To 250 
    'Dummy Loop here just to waste time. 
    'Replace this loop with your actual code. 
    MyTimer = Timer 
    Do 
     Loop While Timer - MyTimer < 0.03 
     Application.StatusBar = _ 
     "Progress: " & x & " of 250: " & Format(x/250, "Percent") 
    DoEvents 
Next x 

Application.StatusBar = False 

End Sub 

UPDATE: 我想補充一點,updat狀態欄會在性能上產生相當大的影響(實際上相當多),所以您應該只在適當的時間間隔更新它。下面是我的意思的例子(我用MOD這裏,以確保我們只增加各1000):

Sub test() 

Dim i As Long 
Dim temp As String 

For i = 1 To 1000000 
    temp = "testing 123, testing 123" 
    If i Mod 1000 = 0 Then 
     Application.StatusBar = "Processing " & i & "/1,000,000..." 
    End If 
Next 

Application.StatusBar = "Ready" 

End Sub 

另外請注意,要文字重置爲「就緒」,否則它會被剩下來,好象它在循環中。

+1

儘管......很容易忽視,但實際上並沒有多少人注意到狀態欄。但如果你知道它在那裏,並期望它顯示有用的信息,這是一個好方法。 –

+0

是的,另一種方法是你可以通過製作窗體顯示狀態的麻煩。但是如果有人正在使用一個擁有巨大宏的文件,他們應該知道狀態欄,或者以某種方式知道它。 – aevanko

+0

確實有些人可能不希望狀態欄是「應用程序相關的」。他們可能被用來在Excel中打印通用的東西,不是嗎? – Jerome

2

下面的文章有許多這樣做的方法:http://oreilly.com/pub/h/2607

我想你應該是展示一個進步的形式最好的選擇。這可以包括進度條和文本更新以保證用戶的安全。

0

我不知道你想用你的解決方案走多遠,但你可以利用RTD function。這樣你可以直接在工作表中放置一個狀態消息。但是它需要開發一個COM Automation服務器,這個服務器並不複雜(可以用.NET或VB6或C++或Delphi編寫),但是會在生產(部署,支持,代碼控制等)時導致問題。

4

我一直堅持Walkenbach's progress form我的加載項

enter image description here

+0

看起來很酷且安全。但是,我大部分時間都在使用三個屏幕以及我的用戶。此刻,當我下載示例時,彈出式窗口有時會打印到具有活動Excel的窗口上。任何想法如何解決,因爲你知道這件作品相當好? – Jerome

+0

@jeromeG當你說三個屏幕時,你的意思是你有3個文件在一個Excel實例中打開,分佈在三個屏幕上?或者3個獨立的Excel運行實例? – brettdj

+0

我的意思是我有3個物理屏幕,並且在一個屏幕上打開一個Excel實例。有趣的是,當我打開VBE時,彈出窗口將始終顯示在顯示VBE的屏幕上。如果我將VBE移動到另一個屏幕,則彈出窗口將在下一次顯示。 Excel所在的屏幕不影響任何內容。關閉VBE後,彈出窗口繼續顯示在VBE所在的最後一個屏幕上。那麼問題是,當實際的Excel在左邊的屏幕上時,我不希望彈出窗口離開它兩個屏幕:D – Jerome

1

事情我一次也就是創建一個名爲「暗戰」一個額外的標籤。 每消耗一次循環後,我將下面的代碼添加到更新的文本信息中。

儘管文本有時會變得太快,但更改的顏色條顯示用戶腳本仍在運行。您必須首先定義AlertColor,值爲6.

Sheets("Running").Select 'Show the running page 

Range("B18").Value = "Importing ABC......" 

Cells(18, 2).Interior.ColorIndex = AlertColour 

AlertColour = AlertColour + 1 

If AlertColour > 8 Then AlertColour = 6 

Application.ScreenUpdating = True 

Application.ScreenUpdating = False 
相關問題