AutoCAD VBAを掌握する極限の知見:パスワード保護されたDWGの自動判定と一括制御のアーキテクチャ
数千枚単位のDWGファイルを一括処理するバッチプログラムを構築する際、エンジニアの前に最も理不尽に立ち塞がる壁が「パスワード保護」である。
`Documents.Open` メソッドは、暗号化された図面を検知すると容赦なくモーダルダイアログを表示し、スクリプトの実行権限を完全に凍結する。UIを持たないバックグラウンド自動化において、この「無限フリーズ」はシステム全体の死を意味する。
本稿では、AutoCAD VBAおよびCOMインターフェースの深層を暴き、パスワード保護されたDWGファイルの事前判定、および既知のパスワードリストを用いた自動解除・オープン処理の極限最適化手法を解説する。
—
1. DWGファイル構造と暗号化のメカニズム
AutoCAD 2004以降、DWGフォーマットには強力な暗号化レイヤー(AES等)が導入された。ファイルヘッダーの一部領域、またはオブジェクトストリーム全体が暗号化されるため、従来のバイナリパーサで単純に図面データベースを読み解くことは不可能である。
しかし、ファイルI/Oのレイヤーにおいて、AutoCADのコアエンジン(`AcDbDatabase`)は、ファイルを開く前に「このファイルは復号キーを要求するか否か」のフラグ、あるいはストリームの構造的特徴を保持している。
VBAからこれにアプローチする場合、単純に `Open` を叩くのではなく、「COM例外の捕捉」 と 「ファイルストリームの低水準チェック」 を組み合わせた堅牢な防衛網が必要となる。
—
2. 実装アーキテクチャ:パスワード自動試行エンジン
以下のコードは、指定されたフォルダ内のDWGを走査し、パスワード保護されているファイルを検出。あらかじめ用意されたパスワード辞書(配列)を用いて、ダイアログを表示せずにサイレントにオープンを試みるプロフェッショナル向けの実装である。
冗長性を廃したプロダクション・コード
Option Explicit
‘ エラー定数
Const ErrPasswordRequired As Long = -2145386476 ‘ 仮想的な代表値(実際はCOMエラーをトラップ)
Sub BatchOpenEncryptedDrawings()
Dim targetFolder As String
targetFolder = “C:\AutoCAD_Data\BatchTarget\”
If Dir(targetFolder, vbDirectory) = “” Then
MsgBox “指定されたディレクトリが存在しません。”, vbCritical
Exit Sub
End If
‘ 既知のパスワードリスト(環境に応じてDBや外部ファイルから読み込むこと)
Dim passList() As String
ReDim passList(2)
passList(0) = “DefaultPass2023”
passList(1) = “SecretCad2024”
passList(2) = “MasterKey999”
Dim fileName As String
fileName = Dir(targetFolder & “.dwg”)
‘ AutoCADのバックグラウンド実行最適化
Dim acadApp As AcadApplication
Set acadApp = ThisDrawing.Application ‘ または CreateObject(“AutoCAD.Application”)
‘ 画面描画とアラートの抑制(極限のパフォーマンス追求)
acadApp.Visible = True ‘ セキュリティコンテキストによってはTrueが必要な場合がある
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Do While fileName <> “”
Dim fullPath As String
fullPath = targetFolder & fileName
Debug.Print “処理中: ” & fileName
‘ パスワード解除を伴うオープン処理の実行
If Not TryOpenWithPassword(acadApp, fullPath, passList) Then
LogFailedFile fullPath, “パスワード不一致またはオープン失敗”
End If
fileName = Dir()
Loop
‘ オブジェクトの明示的解放(メモリリークの完全阻止)
Set fso = Nothing
Set acadApp = Nothing
MsgBox “バッチ処理が完了しました。”, vbInformation
End Sub
”’
”’
Private Function TryOpenWithPassword(ByVal app As AcadApplication, ByVal filePath As String, ByRef passwords() As String) As Boolean
Dim doc As AcadDocument
Dim opened As Boolean
opened = False
On Error GoTo CatchEncryption
‘ 1回目はパスワードなしでオープンを試行
Set doc = app.Documents.Open(filePath, False)
opened = True
GoTo SuccessClean
CatchEncryption:
‘ エラー番号の検証(暗号化ファイル特有のトラップ)
‘ ※AutoCADのバージョンによりエラーコードが異なるため、Err.Numberの汎用捕捉を行う
If Err.Number <> 0 Then
Dim i As Long
For i = LBound(passwords) To UBound(passwords)
On Error Resume Next
‘ パスワード引数付きオープン(AutoCAD 2015以降のAPI仕様に準拠)
‘ 注: バージョン差異を吸収するため、必要に応じてObjectARX/C#ラッパーの併用を推奨
Set doc = app.Documents.Open(filePath, False, passwords(i))
If Err.Number = 0 Then
opened = True
Debug.Print ” -> パスワード一致: [” & passwords(i) & “]”
Exit For
End If
On Error GoTo 0
Next i
End If
SuccessClean:
If opened And Not doc Is Nothing Then
‘ ここで図面に対する業務ロジックを実行
ProcessDrawing doc
‘ 変更を保存せずに閉じる(必要に応じてSaveに変更)
doc.Close False
End If
TryOpenWithPassword = opened
Exit Function
ErrorHandler:
TryOpenWithPassword = False
Exit Function
End Function
Private Sub ProcessDrawing(ByRef doc As AcadDocument)
‘ 業務処理の記述領域
Debug.Print ” -> 図面名: ” & doc.Name & ” の解析完了。”
End Sub
Private Sub LogFailedFile(ByVal filePath As String, ByVal reason As String)
‘ 失敗ログの出力処理
Debug.Print “[ERROR] ” & filePath & ” : ” & reason
End Sub
—
3. チーフアーキテクトが指摘する「罠」とメモリ管理の極意
この領域を実装する際、ジュニアプログラマが必ず陥る致命的な罠が存在する。これを回避するための知見を共有する。
A. COMオブジェクトの参照カウントとメモリリーク
VBAの `Set doc = Nothing` や `Set app = Nothing` は、単にポインタを解放しているに過ぎない。AutoCADのCOMサーバー(`acad.exe`)はプロセス外コンポーネント(Out-of-Process COM Server)であるため、例外発生時に適切に参照を解放しないと、タスクマネージャー上にゾンビプロセスが無限に蓄積される。
必ず `On Error GoTo` スコープを厳格に管理し、異常終了時であってもスタック上のCOMオブジェクトが適切に破棄される構造を担保すること。
B. バージョン互換性の呪縛(AutoCAD 2010〜2025)
AutoCADはバージョンごとにファイルフォーマットの内部暗号化アルゴリズムをアップデートしている。
特に、古いVBA環境から最新のAutoCAD 2025の図面(かつパスワード保護されたもの)を叩く場合、COMインターフェース経由ではハンドリングしきれないダイアログ割込みが発生することがある。
これを完全に根絶するには、VBA単体での制御に固執せず、C# (.NET API) によるラッパーDLLを作成し、COM Interop経由でVBAから呼び出すアーキテクチャへ移行するのが、シニアエンジニアとしての正しい選択肢となる。
—
4. 総括:自動化の信頼性を極限まで高めるために
パスワード保護されたDWGの自動処理は、単なるコードの記述量ではなく、「予期せぬ例外の完全な封じ込め」と「リソースのライフサイクル管理」の精度によって優劣が決まる。
本稿で提示した設計思想を取り入れることで、夜間バッチなどの無人環境下でもフリーズすることなく、堅牢かつ高速に暗号化図面を統御することが可能となる。レガシーなVBAの限界を知りつつ、その中で最大限のパフォーマンスを引き出すこと――それこそが、現場を支えるエンジニアの矜持である。
