こんにちは! Visioでの図面作成、いつもお疲れ様です。
設計図やフローチャートをいざ印刷したりPDF化したりする段階になって、「あれ? 全ページのヘッダーやフッターに、作成者や機密区分を入れるのって、手作業だと面倒だな…」と途方に暮れた経験はありませんか?
マクロの記録ボタンを押して操作しても、なぜかヘッダーやフッターの設定だけは記録されない。Visio VBAの壁にぶつかる人が最初に絶望するポイントが、まさにこの「ヘッダー・フッター制御」です。
でも、安心してください。今日ここをクリアすれば、あなたのVisio VBAスキルは「初学者」の領域を抜け出し、ドキュメントの標準化とセキュリティ統制を意のままに操るエンジニアの扉を開くことになります。
今回は、全ページに対して「作成者」「改訂日」「機密区分」を美しく一括自動挿入する、現場で即戦力となる極限のテクニックを伝授しますね!
—
1. なぜVisioのヘッダー・フッター設定は難しいのか?
ExcelやWordであれば、UIから簡単にヘッダー・フッターを設定できますよね。しかし、Visioのオブジェクトモデルにおいて、`HeaderFooter` プロジェクトの制御は、少し特殊なバックグラウンドを持っています。
Visioのドキュメント(`Document` オブジェクト)には、印刷時のレイアウトを司る専用のプロパティが存在しますが、実はこれ、「文字列をそのままポンと放り込むだけでは動かない罠」や、「マスターページや図面ページのライフサイクルとの絡み」があります。
マクロの記録が効かないのは、これがVisioの内部的な描画エンジンと深く結びついた特殊なプロパティだからです。だからこそ、我々エンジニアがVBAでコードを書き、コントロールしてあげる必要があるのです。
—
2. 実装の全体像とアプローチ
今回は、アクティブなドキュメントに対して、以下の情報を一発で設定するプロシージャを作成します。
- 左側 (Left Header/Footer): ドキュメント名 または 機密区分(例: `【社外秘】CONFIDENTIAL`)
- 中央 (Center Header/Footer): ページ番号(Visio標準のフィールドコードを使用)
- 右側 (Right Header/Footer): 作成者 & 改訂日(今日の日付)
これらを、`ActiveDocument.HeaderFooter` オブジェクトを介して流し込みます。
—
3. 実用VBAコード:全ページ一括ヘッダー・フッター自動設定
以下のコードを、VisioのVBAエディタ(`Alt + F11` で起動)の標準モジュールに貼り付けて実行してください。開発現場でそのままコピペして使えるよう、細かくコメントを入れています。
Option Explicit
”’
”’ 自動一括設定するプロシージャ
”’
Sub SetDocumentHeaderFooter()
‘ エラーハンドリングの基本:予期せぬオブジェクト消失に備える
On Error GoTo ErrorHandler
Dim doc As Visio.Document
Set doc = ActiveDocument
‘ ドキュメントが開かれていない場合のガード
If doc Is Nothing Then
MsgBox “有効なVisioドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If
‘ 【重要】VisioのHeaderFooterオブジェクトを取得し、一括設定を行う
With doc.HeaderFooter
‘ — ヘッダーの設定(上部) —
‘ 左側:機密区分とセキュリティ警告
.HeaderLeft = “【社外秘 / CONFIDENTIAL】”
‘ 中央:空白(必要に応じて文字列を追加可能)
.HeaderCenter = “”
‘ 右側:ファイル名を表示(Visioのフィールドコードを使用)
‘ &F はファイル名を動的に取得するVisio独自のコードです
.HeaderRight = “ファイル名: &F”
‘ — フッターの設定(下部) —
‘ 左側:作成者情報
.FooterLeft = “作成者:情シス太郎 (DevOps部)”
‘ 中央:ページ番号を表示(&P = 現在のページ, &N = 総ページ数)
.FooterCenter = “Page &P of &N”
‘ Right:改訂日(今日の日付を自動挿入)
‘ Format関数を使って「YYYY/MM/DD」形式に整形
.FooterRight = “改訂日: ” & Format(Date, “YYYY/MM/DD”)
End With
‘ 変更を反映するために、画面を再描画(またはビューを更新)
doc.ForceSaveAs = doc.Path & doc.Name ‘ ※保存は強制しませんが状態更新のトリガーとして
MsgBox “ヘッダー・フッターの設定が正常に完了しました!” & vbCrLf & _
“印刷プレビューで確認してください。”, vbInformation, “完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
4. コードの深掘り解説:ここがエンジニアの急所!
初心者の方に向けて、コード内の重要なポイントをいくつか噛み砕いて解説しますね。
① `ActiveDocument.HeaderFooter` の存在
ページ(`Page`)ごとではなく、ドキュメント(`Document`)レベルで設定するのがVisioの仕様です。これにより、ドキュメント内の全ページ(何ページあろうとも)に一瞬で同じルールが適用されます。社内標準化においては、この「一括性」が何よりも強力な武器になります。
② Visio独自の「フィールドコード」(`&F`, `&P`, `&N`)
コードの中で `&F` や `&P` という見慣れない文字が出てきましたね。
これらはVisioが内部で持っている特殊な変数(フィールドコード)です。
- `&F` : 現在のファイル名(File)
- `&P` : 現在のページ番号(Page)
- `&N` : 総ページ数(Number of pages)
これを仕込んでおくことで、ファイル名が変わったり、ページが追加・削除されたりしても、動的に正しい値が印刷・PDF出力時にレンダリングされます。
③ `Format(Date, “YYYY/MM/DD”)` による日付の固定化
VBAの `Date` 関数は強力ですが、そのまま出力するとPCのOS設定(和暦やUSフォーマットなど)に引きずられてしまいます。`Format` 関数でラップすることで、社内ドキュメントとして最も好まれる「YYYY/MM/DD」形式に強制整形し、品質を担保しています。
—
5. 陥りやすい罠とトラブルシューティング
現場でこのコードを運用する際、エンジニアがハマりがちなポイントを先回りして共有しておきます。
- 罠1:「設定したのに、画面上の図面エリアに文字が出てこない!」
- 原因: ヘッダー・フッターは、あくまで「印刷時およびPDF出力時」に表示される領域です。通常の編集画面では見えないのが仕様ですので慌てずに。
- 対策: `[ファイル]` > `[印刷]` (または印刷プレビュー)を開いて、意図通りに配置されているかを確認してください。
- 罠2:「読み取り専用(Read-Only)のドキュメントでエラーになる」
- 原因: テンプレートや共有サーバー上のファイルを直接開いている場合、変更が書き込めません。
- 対策: プロシージャの冒頭で `doc.ReadOnly` などをチェックするか、事前にローカルに名前をつけて保存した状態で実行するように運用ルールを決めましょう。
—
まとめ:ここをクリアすればVisio VBAは怖くない!
今回は、`Document.HeaderFooter` プロパティを駆使して、全ページへのメタデータ(作成者・改訂日・機密区分)の一括自動挿入を実現しました。
手作業でのコピペ地獄や、バージョン管理のミスとは今日でお別れです。このマクロを会社の共通テンプレート(`.vstm`)に組み込んでおけば、メンバー全員がボタン一つで「完璧なセキュリティとフォーマット」を備えた図面を出力できるようになります。
ここをクリアしたあなたなら、もうVisio VBAの基礎はバッチリです!
ぜひ、日々の業務自動化にこの知見を役立ててくださいね。あなたのエンジニアライフを、これからも応援しています!
