エクセルVBAでユーザーフォームBがリアルタイムに更新されない問題の解決方法

このQ&Aのポイント
  • エクセルVBAでユーザーフォームAとBがありますが、フォームBがリアルタイムに更新されない問題が発生しています。
  • フォームBに変数を渡そうとしたり、ラベルやテキストボックス、リストボックスを使用しようとしたりしても、真っ白なまま更新されず、原因が分かりません。
  • 解決方法を教えてください。
回答を見る
  • ベストアンサー

エクセルVBA

どうしても解らないため,ご教授ください. いま,ユーザーフォームAとBがありAで主にプログラムを走らせます.BはAで 処理している内容(ファイル名)を表示させるだけです. そこで以下のようなプログラムを組んだのですが,リアルタイムに更新されず真っ白な ままになってしまいます.フォームBに変数を渡して行おうとしましたがこれもうまく 行かず,今はフォームAからBを操作しています. ラベルを使用していますがテキストボックスでもリストボックスでも 同様なことが起こってしまいます.何が悪いのかさっぱり解りません よろしくお願いいたします. buf = openfilename & "処理中" If ic > 1 Then buf = UserForm2.Label1.Caption & vbCr & buf End If UserForm2.Label1.Caption = buf

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

簡単な例を書くと Private Sub CommandButton1_Click()   Dim i As Long   With UserForm2     For i = 1 To 5       Application.Wait Now + TimeValue("00:00:01")       .Label1.Caption = i       .Repaint     Next   End With End Sub こんな感じで UserForm2.Repaint による再描画が必要ではないでしょうか。

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

Windowsのアーキテクチャを理解すると、そういう 現象になるのは当然であることが分かります。 Windowsではウィンドウに何かしらの変化が発生 するとメッセージを発生させ、ウィンドウに送り ます。例えば、「上に乗っていたウィンドウが消え たから、その部分を描画し直せ」という具合です。 ウィンドウプロシージャはメッセージに応じた動作を 実施します。 「ボタンがクリックされた」というのも同じです。 そこから先はOnClickイベントプロシージャとして 利用者プログラムに制御が渡ります。 但し、メッセージは順繰りに処理されるので、前の メッセージの処理が終わるまで、次のメッセージは 送られません。 つまり、ボタンクリックから一連の動作を開始すると、 このスレッドでいくら画面の表示を変えたとしても、 「描画」メッセージは画面に送られず、キューに溜まる だけです。つまり、画面の表示に変化がありません。 ボタンクリックのスレッドがOSに制御を返すと、初めて 次のメッセージが送られ、再描画されます。従って、 最後の場面しか映りません。 実際のVBAでは微妙に違いますが、大体の流れはこの ようになっています。Cプログラムでは実行ボタンに よる処理は別スレッドを起動して処理し、メッセージの 処理は直ぐに制御をOSに戻すようにしています。 VBではマルチスレッドができないので、替わりに、 溜まったメッセージを先に処理させるステートメントを 使います。これがDoEventsステートメントです。 テキストボックスやラベルの内容を変更したら、この ステートメントを実行します。 但し、このステートメントはボタンのクリックなども 拾うので、OnClickイベントプロシージャの処理を 抜けないうちに、発生したスレッドにより、同プロ シージャが呼び出される可能性があります。また、 画面の表示を変えたことに伴って色々なイベントが 発生し、堂々巡りになったりする危険もあります。 こういった状態にならないよう制御します。 サンプル UserForm2.Label1.Caption = buf DoEvents 'ここでメッセージを処理させる

関連するQ&A

  • エクセル2003VBAにて、

    エクセル2003VBAにて、 ユーザーフォームのラベルへ処理状況を表示したいのですが、 マクロ実行中はユーザーフォームに処理が渡されないのか以下のコードが反映されません。 そこでDoEventsを入れてみたのですが、 やっぱりラベルに以下の文字が反映されません。 どなたかよい解決方法を御存じないでしょうか? 教えてください。よろしくお願いいたします。 DoEvents UserForm1.Label9.Caption = "行数確認中です..."

  • excel 2003 マクロですっきりさせたい

    お世話になります。 ユーザーフォーム上の テキストボックス 商品名_1の値が空白になったら ラベルも空白にするというマクロを組みました。 ラベルがたくさんあり、何かすっきりとできる方法があれば 教えてください!>< よろしくお願いします。 Private Sub 商品名_1_Change() If 商品名_1.Value = "" Then Label1_1.Caption = "" Label1_2.Caption = "" Label1_3.Caption = "" Label1_4.Caption = "" Label1_5.Caption = "" Label1_6.Caption = "" Label1_7.Caption = "" End If 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(変数)の書き込み方がわかりません? 検索を使用しましたが検索項目が悪いのか なかなか解決しません。 何方か教えていただけないでしょうか?

  • EXCEL VBA フォームにメッセージ出力

    お世話になります。 以前にも似たような質問をさせていただきましたが、再度EXCEL VBAのフォームにメッセージを出力する件で質問させていただきます。 下記のVBAはA支店、B支店、C支店のデータを集計する処理なのですが、この処理の途中経過をユーザーに知らせるためにフォームを表示しています。 フォームの真ん中にメッセージ出力する領域としてLabel_Statusという名前で"ラベル"を作成しました。 このラベルにメッセージを表示することは前回ご教授いただきまして実現することができました。 実際に動かしますと "集計完了!"とだけ出てしまい、途中経過の"データ集計中(A支店)・・"が出力されないのです。なぜでしょうか? 以下がVBAです Me.Label_Status.Caption = "データ集計中(A支店)・・" --A支店集計処理-- Me.Label_Status.Caption ="データ集計中(B支店)・・" --B支店集計処理-- Me.Label_Status.Caption = "データ集計中(C支店)・・" --C支店集計処理-- Me.Label_Status.Caption = "集計完了!" ←このメッセージだけが出力されてしまいます VBAここまで 環境 Windows XP SP3 EXCEL2003 以上です。どなたかご教授いただけませんでしょうか?

  • 複数コントロールテキストの同一セルへの入力

    はじめまして。 エクセルVBAについて質問させて頂きます。 ユーザーフォームにラベル・テキストボックスそれぞれ1~6があって ラベルのキャプションとテキストボックスのテキストをセル同一セルに 入力したくて With UserForm1 Range("A1") = .Label1.Caption & .TextBox1.Text & .Label2.Caption & .TextBox2.Text _ & .Label3.Caption & .TextBox3.Text & .Label4.Caption & .TextBox4.Text _ & .Label5.Caption & .TextBox5.Text & .Label6.Caption & .TextBox6.Text End With と、このように記述したのでが、これをもっと簡潔に書く方法はございませんでしょうか? ご教授よろしくお願いします。

  • Excel VBAについて

    Excel VBAにおいて、Sheetの選択した行によって値を表示するUserFormを変更したいと思っています。 現在以下のようにしたのですが、実行すると「SubまたはFunctionが定義されていません」というエラーが表示されます。 「Controls("UserForm" & x).Label1.Caption =」のところをどのようにしたらよいのでしょうか。 Private Sub CommandButton1_Click()   If ActiveCell.Row = 5 Then     UserForm1.Show     x = 1   ElseIf ActiveCell.Row = 6 Then     UserForm2.Show     x = 2   End If End Sub Private Sub Worksheet_Selection Change(Byval Target As Range)   Controls("UserForm" & x).Label1.Caption = ・・・

  • VBAでコントロール配列を持つことは可能ですか?

    Excel2002、OSはXPです。 VBではコントロールに配列を持つことが出来ましたが、 VBAでコントロール配列を持つことは可能でしょうか? やりたいことはユーザーフォームにラベルを100個ぐらい貼り付けて、 テキストボックス入力した値がCell(i,1)と等しければ、 i番目のラベルのCaptionに文字を入力したい。という感じです。 もしVBのようにコントロール配列を持てれば、 If TextBox1.text=Cells(i,1) Then Label(i).Caption="~~" という風に出来るのですが、どうも配列の設定がVBのようにできません。 プロパティにINDEXが無いですし、オブジェクト名を同じにしたら エラーとなってしまいますし。。 もし出来ないのであれば、何か回避策のようなものはないでしょうか? 力技で100個IFを書けば出来ることは出来るのですが・・ If TextBox1.text=Cells(i,1) Then If i = 1 Then Label1.Caption="~~" ElseIf i=2 then Label2.Caption="~~" ・・・・

  • VBA ユーザフォームを非アクティブ固定にしたい

    エクセルVBAで作成されたプログラムで、一点改善したい点があります。 処理の開始を命令すると、ユーザフォームが出てきて進捗が「5/100が完了しました」のように 分かるようになっているんですが、処理が進み、この「5/100」の部分が更新される度に フォーカスがユーザフォームに移ってしまい、他の作業をしていると大変不便です。 ユーザフォームまわりのコードは以下のようになっています。 UserForm11.Show UserForm11.Label2.Caption = "処理実行中です。" & "(" & cnt1 & "/" & cnt2 & ")" 進捗を確認しつつ、かつフォーカスしないようにするようなコードはありませんでしょうか。

  • 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

専門家に質問してみよう