AutoCAD VBAを掌握せよ:`SummaryInfo`で築く「自動トレーサビリティ」の極意
AutoCADの運用において、最も頭を悩ませるのが「この図面、結局誰が作ったんだ?」という属人性の問題だ。図面プロパティの「作成者」欄が空欄、あるいは前任者の名前のまま放置されている図面を、君はいくつ見てきただろうか。
今回は、VBAを用いてPCのログイン名と連動し、図面を開く(または保存する)たびにプロパティを自動更新する「自動スタンプ機能」の実装を伝授する。
単なるコードの紹介ではない。現場の運用で「二度と手作業でプロパティを編集させない」ための、堅牢なアーキテクチャの解説だ。
—
1. なぜ「手動更新」は敗北するのか
非効率なエンジニアは、図面プロパティの入力を人間に依存させる。だが、人間は忘れるし、嘘をつく。
我々が目指すべきは「環境情報の自動取得」と「オブジェクトモデルの直接操作」の統合である。VBAの`Environ`関数でOSからログイン名を引き抜き、`AcadDocument.SummaryInfo`オブジェクトに流し込む。このプロセスを自動化することで、人的ミスを物理的に排除する。
2. 実装の要:SummaryInfoの真価
AutoCADの図面プロパティは、`AcadDocument`オブジェクトの配下にある`SummaryInfo`を通じて操作する。注意すべきは、このオブジェクトが図面ファイルと密接に紐付いている点だ。
プロダクションコード:AutoStamp実装
以下のコードは、現在のログインユーザーを「作成者」フィールドに強制的に書き込むモジュールだ。
Option Explicit
‘ ———————————————————
‘ @brief: 現在のPCログイン名をSummaryInfoの作成者に反映する
‘ @author: Chief Architect
‘ ———————————————————
Public Sub UpdateDrawingAuthor()
Dim doc As AcadDocument
Dim sumInfo As AcadSummaryInfo
Dim userName As String
‘ 現在のアクティブドキュメントを取得
Set doc = ThisDrawing
‘ Environ関数でOSのログイン名を取得
‘ “USERNAME”環境変数はWindows標準であり、信頼性が高い
userName = Environ(“USERNAME”)
‘ SummaryInfoオブジェクトを取得
Set sumInfo = doc.SummaryInfo
‘ 作成者プロパティを更新
‘ 既に値が入っている場合でも上書きを行う(最新の責任者を担保するため)
On Error Resume Next ‘ 万が一のアクセス権限エラーを抑制
sumInfo.Author = userName
If Err.Number <> 0 Then
Debug.Print “プロパティの更新に失敗しました: ” & Err.Description
Else
Debug.Print “作成者を ” & userName & ” に更新しました。”
End If
On Error GoTo 0
‘ 重要: 更新後は必ず図面を保存する必要がある
‘ 保存を自動化すべきかは運用ルールと相談すること
‘ doc.Save
End Sub
—
3. アーキテクトからの忠告:3つの注意点
このコードを実務に導入する際、以下の3点を徹底しなければシステムは崩壊する。
① 実行トリガーの設計
このマクロを「ボタンを押して手動実行」させてはならない。そんな運用は誰も守らない。
AutoCADの`AcadDocument_BeginSave`(保存直前イベント)や、`AcadDocument_Activate`(図面を開いた直後のイベント)と組み合わせるのがベストプラクティスだ。`ThisDrawing`モジュールのイベントハンドラを活用せよ。
② 環境変数の罠
`Environ(“USERNAME”)`は、PCのローカルアカウント名を取得する。もし社内でActive Directoryを運用しており、「氏名」を正確に取得したい場合は、WMI(Windows Management Instrumentation)を用いたネットワークユーザー名の取得を検討すべきだ。`Environ`はあくまで「PCのログイン名」であることを忘れるな。
③ 読み取り専用ファイルへの配慮
ネットワーク共有フォルダ上の「読み取り専用」ファイルに対してこのマクロを実行すると、エラーが発生する。コードの冒頭で`doc.ReadOnly`をチェックし、実行をスキップする条件分岐を入れるのが、プロの設計というものだ。
—
4. 次のステップ:トレーサビリティの深化
この仕組みを導入すれば、図面プロパティを見れば「誰が触ったか」が一目瞭然になる。さらに一歩進むなら、`SummaryInfo.Comments`(コメント欄)に「更新日時」をタイムスタンプとして追記するように拡張するのもいいだろう。
「自動化」とは、単に楽をすることではない。
「管理という名の労働」をソフトウェアにアウトソースし、君自身はもっとクリエイティブな設計業務に注力することだ。
これが、現場を制するエンジニアの思考様式である。早速、君の図面管理環境にこのロジックを組み込んでみてくれ。結果は必ずついてくる。
