お世話になっております。 Excel2003を使用しております。
LabelとFrameを使い、プログレスバー表示したいと思っております。
ユーザーフォーム上に、
Label と Frameを置き、
Frameの中にLabelを置きます。 (ここは上手くできているか不安です)
UserFormInitializeに
With Me.Label1
.Top = 1
.Left = 1
.Width = 1
.BackColor = vbBlue
BarWidth = Me.Frame1.Width - 6
End With
そして、ためしにコマンドボタンを設置して、
Dim i, 最大値 As Long
最大値 = 100000
BarWidth = Me.Frame1.Width - 6
Do
If i = 0 Then
Me.Label1.Width = BarWidth * 1 / 最大値
Else
Me.Label1.Width = BarWidth * i / 最大値
End If
i = i + 1
Loop Until i = 最大値
上記のように記入してみました。
一瞬で表示されてしまいますし、
一度処理が終わっても、青いバーが表示されたままで
どうすればいいのか良く分かりません。
最後に Me.Label1.Width = 0 と書けばいいのは分かりましたが…
どうしたら、バーの伸び具合をゆっくり見られますか?
回答よろしくお願い致します。
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型になってしまいますので要注意。
質問者
お礼
回答ありがとうございます!
nishi6様のは、UserForm自体がちらつきましたが
問題は無かったです。
>なお、Dim i, 最大値 As Long と書くと、i はVariant型になってしまいますので要注意。
そうだったんですね!
普段は
Dim i as long
Dim 最大値 as long
と記載しているのですが、
短くしたくてこのように記載しました…
どうやって記入したら1行で収まるのか
まだまだ勉強不足のため、調べなおしてみたいと思います!
DoEventsは全然使ったことがなく、
理解していないため、基本を理解することから
始めようと思います!
ありがとうございました^^
お礼
回答ありがとうございます! nishi6様のは、UserForm自体がちらつきましたが 問題は無かったです。 >なお、Dim i, 最大値 As Long と書くと、i はVariant型になってしまいますので要注意。 そうだったんですね! 普段は Dim i as long Dim 最大値 as long と記載しているのですが、 短くしたくてこのように記載しました… どうやって記入したら1行で収まるのか まだまだ勉強不足のため、調べなおしてみたいと思います! DoEventsは全然使ったことがなく、 理解していないため、基本を理解することから 始めようと思います! ありがとうございました^^
補足
先ほど、しっかり検証してみました。 DoEventsと1行だけ加えてみただけですが、 上手く行きました^^ ありがとうございました!