2011-12-23 117 views
7

我試圖在Excel-VBA中創建一個Please Wait消息。這是爲了提醒用戶處理一個sql查詢,該進程仍在進行中。Excel VBA「Please Wait」彈出消息

我想這個消息顯示在用戶窗體中。

目前,用戶連接到SQL數據庫,選擇數據庫和其他一些選項,按下Go ...並且表單不會卸載。在Go處,我有另一種彈出消息Please Wait的窗體,但是這種形式不會卸載,即sql execute命令不會運行。

我對調用Please Wait用戶窗體,包括標籤代碼:

Call WaitShowSQl.ExecuteCall KillWaitCall WaitShow 
    SQl.Execute 
    Call KillWait 

在另一個代碼模塊,我有:

Sub WaitShow() 
    Wait.Show 
    End Sub 

    Sub KillWait() 
    Unload Wait 
    End Sub 

我已經窗體稱爲wait與下面的代碼:

Private Sub UserForm_Activate() 
Call PleaseWait 
End Sub 

Sub PleaseWait() 
Wait.Label1.Caption = "Calculating...Please Wait!" 
End Sub 

現在執行代碼時,運行時執行ES背不動通過模塊以執行以下操作:

SQl.ExecuteSQl.Execute 

我可以顯示一個狀態欄程序的進展,但一個窗體彈出消息將是這個計劃非常有用。

回答

6

Form.Show方法的默認行爲是將窗體顯示爲模態對話框。你所尋找的是一個無模式對話框,所以你需要指定,像這樣:

Sub WaitShow() 
    Wait.Show vbModeLess 
End Sub 

更新:

如果您不能用戶一個無模式對話框,你還有其他選擇,如在評論中提到。其中之一是讓等待的用戶表單執行SQL。這可能就像這樣:

在等待的形式,首先聲明變量

Private mySomeParameter1 As String 
Private mySomeReturnValue1 As String 

'Input parameters to the form 
Public Sub Init(ByVal some_parameter1 As String, ...) 
... Initialize your SQL, NOT execute it 
End Sub 

'Output values from the from 
Public Sub GetReturns(ByRef some_return_value1 As String, ...) 
... set the output parameters... 
End Sub 

'Do the work 
Private Sub UserForm_Activate() 
    Call PleaseWait 
    'Either call DoEvents or a manual Refresh to let the label display itself 
    Call ExecutSQL ' A function that executes the SQL 
    Unload Me 
End Sub 

而且在主要形式有:

Sub WaitShow() 
    Wait.Init(the parameters...) 
    Wait.Show 
    Wait.GetReturns(the results...) 
End Sub 

然而,對於你的另一個選擇是跳過等待完全形成,而是在主表單上顯示一個「等待」圖像,並在SQL處理完成後隱藏它。

+0

謝謝回覆GTG。我已經試過了,得到這個:顯示模態窗體時不能顯示非模態窗體。 – Fwafa 2011-12-23 12:03:57

+0

另外,我忘記提到用戶選擇選項的第一個表單仍然顯示。 – Fwafa 2011-12-23 12:04:49

+1

假設您的第一個表單需要爲模態,那麼您可以將SQL執行代碼放入「等待」用戶窗體內,或從「等待」用戶窗體調用父窗體中的函數。這樣你就不需要任何額外的模塊。第三種選擇是爲「等待」表單創建一個ActiveX .exe文件,並讓該進程顯示一個無模式的「等待」表單。然而,這將需要您與您的Excel工作表一起部署該.exe。 – GTG 2011-12-23 12:58:39

1

這裏是如何顯示一個進度條,而用戶正在等待Excel來完成處理:

https://stackoverflow.com/a/10791349/138938

Excel progress bar

在你的情況,你能猜到一個合理的「平均」時間您的查詢並使用當時的百分比進行進度欄更新,這將使您的用戶確信Excel正在工作,而且他們不需要恐慌。

0

我的解決方案遠不如其他人的優雅和令人印象深刻。僅供參考,我的腳本正在爲FOR內的多個合作伙伴進行處理...NEXT循環,我想用當前正在處理的夥伴更新屏幕。

我創建了一個名爲「Messages」的工作表選項卡。我儘可能地擴大了單元格A1的寬度和高度,並且選擇了一種我喜歡的顏色方案的字體。我的腳本首先關閉ScreenUpdating。我然後

Sheets("Messages").Select 
Cells(1, 1).Value = "Processing " & Partner 
Application.ScreenUpdating = True 
Application.ScreenUpdating = False 

在此之後,我回到我需要的任何表。沒有什麼奇特的,但它快速,簡單,並做我所需要的。 :)

0

我用設置爲一個非常小的尺寸,時隱時現的形式加載,標題窗體上放置一個命令按鈕「請稍候,處理...」

我的形式調整按鈕Iniliatlise事件(我只是使用頂部,左側,寬度&高度屬性來調整窗體大小)。 YOu當然可以製作成任何你喜歡的尺寸。

我讓命令按鈕在耗時代碼&再次隱藏在代碼末尾之前可見。

需要一些「DoEvents」,但工作完美。