【入門編】進捗状況のリアルタイム表示:大容量処理時のDoEvents活用とステータスバー更新の実装 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAを掌握する:数千のシェイプを「凍らせない」プロの進捗表示術

こんにちは。業務自動化の深淵へようこそ。

Visioで数百ページ、数千シェイプを扱うマクロを書いたとき、画面が白く固まり「応答なし」と表示された経験はありませんか?あれは単にプログラムが重いのではなく、「OSとの対話」を放棄しているから起こる現象です。

今回は、マクロの記録から一歩先へ進み、ユーザーを不安にさせない「プロフェッショナルな進捗表示」の実装方法を伝授します。ここをマスターすれば、あなたのツールは単なる「作業効率化スクリプト」から「堅牢な業務アプリケーション」へと昇華します。

1. なぜマクロは「凍る」のか?

Windowsのアプリケーションは、OSから送られてくる「再描画要求」や「入力イベント」を常に処理しています。しかし、VBAで重いループ処理を回すと、CPUがその計算に占有され、画面の更新やマウス操作を受け付ける余裕がなくなります。

これを解消する鍵が、`DoEvents` という関数です。これは「一時的にOSに制御を戻し、溜まっているイベントを処理させる」ための魔法のコマンドです。

2. 鋼鉄の進捗表示:実装コード

以下のコードは、全シェイプを走査して処理を行う際のテンプレートです。これをベースにカスタマイズしてください。

Sub ProcessShapesWithProgress()
Dim shp As Visio.Shape
Dim pg As Visio.Page
Dim totalShapes As Long
Dim currentShape As Long
Dim progress As Double

‘ 1. 対象シェイプの総数をカウント(事前に概算しておくことが重要)
totalShapes = ActiveDocument.Pages.Count 50 ‘ ※例:簡易的に見積もり
currentShape = 0

‘ ステータスバーを表示開始
Application.StatusBar = “処理を開始します…”

For Each pg In ActiveDocument.Pages
For Each shp In pg.Shapes
‘ — ここに本来の重い処理を記述 —
‘ 例: shp.Text = “Processed”
‘ ——————————–

currentShape = currentShape + 1

‘ 2. 10回に1回だけ更新(頻繁すぎると逆に遅くなる)
If currentShape Mod 10 = 0 Then
progress = (currentShape / totalShapes) 100
‘ ステータスバーに現在状況を表示
Application.StatusBar = “進捗: ” & Format(progress, “0.0”) & “% 完了 – 現在のページ: ” & pg.Name

‘ 3. OSに制御を戻す(ここが最重要!)
DoEvents
End If
Next shp
Next pg

‘ 終了処理
Application.StatusBar = “処理が正常に完了しました。”
MsgBox “全シェイプの処理が完了しました。”
End Sub

3. 知的アーキテクトからのアドバイス

① `DoEvents` は「使いすぎ」に注意

`DoEvents` は強力ですが、毎回呼び出すとオーバーヘッド(無駄な待ち時間)で処理速度が極端に低下します。上のコードのように `Mod`(剰余演算子)を使って「10回に1回」「100回に1回」の頻度で呼び出すのが、パフォーマンスと視認性のバランスを取る「プロの加減」です。

② ステータスバーのクリアを忘れずに

処理が完了した後は、必ず `Application.StatusBar = “”` と記述してステータスバーを空に戻してください。これを忘れると、他のユーザーがファイルを開いたときに「前回の残骸」が残り続け、非常に不親切な印象を与えます。

③ ユーザーの「中断」を許容する

もっと高みを目指すなら、処理中に「キャンセル」ボタンを実装することも可能です。`DoEvents` を呼ぶタイミングで、特定のキー(Escキーなど)が押されていないかを監視する仕組みを入れると、さらに洗練されたツールになります。

まとめ:ここをクリアすれば、もう怖くない

今回お伝えした手法は、以下の3つのステップに集約されます。

1. 総数を把握し、進捗率を計算する
2. `Application.StatusBar` でユーザーに現在の状況を伝える
3. 適度な間隔で `DoEvents` を挿入し、アプリケーションの呼吸を止めない

このサイクルを身につければ、数千シェイプの処理も恐れることはありません。あなたの書いたVBAが、ただ動くだけでなく、使っていて心地よい「ツール」へと変わる瞬間です。

さあ、次はどのオブジェクトを自動化しましょうか? 次回の記事では、Visioの「イベントハンドラ」を使って、シェイプが動かされた瞬間に自動で処理を走らせる高度な技術についてお話しします。

それでは、素晴らしい自動化ライフを!

タイトルとURLをコピーしました