こんにちは!Visio VBAの世界へようこそ。
マクロの記録ボタンを押して「なんとなく動いたけれど、中身を見たら呪文書みたいでチンプンカンプン……」そんな時期、誰にだってありますよね。
ここをクリアすれば、あなたも脱・初心者!今回は、実務の現場でめちゃくちゃ役立つ「ページの誤削除防止&監査ログ出力」という、ちょっとプロっぽい安全策を一緒に実装していきましょう。
「大切な図面ページをうっかり消してしまった!」という冷や汗もののトラブルを、VBAの力でスマートに防ぎつつ、誰がいつどのページを消したのかを記録する仕組みを作ります。優しく丁寧に解説していくので、リラックスしてついてきてくださいね。
—
なぜVisioのページ削除には「安全策」が必要なのか?
ExcelやWordなら「Ctrl + Z」で直前の操作に戻せますが、VisioのVBAでページを削除 (`Page.Delete`) すると、原則として「元に戻す(Undo)」が効きません。
うっかりループ処理の条件を間違えて、図面のページがすべて消え去ってしまったときの絶望感といったら……想像するだけでも恐ろしいですよね。
だからこそ、実務で自動化マクロを組むときは、「本当に消していいですか?」という人間の目のチェック(確認ダイアログ)と、「いつ誰が消したか」の足跡(ログ出力)が絶対に不可欠なのです。
—
今回実装するシステムの仕様
1. 対象ページの存在チェック: 指定した名前のページが本当に存在するか確認する。
2. 誤削除防止ダイアログ: 「本当にこのページを消していいですか?」とユーザーに警告を出す。
3. 外部テキストへのログ出力: 削除を実行した場合、日時とページ名をPC内のテキストファイル(CSVなど)に書き出す。
4. 安全な削除実行: すべての条件をクリアした場合のみ、ページを消去する。
—
実践!安全なページ削除&ログ出力マクロのコード
以下のコードを、VisioのVBAエディタ([Alt] + [F11])の標準モジュールに貼り付けてください。コピペですぐに動かせるように、隅々までコメントを入れています。
Option Explicit
‘ ==============================================================================
‘ 【実務直結】ページ誤削除防止 & 監査ログ出力マクロ
‘
‘ 概要: 指定したページ名を安全に削除し、その履歴をテキストファイルに残します。
‘ ==============================================================================
Public Sub SafeDeletePageWithLog()
‘ — 1. 変数の宣言 —
Dim targetPageName As String
Dim targetPage As Visio.Page
Dim userResponse As VbMsgBoxResult
Dim fso As Object
Dim logFile As Object
Dim logFilePath As String
Dim logMessage As String
‘ 削除したいページの名前をここに指定(実務では変数やセルの値から取得します)
targetPageName = “詳細設計_Old”
‘ — 2. 対象ページが存在するかチェック —
On Error Resume Next
Set targetPage = ActiveDocument.Pages(targetPageName)
On Error GoTo 0 ‘ エラートラップを通常に戻す
If targetPage Is Nothing Then
MsgBox “指定されたページ「 ” & targetPageName & ” 」は存在しません。”, vbExclamation, “ページが見つかりません”
Exit Sub
End If
‘ — 3. 【誤削除防止】確認ダイアログの表示 —
userResponse = MsgBox( _
“警告: ページ「 ” & targetPageName & ” 」を完全に削除しようとしています。” & vbCrLf & _
“この操作は元に戻せません。本当に削除しますか?”, _
vbYesNo + vbExclamation + vbDefaultButton2, _
“【重要】ページ削除の確認” _
)
‘ 「いいえ」が選ばれた場合は、ここで処理を中断
If userResponse = vbNo Then
MsgBox “ページの削除をキャンセルしました。”, vbInformation, “キャンセル”
Exit Sub
End If
‘ — 4. 外部テキストへのログ出力処理 —
‘ ※今回はデスクトップに「VisioDeleteLog.txt」というファイルを出力します
logFilePath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\VisioDeleteLog.txt”
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ログファイルを開く(存在しない場合は新規作成、存在する場合は追記モード「ForAppending: 8」)
On Error GoTo LogError
Set logFile = fso.OpenTextFile(logFilePath, 8, True)
‘ ログの文字列を作成(日時, 図面名, ページ名, ユーザー名)
logMessage = Format(Now, “yyyy/mm/dd hh:nn:ss”) & _
” | 削除実行 | 図面: ” & ActiveDocument.Name & _
” | ページ: ” & targetPageName & _
” | 実行者: ” & Environ(“USERNAME”)
‘ ファイルに書き込み
logFile.WriteLine logMessage
logFile.Close
Set logFile = Nothing
Set fso = Nothing
‘ — 5. ページの削除実行 —
targetPage.Delete
MsgBox “ページ「 ” & targetPageName & ” 」を削除し、ログを記録しました。”, vbInformation, “処理完了”
Exit Sub
LogError:
MsgBox “ログファイルの書き込み中にエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
If Not logFile Is Nothing Then logFile.Close
Set logFile = Nothing
Set fso = Nothing
End Sub
—
コードの注目ポイント(ここが分かれば怖くない!)
① `On Error Resume Next` による安全な存在確認
Visioでは、存在しないページ名を指定して取得しようとすると、容赦なく実行時エラー(クラッシュに近い状態)で止まってしまいます。
ここでは、あえてエラーを一時的に無視させ (`On Error Resume Next`)、`targetPage` が `Nothing`(空っぽ)のままであれば、「ページがありませんよ」と優しく教える親切設計にしています。
② `vbDefaultButton2` で誤爆を防ぐ
確認ダイアログ(`MsgBox`)を出すとき、人間はつい焦って「Enterキー」を連打してしまいがちです。
もし「はい」が初期選択(デフォルト)になっていると、Enter連打でうっかりページが消えてしまいますよね。
そこで `vbDefaultButton2` を指定し、初期フォーカスを「いいえ(No)」にあらかじめ合わせておくのが、プロのエンジニアの心遣いです。
③ FileSystemObject (FSO) によるログの追跡
「誰がいつ消したか」を証明するため、Windowsの標準機能である `Scripting.FileSystemObject` を使って、デスクトップのテキストファイルに記録を残しています。
`Environ(“USERNAME”)` を使えば、現在パソコンを操作しているWindowsのログインアカウント名が自動で取得できるため、チームでの共有フォルダ運用などで非常に強力な監査証跡になります。
—
よくあるつまずきポイントと対策
- Q. 「コンパイルエラー: ユーザー定義型は定義されていません」と出る
- A. コードの最初にある `Visio.Page` などの記述で引っかかっている可能性があります。今回はバインドを安定させるため、オブジェクト型を明示していますが、もし動かない場合は `Dim targetPage As Object` のように型を `Object` に変更してみてください。
- Q. ログファイルが作成されない
- A. 社内のセキュリティポリシーやOneDriveの同期フォルダの仕様によって、デスクトップへの直接書き込みが制限されている場合があります。その場合は `logFilePath` の保存先を `C:\Temp\VisioDeleteLog.txt` など、書き込み権限のあるローカルフォルダに変更してみてください。
—
まとめ:ここをクリアすれば、Visio VBAの基本はバッチリ!
今回は、ページ削除という「一歩間違えると危ない操作」を題材に、
- エラーを未然に防ぐ防御的プログラミング
- 人間のミス(Enter連打)をカバーするUI設計
- 外部ファイルへのログ出力という実務的なトレーサビリティ
を学びました。
この「安全への配慮」ができるようになると、あなたが書くVBAマクロは、単なる「動くコード」から、現場で愛される「信頼できるツール」へと生まれ変わります。
ぜひ、ご自身の開発環境でも試してみてくださいね。それでは、次回の記事でお会いしましょう!
