【入門編】【実務中級】AcadDocument.Database.SummaryInfoの「最終更新者」と「編集時間」を抽出し、図面稼働率を分析する – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは! AutoCAD VBAの深淵へようこそ。
今回は、実務で絶対に役立つ「図面プロパティの裏側に隠されたデータマイニング」をテーマに、少し踏み込んだ話をしようと思います。

「マクロの記録」でボタン操作を自動化するステップはもう卒業しましたよね?
ここからは、AutoCADの心臓部である「オブジェクトモデル」とダイレクトに対話し、図面のメタデータを自在に操るエンジニアの世界へ足を踏み入れましょう。

今回のゴールは、複数の図面ファイルから「最終更新者」と「編集時間(工数)」を自動抽出し、設計現場の「図面稼働率」を丸裸にすることです。
ここをクリアすれば、あなたのAutoCAD VBAのスキルは間違いなく中級者の域に達します。さあ、一緒に本質を紐解いていきましょう!

—

1. なぜ「編集時間」と「最終更新者」なのか?

「図面を1枚仕上げるのに、実際どれくらいの時間がかかっているのか?」
管理職やプロジェクトマネージャーなら誰もが知りたいデータです。しかし、多くの現場では「感覚」でスケジュールが組まれています。

実は、AutoCADのすべての図面(`.dwg`)には、`Database.SummaryInfo` という図面情報データベースの要塞が備わっています。ここには、人間が意識せずともAutoCADが裏でこつこつと記録し続けた以下のデータが眠っています。

  • 最終更新者 (LastSavedBy): 誰がその図面を最後に触ったか
  • 編集時間 (TimeElapsed): その図面を開いて作業していた総累積時間(分単位など)

このデータをVBAでバッチ抽出すれば、「どの図面に過大な工数が割かれているか」「誰がどの程度稼働しているか」を定量的に可視化できます。これが「図面稼働率の分析」の正体です。

—

2. AutoCADオブジェクトモデルの構造を理解する

まずは、今回私たちがハックするオブジェクトの階層図(メンタルモデル)を頭に叩き込んでください。ここを間違えると、VBAは途端に沈黙します。

AcadApplication (AutoCAD本体)
┗ Documents (現在開いている図面のコレクション)
┗ AcadDocument (対象の図面)
┗ Database (図面の根幹データ)
┗ SummaryInfo (要約情報: ここに目的のデータがある!)

ポイントは、`AcadDocument` の直下ではなく、`Database` という一段深い階層を経由するという点です。AutoCADのAPI設計において、図面の幾何情報(線や円)と、管理情報(プロパティ)はデータベース層で綺麗に分離されています。この構造美を理解することが、一流のAutoCADプログラマーへの第一歩です。

—

3. 実装コード:図面プロパティ抽出エンジン

それでは、実際に動くコードをお見せします。
今回は、「現在開いているアクティブな図面」からサマリー情報を取得し、イミディエイトウィンドウに出力する基本形と、実務で使える発展形を解説します。

以下のコードをVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてください。

Option Explicit

‘ ==============================================================================
‘ 担当者・工数分析のコアプロシージャ
‘ ==============================================================================
Public Sub AnalyzeDrawingWorkload()
Dim acadDoc As AcadDocument
Dim summaryInfo As AcadSummaryInfo

‘ 1. エラーハンドリングの準備(図面が開かれていない場合の対策)
On Error GoTo ErrorHandler

If Application.Documents.Count = 0 Then
MsgBox “分析対象の図面が開かれていません。”, vbExclamation, “稼働率分析”
Exit Sub
End If

‘ 2. アクティブな図面ドキュメントを取得
Set acadDoc = Application.ActiveDocument

‘ 3. Database経由でAcadSummaryInfo(要約情報オブジェクト)を取得
‘ ※ここが今回の最大のキモです!
Set summaryInfo = acadDoc.Database.SummaryInfo

‘ 4. 変数の宣言と値の取得
Dim author As String
Dim lastSavedBy As String
Dim editTimeMinutes As Long
Dim docTitle As String

‘ 各プロパティを安全に取得
summaryInfo.GetAuthor author
summaryInfo.GetLastSavedBy lastSavedBy

‘ 編集時間は「ミリ秒」または特殊な形式で保持されているため、分単位に変換
‘ ※注意:SummaryInfoの仕様により環境で挙動が異なる場合がありますが、基本は分数換算です
editTimeMinutes = summaryInfo.TimeElapsed

‘ タイトル(未設定の場合はファイル名で代用)
docTitle = acadDoc.Name

‘ 5. イミディエイトウィンドウに出力(Excelへの転記やCSV出力へ拡張可能)
Debug.Print “========================================”
Debug.Print “■ 図面ファイル名 : ” & docTitle
Debug.Print “■ 作成者 : ” & IIf(author = “”, “(未設定)”, author)
Debug.Print “■ 最終更新者 : ” & IIf(lastSavedBy = “”, “(不明)”, lastSavedBy)
Debug.Print “■ 累積編集時間 : ” & editTimeMinutes & ” 分 (” & Format(editTimeMinutes / 60, “0.0”) & ” 時間)”
Debug.Print “========================================”

MsgBox “図面データの抽出に成功しました!” & vbCrLf & _
“詳細はイミディエイトウィンドウ(Ctrl+G)を確認してください。”, vbInformation, “完了”

Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub

コードの解説とエンジニアの知見

  • `acadDoc.Database.SummaryInfo`: これこそが今回の主役です。図面自体の寿命(Lifecycle)と同期しており、図面が閉じられるまでメモリ上で安全に保持されます。
  • `summaryInfo.GetAuthor` / `GetLastSavedBy`: プロパティの取得に「メソッド(引数を渡して取得する形式)」を使っている点に注目してください。COMコンポーネントの仕様上、直接イコールで代入できないプロパティがあるため、このようなラッパーメソッドが用意されています。

—

4. 陥りやすい罠と実務上の注意点(ここが重要!)

初学者がこのテーマに挑むとき、必ずと言っていいほど以下の壁にぶつかります。先輩エンジニアからのアドバイスとして心に留めておいてください。

罠①:「図面を開かずに」一括処理したいという誘惑

「フォルダ内の全DWG(100ファイル)をVBAで一瞬で集計したい!」と思いますよね。
しかし、AutoCAD VBAのセキュリティとオブジェクトモデルの仕様上、図面をバックグラウンド(またはフォアグラウンド)で一度 `Open` しないと、`Database` にアクセスできません。
もし大量の図面を処理したい場合は、`Application.Documents.Open(filePath, True)` で読み取り専用(ReadOnly)として次々に開き、サマリーを回収して即座に閉じるというバッチ処理ロジックを組む必要があります。

罠②:編集時間(TimeElapsed)の正確性

`TimeElapsed` プロパティは、「その図面がAutoCAD上でアクティブに開かれて編集された累積時間」を保持していますが、ユーザーが図面を開いたまま放置した場合や、クラッシュして強制終了した場合には、正確な時間が記録されないことがあります。
あくまで「目安としての工数管理(大まかな傾向分析)」として使うのが、実務におけるスマートな付き合い方です。

—

5. さらに先へ進むために(発展的なアイデア)

今回取得したデータ(図面名、最終更新者、編集時間)を、イミディエイトウィンドウに出力するだけで終わらせてはもったいない!
ここから先は、あなたのアイデア次第でいくらでも自動化の帝国を広げることができます。

1. Excelとの連携(COMオートメーション):
VBAからExcelをバックグラウンドで起動し、取得したデータを自動で表形式(レポート)にまとめ、社内共有フォルダにCSVとして吐き出す。
2. フォルダ一括巡回(FSOの活用):
`Scripting.FileSystemObject` を使って、指定したプロジェクトフォルダ内のすべての `.dwg` ファイルを再帰的に検索し、夜間に自動で稼働率を集計する。

—

まとめ

今回は、`AcadDocument.Database.SummaryInfo` を使った図面メタデータの抽出と、図面稼働率分析の基本を解説しました。

「マクロの記録」の向こう側にある、オブジェクトモデルを統べる快感を感じていただけたでしょうか?
ここをクリアすれば、あなたは単なる「CADオペレーター」ではなく、設計プロセスの自動化をデザインする「業務自動化エンジニア」の仲間入りです。

日々の退屈な集計作業はマクロに任せて、あなたにしかできないクリエイティブな設計業務に時間を使いましょう。それでは、また次のエンジニアリングでお会いしましょう!

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