June 17, 2025
Excel VBA 64bit版でエラーになったので、プログレスバーを自作する

どうやらOfficeの64bit版がインストールされた模様。
それでVBAで使われているProgressBarコントロールが64bit版ではサポートされてないとか、なんとか。
マジか?プログレスバーって使われてないの?マイナーなの?
という事で調査開始。
いつサポート切られるかわからん、自作しろ。だって。
下の所にあるStatusバーに『■■□□□□』四角を並べてバーっぽく表示するか。
それ用のFormを作るか。
簡単で手っ取り早いのは前者。
ちょっと見た目重視なら後者。かな。
削除してほっとこうかと思ったけど、今後仕事で使っているVBA類が次々にエラーになる事を考えると対策は練っておこうという事で作ってみた。
では、作り方。
作るのがメンドウな方は下記アドレスからモジュールをダウンロードしてインポートしてください。
ダウンロードはコチラから
まずForm(frmProgressBar)を作成。
Frame(fraPBar)を貼り付ける。
Captionを削除。
SpecialEffectを2-fmSpecialEffectSunkenにする。
Widthを200にする。
Label(lblPBar)をフレームの上に貼り付ける。
Captionを削除。
Widthを200にする。(フレームとサイズをあわせる)
BackColorを好きな色に変更。
モジュール(mdlProgressBarControl)を追加。
下記コードを貼り付ける。
ーーーーーーーーーーーーーーーーーーーー
Public glngPBarTotal As Long 'バーの最大値(処理数)
Public glngPBarValue As Long 'バーの現在値
Public gintPBarMaxWidth As Integer 'バーの幅
'■ 使用方法
'実行前に初期化する
'Call Sub_ProgressBar_Init
'
'処理の最大値を設定する(処理件数)
'glngPBarTotal = 10000
'
'フォームを表示する
'frmProgressBar.Show vbModeless
'
'処理のループ内で呼び、バーを進める
'Call Sub_ProgressBar_Increment(1)
'
'処理が終了したらフォームを閉じる
'Unload frmProgressBar
'*******************************************************************************
'自作プログレスバー 初期化
'*******************************************************************************
Sub Sub_ProgressBar_Init()
With frmProgressBar
gintPBarMaxWidth = .fraPBar.Width '幅の最大値を保存
.lblPBar.Width = 0 '幅を初期化
glngPBarValue = 0 '現在値を初期化
End With
End Sub
'*******************************************************************************
'自作プログレスバー バーを進める
'引数:現在値に足す数値 レンダリングチェック版
'*******************************************************************************
Sub Sub_ProgressBar_Increment(lngAddValue As Long)
Dim dblPercent As Double
With frmProgressBar
glngPBarValue = glngPBarValue + lngAddValue '現在値をインクリメント
dblPercent = glngPBarValue / glngPBarTotal '%を計算
'現在の表示と比較し、違ったらレンダリングする
If .lblPBar.Width <> Int(gintPBarMaxWidth * (glngPBarValue / glngPBarTotal)) Or _
.Caption <> Format(dblPercent, "0%") Then
'レンダリング
DoEvents
.lblPBar.Width = Int(gintPBarMaxWidth * (glngPBarValue / glngPBarTotal))
.Caption = Format(dblPercent, "0%")
End If
End With
End Sub
ーーーーーーーーーーーーーーーーーーーー

▲ 自作プログレスバー
使用方法は使い方の所にも書いてありますが、
Call Sub_ProgressBar_Init
で初期化。
glngPBarTotal = 10000
で最大処理数を設定。
200件とかのデータを集計する場合は処理前に件数を調べて(行数数えるとか)、ここにセット。
frmProgressBar.Show vbModeless
プログレスバーのフォームを表示する。
vbModelessで。Formからこのプログレスバーのフォームを表示する時は
呼び出し元もvbModelessで開いてないとダメみたい。
Call Sub_ProgressBar_Increment(1)
処理するループ内に、プログレスバーを進める処理を書いておく。
↓のように
For lngCnt = 1 To 10000
'処理を記述
Call Sub_ProgressBar_Increment(1)
Next
Unload frmProgressBar
処理が終了したら、プログレスバーのフォームを閉じる。
以上。

▲ 自作プログレスバー
ネットで見かけるサンプルで作ってみたら、プログレスバーを表示する表示しないで処理が数倍遅くなっていた。
どうやらSub_ProgressBar_Incrementを実行する度に毎回DoEvents処理が動いて制御が奪われていた模様。
現在の表示内容と変化がなかったら処理をスキップをするように修正したら、満足行く速度になった。
これなら基本的にバーサイズの200回しか(%表示とのズレでプラスαある)レンダリングしないので、そんなに処理を奪われない。
プログレスバーを自作したけど、アリとナシじゃ処理スピードが違うぜ。って人は試してみて。
2025/07/09 追記
よく見たらOfficeのバージョンが2013。2016ではなく前のプロダクトキーを入れたっぽい。
ということで、2016をインストールした。
とりあえず、VBAの編集画面をイジってみたら、ProgressBarコントロールが参照設定できて普通にプログレスバーが動いた。
なぜ?自作VBAを一生懸命修正したのに(涙)。俺の苦労はなんだったんだ?
2013の64bitはダメで2016の64bitはOKってこと?
2025/07/09 追記
よく見たらOfficeのバージョンが2013。2016ではなく前のプロダクトキーを入れたっぽい。
ということで、2016をインストールした。
とりあえず、VBAの編集画面をイジってみたら、ProgressBarコントロールが参照設定できて普通にプログレスバーが動いた。
なぜ?自作VBAを一生懸命修正したのに(涙)。俺の苦労はなんだったんだ?
2013の64bitはダメで2016の64bitはOKってこと?