2011-12-23 241 views
7

Excel-VBAでPlease Waitメッセージを作成しようとしています。これは、プロセスがまだ進行中であることをユーザーにSQLクエリを処理するように通知するためです。Excel VBA「お待ちください」ポップアップメッセージ

このメッセージをユーザーフォームに表示したいと考えています。

現在、ユーザーはsql dbに接続し、dbとその他のオプションを選択し、[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 

コードを実行すると、実行時do

SQl.ExecuteSQl.Execute 

は私がステータスバーとプログラムの進行状況を表示することができますが、ユーザーフォームは、このプログラムのために非常に有用であろうメッセージをポップアップ表示:ES次のコマンドを実行するために戻ってモジュールを介して移動しません。

答えて

6

Form.Showメソッドの既定の動作は、フォームをモーダルダイアログとして表示することです。あなたが探していると、モードレスダイアログボックスであるので、あなたはこのように、それを指定する必要があります。

Sub WaitShow() 
    Wait.Show vbModeLess 
End Sub 

更新:

あなたはモードレスダイアログではないユーザー、あなたは他のオプションを持つことができる場合は、としてコメントに記載されています。それらの1つは、待機しているユーザーフォームに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 

しかし、あなたのための別のオプションは、待ちをスキップするだろうフォームが完全に表示され、代わりにメインフォームに「Waiting」イメージが表示され、SQL処理が完了すると非表示になります。ここで

+0

THanks for reply GTG。私はすでにこれを試してこれを取得しています:モーダルフォームが表示されているときに非モーダルフォームを表示できません。 – Fwafa

+0

また、ユーザーがオプションを選択した最初のフォームがまだ表示されていることを忘れていました。 – Fwafa

+1

最初のフォームをモーダルにする必要があると仮定すると、SQL実行コードを「待機中の」ユーザーフォームに配置するか、「待機中の」ユーザーフォームから親フォームの関数を呼び出すことができます。そうすれば、余分なモジュールは必要ありません。 3番目のオプションは、 "Waiting"フォームのActiveX .exeを作成し、そのプロセスにモードレス "Waiting"フォームを表示させることです。ただし、Excelシートとともにその.exeを展開する必要があります。 – GTG

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イベント(私は単純に、上部、左、幅&の高さのプロパティを使用してフォームサイズにサイズ変更します)。もちろん、好きなサイズにすることもできます。

時間のかかるコードの直前にコマンドボタンを表示させます。&コードの最後にもう一度隠すようにします。

"DoEvents"が必要ですが、完全に機能します。

関連する問題