• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:LabelとFrameでプログレスバー VBA)

VBAでLabelとFrameを使用してプログレスバーを表示する方法

このQ&Aのポイント
  • Excel2003を使用している場合、VBAを使ってLabelとFrameを組み合わせてプログレスバーを表示することができます。
  • UserForm上にLabelとFrameを配置し、Frameの中にLabelを配置します。コマンドボタンを使用してプログレスバーの表示を試すことができます。
  • 処理が瞬時に完了し、バーが表示されたままになる場合は、最後にMe.Label1.Width = 0と書くことでバーを初期状態に戻すことができます。バーの伸び具合をゆっくり見たい場合は、Doループを使用してバーの幅を少しずつ増やしていくことができます。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

UserFromにコマンドボタン一個だけ置いて実行して下さい。(FrameとLabelは自動で配置します) #1さんのMe.Repaintでもバーの漸増は表示されますがCommandButtonがちらつくのでうるさいかも。 DoEvents: DoEvents: DoEventsを入れると、制御がWindowsに移り、コントロールが再描画されます。 xl2003なら、DoEvents一個でも十分です。 お好みでどうぞ。 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Dim myFrame As MSForms.Frame Dim myLabel As MSForms.Label Private Sub UserForm_Initialize() Set myFrame = Controls.Add("Forms.Frame.1") Set myLabel = myFrame.Controls.Add("Forms.Label.1") With myFrame .Left = 10 .Top = 10 .Width = 200 .Height = 40 End With With myLabel .Left = 1 .Top = 1 .Height = myFrame.Height - 6 .Width = 0 .BackColor = vbBlue End With End Sub Private Sub CommandButton1_Click() Dim i As Long, 最大値 As Long Dim BarWidth As Long 最大値 = 100000 BarWidth = myFrame.Width - 6 Do DoEvents: DoEvents: DoEvents 'CommandButtonは押しっぱなしになりちらつきは無い ' Sleep 100 'Sleepを入れれば最大値が100程度でも十分漸増表示されます。 If i = 0 Then myLabel.Width = BarWidth * 1 / 最大値 Else myLabel.Width = BarWidth * i / 最大値 End If i = i + 1 ' Me.Repaint 'ProgressBarもどきは進むがCommandButtonがちらつく Loop Until i = 最大値 End Sub なお、Dim i, 最大値 As Long と書くと、i はVariant型になってしまいますので要注意。

satoron666
質問者

お礼

回答ありがとうございます! nishi6様のは、UserForm自体がちらつきましたが 問題は無かったです。 >なお、Dim i, 最大値 As Long と書くと、i はVariant型になってしまいますので要注意。 そうだったんですね! 普段は Dim i as long Dim 最大値 as long と記載しているのですが、 短くしたくてこのように記載しました… どうやって記入したら1行で収まるのか まだまだ勉強不足のため、調べなおしてみたいと思います! DoEventsは全然使ったことがなく、 理解していないため、基本を理解することから 始めようと思います! ありがとうございました^^

satoron666
質問者

補足

先ほど、しっかり検証してみました。 DoEventsと1行だけ加えてみただけですが、 上手く行きました^^ ありがとうございました!

その他の回答 (1)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

机上デバッグですが、 Repaintメソッドを入れてみてください。下の方です。 Else   Me.Label1.Width = BarWidth * i / 最大値   Me.Repaint '■これを入れる End If

satoron666
質問者

お礼

回答ありがとうございます! 早速試してみたところ上手く行きました! ただ、どこかクリックすると終わってしまうのですね… プログラムの問題でしょうか?(苦笑 でも、上手く動いていることを確認できたので 良かったです! ありがとうございました^^

関連するQ&A