2011-12-07 8 views
3

私は、後続の段階でユーザーに通知する必要がある長いプロセスがあるため、Excelがクラッシュしたとは考えられません。長いプロセス中にユーザーに通知するにはどうすればよいですか?

ユーザにExcelの非同期メッセージを表示するには、VBAを使用しますか?

+0

私は進捗情報を表示するためにFormsを使用します。 [この質問への私の答えを見る] [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を追加したいですステータスバーを使用すると、パフォーマンスが大幅に低下します(実際はかなりのビット数)ので、適切な間隔で更新する必要があります。ここで私は(私たちはのみ各1000インクリメント確保するために、ここでMODを使用して)何を意味するかの例です:

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を利用できます。そうすれば、ステータス・メッセージを直接ワークシートに入れることができます。しかし、それは複雑ではない(.NETやVB6やC++やDelphiで書かれている)COM Automationサーバーの開発を必要とするが、プロダクションでは一度問題(配備、サポート、コードコントロールなど)を引き起こす。

4

私はかつて何かが「実行中」と呼ばれる余分なタブを作成することでした私のアドインのためのWalkenbach's progress form

enter image description here

+0

クールで安全に見えます。しかし、私は3つの画面だけでなく、ほとんどの時間、私のユーザーを使用しています。現時点で、私がサンプルをダウンロードすると、アクティブなExcelを持つものとは別の画面にポップアップが表示されることがあります。ピースをかなりよく知っているので、それを修正する方法はありますか? – Jerome

+0

@ jeromeG 3つの画面を表示すると、3つの画面にまたがるExcelの1つのインスタンスで3つのファイルが開いているということですか?または、Excelの3つの別々のインスタンスが実行されている? – brettdj

+0

私は3つの物理的な画面と1つのExcelインスタンスが1つの画面で開いていることを意味します。面白いのは、VBEを開くと、ポップアップが常にVBEが表示される画面に表示されるということです。 VBEを別の画面に移動すると、次回にポップアップが表示されます。 Excelが表示されている画面は何も影響しません。 VBEを閉じると、ポップアップはVBEが最後の画面に表示され続けます。問題は、実際のExcelが左側の画面に表示されているときに、ポップアップから離れて2つの画面が表示されないようにすることです – 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 
関連する問題