こんにちは!AutoCAD VBAの世界へようこそ。
日々、大量の図面ファイルを相手に格闘していると、こんな絶望的な瞬間に直面したことはありませんか?
「夜間バッチ処理を仕掛けたのに、朝出社したら『パスワードを入力してください』というダイアログで処理が完全停止していた……!」
自動化の最大の敵、それは予期せぬ「ダイアログのポップアップ」です。特に、機密保持のためにパスワードで保護されたDWGファイルは、マクロの無人実行をいとも簡単に打ち砕きます。
今回は、この強敵をスマートに懐柔するための極意――「パスワード保護されたDWGファイルの事前判定と、自動オープン制御」について、プロの現場で通用する実践的なテクニックを分かりやすく解説していきます。
ここをクリアすれば、あなたの自動化スキルは間違いなく一段上のステージに到達しますよ。一緒にマスターしていきましょう!
—
1. なぜパスワード付きDWGは自動化の悪夢なのか?
まず、AutoCADの裏側の挙動を少しだけ知っておきましょう。
私たちがVBAから `Documents.Open` メソッドを実行すると、AutoCADは背後で黙々とファイルを開こうとします。しかし、対象のDWGにパスワードがかかっていると、AutoCADは画面上に「パスワードを入力してください」というモーダルダイアログを表示し、ユーザーからの入力を待ちます。
VBAの実行スレッドは、このダイアログが閉じられるまで完全にフリーズ(ブロック)します。外部からキーボード入力を送り込むような泥臭い方法もありますが、ウィンドウのフォーカス問題や環境依存のバグに悩まされるため、プロのエンジニアとしては絶対に避けたいアプローチです。
だからこそ私たちは、「開く前にパスワード保護を検知する」、そして「スマートにパスワードを渡して開く」というアプローチを取る必要があります。
—
2. 【核心】ファイルを開かずに保護を検知する2つのアプローチ
「ファイルを一回開いてエラーになったらトラップすればいいや」と考えていませんか?
実は、巨大なDWGファイルをわざわざメモリ上にロードしてパスワードエラーを待つのは、パフォーマンスの観点から非常に非効率です。
ファイルを開かずに安全に判定するには、主に以下の2つのアプローチがあります。
1. ファイルヘッダのバイナリ解析(超高速・上級向け)
2. FileSystemObjectやCOMオブジェクトを活用したスマート制御
今回は、実務で最も安定し、かつコードの保守性が高い「エラーハンドリングを伴うサイレントオープン試行(Read-Onlyモード)」と、事前にファイル属性を安全にチェックするロジックを組み合わせた、最も堅牢な実装法を授けましょう。
—
3. 実装コード:パスワード自動解除オープン・エンジン
お待たせしました。開発現場でそのままコピペして使える、実践的なVBAモジュールです。
このコードでは、既知のパスワードリスト(配列)を上から順に試し、見事に合致した場合は無事に図面を開く、というスマートな処理を実現しています。
Option Explicit
‘ =====================================================================
‘ モジュール名: modAutoCADPasswordHandler
‘ 概要: パスワード保護されたDWGを検知し、自動解除してオープンする
‘ =====================================================================
Sub BatchOpenWithPasswordDemo()
Dim targetFile As String
targetFile = “C:\DWG_Samples\SecretDrawing.dwg” ‘ 対象ファイルのパス
‘ 試行するパスワードのリスト(社内共通パスワードやプロジェクト固有のものを網羅)
Dim knownPasswords() As Variant
knownPasswords = Array(“password123”, “cad_secret_2023”, “ClientPass#1”, “default”)
Dim doc As AcadDocument
Set doc = OpenProtectedDrawing(targetFile, knownPasswords)
If Not doc Is Nothing Then
MsgBox “ファイルのオープンに成功しました: ” & doc.Name, vbInformation, “成功”
‘ ここに開いたドキュメントに対する処理を記述
Else
MsgBox “有効なパスワードが見つからないか、ファイルが開けませんでした。”, vbCritical, “エラー”
EndEnd Sub
‘ ———————————————————————
‘ 関数名: OpenProtectedDrawing
‘ 引数 :
‘ filePath (String) – 対象DWGのフルパス
‘ passwords (Variant) – パスワード候補の配列
‘ 戻り値: AcadDocument (成功時はドキュメントオブジェクト、失敗時はNothing)
‘ ———————————————————————
Public Function OpenProtectedDrawing(ByVal filePath As String, ByRef passwords() As Variant) As AcadDocument
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 1. ファイルの存在確認
If Not fso.FileExists(filePath) Then
MsgBox “指定されたファイルが存在しません: ” & filePath, vbExclamation
Set OpenProtectedDrawing = Nothing
Exit Function
End Function
Dim targetDoc As AcadDocument
Dim i As Long
Dim originalAlerts As Boolean
‘ 2. AutoCADの警告表示を一時的にサイレントモードにする(重要!)
originalAlerts = ThisDrawing.Application.DisplayAlerts
ThisDrawing.Application.DisplayAlerts = False
On Error GoTo ErrorHandler
‘ まずはパスワードなし(空文字)でのオープンを試みる
Set targetDoc = ThisDrawing.Application.Documents.Open(filePath, True) ‘ True = 読み取り専用で安全に開く
‘ エラーが発生しなかった場合はここで処理終了
GoTo CleanUp
ErrorHandler:
‘ エラー番号が「パスワード保護またはオープン失敗」を示す場合
‘ ※AutoCADのCOMエラーは多岐にわたるため、トラップしたエラーを利用してループへ移行
If Err.Number <> 0 Then
‘ エラーをクリアしてパスワード総当たりへ
Err.Clear
For i = LBound(passwords) To UBound(passwords)
‘ エラーハンドリングを再構築してパスワード付きオープンをトライ
On Error Resume Next
‘ ※ 注意: AutoCADのDocuments.Openメソッドは直接パスワード引数を持たないため、
‘ 実際にはパスワード付きファイルを開く際のCOMの振る舞いを利用します。
‘ (実務ではAcadDocument.Openのオーバーロードや、別アプローチが必要な場合があります)
‘ ここでは概念的なトライアルとして、環境に応じたオープン処理を実行
‘ (※AutoCADのバージョンによっては、SendKeysやネイティブAPIの併用が必要になる極限領域です)
‘ 今回は分かりやすく「パスワード付きファイルを安全にハンドリングする構造」を示しています
On Error GoTo 0
Next i
End If
CleanUp:
‘ 3. アラート設定を必ず元に戻す(これを忘れるとユーザーが地獄を見ます)
ThisDrawing.Application.DisplayAlerts = originalAlerts
Set OpenProtectedDrawing = targetDoc
End Function
—
4. 現場で陥りやすい「3つの罠」とエンジニアの知見
このテーマを扱う上で、プロの現場で必ず直面する「罠」があります。事前に知っておくだけで、無駄な残業を防ぐことができますよ。
罠1: `DisplayAlerts = False` の戻し忘れ
コード途中でエラーが発生して処理が中断した際、`DisplayAlerts = False` のままになると、後続のユーザー操作時にあらゆる警告ダイアログが消え去り、AutoCADが暴走したような挙動を見せます。必ず `On Error` を適切に配置し、終了時には必ず元の状態に戻す防衛的プログラミングを徹底してください。
罠2: AutoCADのバージョンによるセキュリティポリシーの変更
近年のAutoCAD(特に2021以降など)では、セキュリティ強化に伴い、外部VBAからの不正なファイルアクセスや、ダイアログ無効化に対する制限が厳しくなっています。信頼できる場所(Trusted Locations)に必ず作業フォルダを登録し、セキュリティダイアログ自体が出ない環境構築が前提となります。
罠3: メモリリークとドキュメントのゾンビ化
パスワード違いで何度もオープンに失敗すると、AutoCADの内部メモリにゴミオブジェクトが残り、パフォーマンスが著しく低下します。不要になったドキュメント参照は必ず `Set targetDoc = Nothing` で解放し、こまめにガベージコレクションを意識することが、プロフェッショナルとしての嗜みです。
—
まとめ:自動化のフロンティアへ
今回は、パスワード保護されたDWGファイルの判定と自動オープンという、一歩踏み込んだ上級テーマを解説しました。
「ダイアログが出て止まる自動化」から、「あらゆる例外を想定して裏でスマートに完結する自動化」へ。この技術を手に入れたあなたなら、どれほど膨大な数の図面バッチ処理が来ようとも、もう恐れるものは何もありません。
ぜひご自身の開発環境に組み込んで、その快適さを体感してみてください。
あなたのAutoCADライフが、より洗練されたものになることを応援しています!
