【VBA】Officeの64bit版ではプログレスバーが使えないらしいので自作した
AccessのVBAで作成したプログラムが、ある日を境に毎回エラーが出るようになってしまったそうです。
自分のPCで実行してみても正常に動くため、原因が何なのかが全然分からなかったのですが、どうやらOfficeに違いがあるようでした。
32bit版で作成したVBAのプログラムにはプログレスバーがあったのですが、64bit版ではプログレスバーが使えないんだとか。
64bit版でプログレスバーを使用する方法を調べても怪しいものがほとんどだったため、それっぽいのを自作することになりました。
まず、プログレスバーの背景として横長のラベルを作ります。
名前は「labelProgressBar_back」としました。
次に、プログレスバーの進捗部分を表すラベルを作ります。
位置と高さを背景のものと一致させ、幅を小さくします。
また、それっぽく見えるように色を青に設定しました。
こちらの名前は「labelProgressBar」としました。
文字列がないとラベルが消えてしまうようだったため、空白を入れてあります。
あとは進捗に合わせて伸び縮みするようにするだけですね。
標準モジュールでプログレスバーっぽく見せるためのソースです。
「MyProggressBar」というモジュール名にしました。
Private parentBar As Object
Private progressBar As Object
Private max
'******************************************************************
'
' 親と子を設定する
'
'******************************************************************
Public Sub setProggressBar(ByRef parent, ByRef child)
' 親を設定する
Set parentBar = parent
' 子を設定する
Set progressBar = child
' 初期設定を行う
initProgressBar
End Sub
'******************************************************************
'
' MAXをセットする
'
'******************************************************************
Public Sub setMaxValue(ByVal value)
' MAXを設定する
max = value
End Sub
'******************************************************************
'
' 進捗状況をセットする
'
'******************************************************************
Public Sub setValue(ByVal value)
Dim tmpWidth
' 1単位あたりの横幅を取得する
tmpWidth = parentBar.Width / max
If Err.Number <> 0 Then
Exit Sub
End If
' 進捗状況を設定する
progressBar.Width = tmpWidth * value
If Err.Number <> 0 Then
Exit Sub
End If
' 親の横幅を超える場合は親の横幅に合わせる
If parentBar.Width < progressBar.Width Then
progressBar.Width = parentBar.Width
End If
If Err.Number <> 0 Then
Exit Sub
End If
End Sub
'******************************************************************
'
' 親と子を設定する
'
'******************************************************************
Private Sub initProgressBar()
' 子の長さを0にする
progressBar.Width = 0
End Sub
こんな感じに使います。
Dim i As Integer ' プログレスバーとして扱うラベルを設定する Call MyProggressBar.setProggressBar(Me.labelProgressBar_back, Me.labelProgressBar) ' 進捗の最大値を設定する MyProggressBar.setMaxValue (20) ' 進捗に値を設定する(1/20) MyProggressBar.setValue (1) ' ----- 処理1 ----- ' 進捗に値を設定する(2/20) MyProggressBar.setValue (2) ' ----- 処理2 ----- ' MyProggressBar.setValue (20)まで設定可能
setValue(20)の段階で背景と同じ長さになります。
小数点以下を考えずに作成されているため、気になる方は自分で補正してください。
他にやり方があるのかもしれませんが、時間と元気がないのでこんな仕上がりになりました。


No comments.