AutoCAD VBAを極める:サムネイル自動生成による「脱・属人化」管理台帳の構築
AutoCADの図面管理において、最も非効率な作業の一つが「中身を確認するためにいちいち図面を開くこと」だ。設計担当者が数百枚のDWGを前に、サムネイルのないエクセル台帳と格闘する姿を想像してほしい。それはエンジニアリングではない。ただの労働だ。
今日は、AutoCADのオブジェクトモデルを深く理解し、`AcadApplication`を制御して図面のプレビュー画像を自動生成する「真の自動化」を伝授する。これは単なるコードの紹介ではない。運用に耐えうる「堅牢な設計」の話だ。
—
1. なぜ「力技の制御」は失敗するのか
多くの入門者は、`SendKeys`を使ってキー入力をエミュレートしようとする。断言しよう。それは「時限爆弾」だ。OSのフォーカスやウィンドウの応答速度に依存するコードは、環境が変われば必ず動かなくなる。
我々が取るべきアプローチは、AutoCAD API(ActiveX/COM)による直接制御である。
- `WindowState`によるウィンドウの最大化・正規化。
- `ZoomExtents`による画面全体表示。
- `AcadDocument.Export`を用いた高精度な書き出し。
これらを組み合わせ、非同期的な干渉を排除した設計こそが、プロダクションコードの最低条件だ。
—
2. 実装の核心:堅牢なサムネイル生成関数
以下のコードは、単に動くだけではない。エラー発生時のクリーンアップや、アプリケーションの安定性を考慮した設計になっている。
‘ 必要なライブラリ参照: AutoCAD Type Library
Option Explicit
Public Sub GenerateThumbnail(ByVal dwgPath As String, ByVal outputPath As String)
Dim acadApp As AcadApplication
Dim doc As AcadDocument
‘ エラーハンドリングの徹底:途中でクラッシュしてもAutoCADを放置しない
On Error GoTo Cleanup
Set acadApp = GetObject(, “AutoCAD.Application”)
Set doc = acadApp.Documents.Open(dwgPath, True) ‘ 読み取り専用で開くのが鉄則
‘ ウィンドウの最適化
acadApp.WindowState = acMax
‘ 図面全体をズーム(これを忘れると前回の保存時のビューで切り取られる)
acadApp.ActiveDocument.Application.ZoomExtents
‘ 画像としてエクスポート (WMF/BMP/JPG)
‘ ※ Exportメソッドは、指定した領域を画像化する強力な武器だ
doc.Export outputPath, “BMP”, doc.ActiveSelectionSet
doc.Close False
Exit Sub
Cleanup:
If Not doc Is Nothing Then doc.Close False
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub
—
3. 実務で「死なない」ための3つの鉄則
コードが書けることと、業務で使えることは別次元の話だ。以下の3点を必ず設計に盛り込め。
① 読み取り専用(ReadOnly)の徹底
図面を編集権限で開いてはいけない。誤操作による図面破壊のリスクを排除し、かつファイルロックを回避するためだ。`Documents.Open(path, True)`の第2引数は絶対だ。
② ウィンドウ状態の管理
`WindowState`を操作する際、ユーザーが別の作業をしている最中に割り込むと、UXは最悪になる。本番環境では、アプリケーションを非表示(`Visible = False`)で起動するか、専用のバックグラウンドプロセスとして立ち上げる設計が望ましい。
③ キャッシュとDB連携の最適化
サムネイル生成は重い処理だ。一度生成した画像を再生成する無駄を避けるため、ファイル更新日時をチェックするロジックを必ず組み込め。
- `FileDateTime(dwgPath)` と `FileDateTime(imagePath)` を比較し、DWGが新しい場合のみ再生成する。この差分更新ロジックだけで、処理時間は90%削減できる。
—
4. 次のステップ:さらなる効率化へ
この仕組みができれば、あとはエクセル(VBA)からこの関数を呼び出し、フォルダ内のDWGを再帰的に巡回させるだけだ。
‘ フォルダ内の全DWGを処理するメインルーチン
Public Sub ProcessFolder(ByVal folderPath As String)
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim file As Object
For Each file In fso.GetFolder(folderPath).Files
If LCase(fso.GetExtensionName(file.Path)) = “dwg” Then
GenerateThumbnail file.Path, Replace(file.Path, “.dwg”, “.bmp”)
End If
Next
End Sub
結びに:エンジニアとしての矜持
VBAは古臭いと言われることもある。だが、AutoCADの深い階層にあるオブジェクトモデルを叩き、業務のボトルネックを物理的に破壊するツールを作成できるのは、AutoCAD VBAを極めた者にしか許されない特権だ。
「とりあえず動いた」で満足するな。
「二度と手動で画像を作らなくて済む仕組み」を構築し、設計者が本来集中すべきクリエイティブな時間を取り戻してやれ。それが我々自動化エンジニアの使命だ。
何か詰まったら、オブジェクトブラウザを開け。答えは常にそこにある。
