VBAで長い処理の間にメッセージを表示する方法

このQ&Aのポイント
  • VBAを使用して、長い処理の間にメッセージを表示する方法について教えてください。
  • ユーザーフォームの下にラベルを配置し、ステータスバーとして使用しています。処理中はメッセージを表示したいのですが、現在のプログラムでは正しく表示されません。
  • Forループの中でワークシートに何らかの操作を行っている場合にのみ、メッセージが正しく表示されます。ワークシートを処理しながらメッセージを表示する方法はありますか?
回答を見る
  • ベストアンサー

Q:Ecvel 2007 VBA: 長い処理の間のメッセージ?

いつもお世話になります。 ユーザーフォームの下にラベルを置いて、ステータスバー的に使っています。 ちょっと時間が掛かる処理があることが分かったので、その間は「処理中・・・」的なメッセージを出すことにしました。 現在は以下のようなプログラムにしています。 Option Explicit Private Sub CommandButton1_Click() setColor1 '<==Break? setcolor2 Dim i As Long For i = 2 To 10000 Cells(i, 5).Value = "wanwan" Next i setcolor3 End Sub Sub setColor1() With UserForm1.Label1 .Caption = "you push the button..." .ForeColor = RGB(0, 255, 0) End With End Sub Sub setcolor2() With UserForm1.Label1 .Caption = "wait for a while..." .ForeColor = RGB(255, 0, 0) End With End Sub Sub setcolor3() With UserForm1.Label1 .Caption = "Finished" .ForeColor = RGB(0, 0, 0) End With End Sub これを実行しても、Forループの間はLabel1のCaptionはフォームデザイン時のデフォルト値Beforeになったままで、Forループが終わるとsetcolor3によってセットされるFinishedになります。 setcolor1、setcolor2が表示する途中経過は見えません。 しかし、上のリストの Break? と書いているところにブレークポイントを置いて、ブレークしたらF8を連打してsetcolor1、setcolor2を手動実行するとメッセージは狙い通りに変わります。 Forループの中でワークシートに何らかの操作を行っている場合にのみ起こる現象で、Forループの中でwait文を書いて10秒待つとかやると、メッセージは狙い通りに変わります。 ワークシートを処理しながら、メッセージを狙い通りに変える方法はあるでしょうか。 何かわかりましたらよろしくお願いします。 なお、ユーザーフォームの画像を添えます。

質問者が選んだベストアンサー

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.1

Userformの再描画を強制的にさせないといけません。 で、プロシージャsetcolor2のEndSubの前に、DoEventsを入れてやる '----------------------------------- Sub setcolor2()  With UserForm1.Label1   .Caption = "wait for a while..."   .ForeColor = RGB(255, 0, 0)  End With  DoEvents  '●これを挿入 End Sub '--------------------------------------- それから、プロシージャのsetColor1はこのままでは意味がないと思いますが。。。    

TYWalker
質問者

お礼

ありがとうございます! 上のサンプルコードも、その元になった長い業務用のコードも、DoEventsでバッチリでした。 >プロシージャのsetColor1はこのままでは意味がないと思いますが。。。 一瞬しか出ないから、という意味ですね。 そうなんです。 業務用のより長いコードを短くしてここに載せる過程で、メッセージが3回出ることが何か影響していたらと思って上のように書きました。 ありがとうございます!

関連するQ&A

  • VBA:ユーザフォームのラベルの指定の仕方教えてください。

     今、ユーザフォームに20個のラベルがあります。それぞれのラベルは、条件によりラベルの表示内容が変更します。そこで、ラベルの表示変更が必要なときにすぐに変更できるようにしたいと考えています。しかし、例えば以下のようなコードを作成するとエラーになり困っています。  Label(i)で、iの番号によりラベルが呼び出されないだろうかと自分なりに作りましたがダメでした。以下のようなループ文中で特定のラベルを呼び出し処理することは不可能でしょうか?  やはり、UserForm1.Label3などのように番号をきちんと書かないとダメでしょうか?本当は、ラベルが82個ありその一つ一つにコードを割り当てるのが大変です。また、きれいなコードで書きたいと思うからです。宜しければ、ご教授願います。 -------------------------------------------- Sub セルの値をラベル表示する() For i = 1 To 20 With UserForm1.Label(i) .Caption = Cells(1, i) End With Next i End Sub

  • VBA DoEvents関数の働きと使い方を知りたい

    下記のような UserForm上の Module コードを書いてももらったのですが、DoEvents の働きが分からないのです。どなたか分かりやすく説明していただけませんでしょうか? Private i As Integer Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Me.TextBox1.Value = Me.Label1.Caption Then Me.Label2.Caption = "正解です" Else Me.Label2.Caption = "不正解です" End If DoEvents If i < 20 Then i = i + 1 Label_Up Me.TextBox1.Value = "" Cancel = True Else MsgBox "終了です" End If End Sub Private Sub UserForm_Initialize() i = 1 Label_Up End Sub Private Sub Label_Up() Me.Label1.Caption = Sheets("Sheet1").Range("A1:A20").Cells(i).Value DoEvents End Sub

  • マクロでフォーム処理の繰り返し

    よろしくお願いします。 マクロでフォームを作成したとき同じような処理がたくさんある時、繰り返し処理は可能でしょうか? 例えば以下のような処理をループ処理できないでしょうか? Private Sub Label1_Click() Label1.BackColor = RGB(255, 0, 0) End Sub Private Sub Label2_Click() Label2.BackColor = RGB(255, 0, 0) End Sub Private Sub Label3_Click() Label3.BackColor = RGB(255, 0, 0) End Sub   ・   ・   ・ Private Sub Label100_Click() Label100.BackColor = RGB(255, 0, 0) End Sub

  • VBAでUserFormでProgressBarとLabelを同時表示できない理由は?

    VBAでUserFormをつかってProgressBarとLabelを同時に表示させる。つもりでしたが、ProgressBarが満たされた後Labelが表示されます。その理由と対策を教えて下さい。そのコードを以下に示します。 Sub a() With UserForm1 .Show vbModeless .Label1 = "始めのテキスト" End With s = 1 e = 20000 For i = s To e UserForm1.Label1 = "始めのテキスト" UserForm1.ProgressBar1.Value = i / e * 1000 Next i End Sub お願いします。

  • エクセルVBA 計算の繰り返し処理?

    エクセルのVBA フォーム内にて 下記、各テキストボックスの数値を変更することにより Label27にLabel28*TextBox12+TextBox13+TextBox14 Label33にLabel34*TextBox16+TextBox17+TextBox18 Label27、Label33に計算の答えを書き込みたいため 下記のように書き込みました。 Private Sub TextBox12_Change() Label27.Caption = Val(Label28.Caption) * Val(TextBox12.Value) _ + Val(TextBox13.Value) + Val(TextBox14.Value) End Sub Private Sub TextBox13_Change() Label27.Caption = Val(Label28.Caption) * Val(TextBox12.Value) _ + Val(TextBox13.Value) + Val(TextBox14.Value) End Sub Private Sub TextBox14_Change() Label27.Caption = Val(Label28.Caption) * Val(TextBox12.Value) _ + Val(TextBox13.Value) + Val(TextBox14.Value) End Sub Private Sub TextBox16_Change() Label33.Caption = Val(Label34.Caption) * Val(TextBox16.Value) _ + Val(TextBox17.Value) + Val(TextBox18.Value) End Sub Private Sub TextBox17_Change() Label33.Caption = Val(Label34.Caption) * Val(TextBox16.Value) _ + Val(TextBox17.Value) + Val(TextBox18.Value) End Sub Private Sub TextBox18_Change() Label33.Caption = Val(Label34.Caption) * Val(TextBox16.Value) _ + Val(TextBox17.Value) + Val(TextBox18.Value) End Sub 計算は出来るのですが計算ラベル50程あるため、修正を考えて ももう少し簡素化して書き込みたいため 調べましたがヒント項目がずれているせいか回答を検索できませんでした。 どのようにすれば宜しいかご教示の程宜しくお願いいたします。

  • VBA 同様処理の簡素化?

    エクセル VBAで下記のようにテキストボックスの処理を 書き込みました。 Private Sub TextBox24_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '注文合計数 Sukei = O If KeyCode = 13 Then For Kasan = 18 To 34 Soukei = Val(Controls("TextBox" & Kasan).Text) Sukei = Sukei + Soukei Next Kasan Label41.Caption = Sukei '見込合計数 MSukei = O For MKasan = 35 To 51 MSoukei = Val(Controls("TextBox" & MKasan).Text) MSukei = MSukei + MSoukei Next MKasan Label42.Caption = MSukei '総合計数 Label39.Caption = Val(Label41.Caption) + Val(Label42.Caption) End If End Sub Private Sub TextBox25_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '注文合計数 Sukei = O If KeyCode = 13 Then For Kasan = 18 To 34 Soukei = Val(Controls("TextBox" & Kasan).Text) Sukei = Sukei + Soukei Next Kasan Label41.Caption = Sukei '見込合計数 MSukei = O For MKasan = 35 To 51 MSoukei = Val(Controls("TextBox" & MKasan).Text) MSukei = MSukei + MSoukei Next MKasan Label42.Caption = MSukei '総合計数 Label39.Caption = Val(Label41.Caption) + Val(Label42.Caption) End If End Sub テキストボックス24、25内の処理は同じなのですが テキストボックスが増えた場合、修正することも考えて 簡素化したいのですが、どのように行なえばいいでしょうか?

  • excel VBA プログレスバーについて(初心者)

    VBA初心者の質問です… excelで入力されている値を用いて、グラフ作成する簡単なデータを作りました。 特に問題なくグラフは出来たのですが、グラフ作成が1つではなく数個同時(順番)に作成しているため時間が掛かってしまいます。 この処理中にプログレスバーを表示出来ればと思い質問を致します。 私なりに調べ(goo内)下記サンプルを発見し、簡単なのでこれを使をうかと思うのですが、UserForm1の処理前にUserForm2.showだけでは UserForm2の処理が終わらないと処理をしません…当然ですよね… 本当に初心者で申し訳ないのですが、UserForm1の処理最中にUserform2のプログレスバーを表示するのにはどうすればいいのでしょうか… 【サンプル】 Private Sub UserForm_Activate() With Label1 .SpecialEffect = 2 .BackColor = vbBlue www = .Width .Width = 0 End With For i = 1 To 1000 Me.Caption = i Label1.Width = i / 1000 * www Me.Repaint Next End Sub また他におすすめなやり方があれば教えて頂ければ… 初心者な質問で申し訳御座いません。

  • エクセルVBAラベルの変数?

    エクセル2000VBAにて下記のように作成しました。 With ActiveSheet For i = 4 To 200 If Label1.Caption = .Cells(i, 1) Then For h = 4 To 34 If Label25.Caption = .Cells(2, h) Then For idx = i To 200 If .Cells(idx, 3) = Label21.Caption Then Label6.Caption = .Cells(idx, h) Label7.Caption = .Cells(idx + 2, h) GoTo ラベル2 End If Next idx End If Next h End If Next i ラベル2: For i = 4 To 200 If Label2.Caption = .Cells(i, 1) Then For h = 4 To 34 If Label25.Caption = .Cells(2, h) Then For idx = i To 200 If .Cells(idx, 3) = Label21.Caption Then Label8.Caption = .Cells(idx, h) Label9.Caption = .Cells(idx + 2, h) GoTo ラベル3 End If Next idx End If Next h End If Next i ラベル3: ・・・ End With Label1~5まで同じ処理を行うため 1~5まで変数を使用して簡単にしたいのですが Label(変数)の書き込み方がわかりません? 検索を使用しましたが検索項目が悪いのか なかなか解決しません。 何方か教えていただけないでしょうか?

  • VBAで条件付書式

    アクセス2003なのですが 「色を青にして太字に」するにはどうすればいいでしょうか? Sub 条件付書式() With Form_フォーム1.テキスト2 .ForeColor = RGB(255, 255, 255) With .FormatConditions .Delete .Add(acExpression, , "[テキスト2]=""青にする""").ForeColor = 16711680 '青 End With End With End Sub で青にはなるのですが 青なおかつ太字にするにはどうすればいいでしょうか? FontStyle プロパティを使うのでしょうか? 書き方を教えてください。

  • VBAでユーザーフォームのcaption表示

    VBAを初めたばかりです。 VBAでユーザーフォームを作成したのですが ユーザーフォームプロパティのcaptionで入力しても 下記プログラムで入力しても表示されません。 VBA作成時の画面にはしっかりと「項目」と 表示されていますが、プログラムを実行してユーザーフォームを 呼び出すと何も表示されていません。 ご教授ください。 Private Sub UserForm_Initialize() UserForm1.Caption = "項目" With ListBox1 .AddItem "1" .AddItem "2" End With End Sub