June 17, 2025

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

250617-PBar04ToolBox
PCを買い替えてOfficeをインストール、Excel VBAを実行だ。エラー!え、何?
どうやらOfficeの64bit版がインストールされた模様。
それでVBAで使われているProgressBarコントロールが64bit版ではサポートされてないとか、なんとか。
マジか?プログレスバーって使われてないの?マイナーなの?

250617-PBar03PBar
▲ プログレスバーがエラーで使えない!

250617-PBar06PBarControl
▲ Office 64bit版ではProgressBar Controlが使えない

という事で調査開始。
いつサポート切られるかわからん、自作しろ。だって。

下の所にあるStatusバーに『■■□□□□』四角を並べてバーっぽく表示するか。
それ用のFormを作るか。
簡単で手っ取り早いのは前者。
ちょっと見た目重視なら後者。かな。

250617-PBar05StatusBar
▲ ステータスバーに四角の文字をバー代わりに

削除してほっとこうかと思ったけど、今後仕事で使っているVBA類が次々にエラーになる事を考えると対策は練っておこうという事で作ってみた。

では、作り方。
作るのがメンドウな方は下記アドレスからモジュールをダウンロードしてインポートしてください。
ダウンロードはコチラから

まずForm(frmProgressBar)を作成。

Frame(fraPBar)を貼り付ける。
Captionを削除。
SpecialEffectを2-fmSpecialEffectSunkenにする。
Widthを200にする。

Label(lblPBar)をフレームの上に貼り付ける。
Captionを削除。
Widthを200にする。(フレームとサイズをあわせる)
BackColorを好きな色に変更。

250617-PBar01MakeEdit
▲ フォームを作成

モジュール(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
処理が終了したら、プログレスバーのフォームを閉じる。

以上。

250617-PBar02MakePBar
▲ 自作プログレスバー

ネットで見かけるサンプルで作ってみたら、プログレスバーを表示する表示しないで処理が数倍遅くなっていた。
どうやらSub_ProgressBar_Incrementを実行する度に毎回DoEvents処理が動いて制御が奪われていた模様。
現在の表示内容と変化がなかったら処理をスキップをするように修正したら、満足行く速度になった。
これなら基本的にバーサイズの200回しか(%表示とのズレでプラスαある)レンダリングしないので、そんなに処理を奪われない。

プログレスバーを自作したけど、アリとナシじゃ処理スピードが違うぜ。って人は試してみて。

2025/07/09 追記
よく見たらOfficeのバージョンが2013。2016ではなく前のプロダクトキーを入れたっぽい。
ということで、2016をインストールした。
とりあえず、VBAの編集画面をイジってみたら、ProgressBarコントロールが参照設定できて普通にプログレスバーが動いた。
なぜ?自作VBAを一生懸命修正したのに(涙)。俺の苦労はなんだったんだ?
2013の64bitはダメで2016の64bitはOKってこと?





    このエントリーをはてなブックマークに追加 mixiチェック

コメントする

名前
 
  絵文字
 
 
Counter
  • 今日:
  • 昨日:
  • 累計:

Counter

    Archives
    Categories
    記事検索
    QR Code
    QRコード
    ギャラリー
    • Excel VBA 64bit版でエラーになったので、プログレスバーを自作する
    • Excel VBA 64bit版でエラーになったので、プログレスバーを自作する
    • Excel VBA 64bit版でエラーになったので、プログレスバーを自作する
    • Excel VBA 64bit版でエラーになったので、プログレスバーを自作する
    • Excel VBA 64bit版でエラーになったので、プログレスバーを自作する
    • Excel VBA 64bit版でエラーになったので、プログレスバーを自作する
    • PCを買い替えた 2025
    • Wi-Fiルーターを買い替えた 2025
    • Wi-Fiルーターを買い替えた 2025
    • Wi-Fiルーターを買い替えた 2025
    • Wi-Fiルーターを買い替えた 2025
    • Wi-Fiルーターを買い替えた 2025
    • Xiaomi(シャオミ)のビジネスバックパックを買ったのでポケットのサイズを測ってみた
    • Xiaomi(シャオミ)のビジネスバックパックを買ったのでポケットのサイズを測ってみた
    • Xiaomi(シャオミ)のビジネスバックパックを買ったのでポケットのサイズを測ってみた
    GEMS RSS
    Recent Comments
    楽天
    楽天で探す
    楽天市場
    • ライブドアブログ