- ベストアンサー
VBAでLabelとFrameを使用してプログレスバーを表示する方法
- Excel2003を使用している場合、VBAを使ってLabelとFrameを組み合わせてプログレスバーを表示することができます。
- UserForm上にLabelとFrameを配置し、Frameの中にLabelを配置します。コマンドボタンを使用してプログレスバーの表示を試すことができます。
- 処理が瞬時に完了し、バーが表示されたままになる場合は、最後にMe.Label1.Width = 0と書くことでバーを初期状態に戻すことができます。バーの伸び具合をゆっくり見たい場合は、Doループを使用してバーの幅を少しずつ増やしていくことができます。
- みんなの回答 (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型になってしまいますので要注意。
その他の回答 (1)
- nishi6
- ベストアンサー率67% (869/1280)
机上デバッグですが、 Repaintメソッドを入れてみてください。下の方です。 Else Me.Label1.Width = BarWidth * i / 最大値 Me.Repaint '■これを入れる End If
お礼
回答ありがとうございます! 早速試してみたところ上手く行きました! ただ、どこかクリックすると終わってしまうのですね… プログラムの問題でしょうか?(苦笑 でも、上手く動いていることを確認できたので 良かったです! ありがとうございました^^
お礼
回答ありがとうございます! nishi6様のは、UserForm自体がちらつきましたが 問題は無かったです。 >なお、Dim i, 最大値 As Long と書くと、i はVariant型になってしまいますので要注意。 そうだったんですね! 普段は Dim i as long Dim 最大値 as long と記載しているのですが、 短くしたくてこのように記載しました… どうやって記入したら1行で収まるのか まだまだ勉強不足のため、調べなおしてみたいと思います! DoEventsは全然使ったことがなく、 理解していないため、基本を理解することから 始めようと思います! ありがとうございました^^
補足
先ほど、しっかり検証してみました。 DoEventsと1行だけ加えてみただけですが、 上手く行きました^^ ありがとうございました!