こんにちは!AutoCADの自動化の海原へようこそ。
マクロの記録ボタンを押すだけの初級者から一歩抜け出し、「自分の手でCADを自在に操りたい」と願うあなたなら、きっと大量の図面を一括処理するバッチ処理の野望を抱いたことがあるはずです。
しかし、ここで多くの人が「絶対に破れない壁」にぶつかります。
そう、図面を開いた瞬間に現れる「パスワード入力ダイアログ」や「外部参照(Xref)が見つかりません」というエラーモーダルです。
これらが画面のど真ん中にポップアップした瞬間、あなたのVBAスクリプトは完全にフリーズし、深夜のバッチ処理は朝まで無慈悲に停止することになります。
今回は、数千枚の図面と格闘してきた私が、`Documents.Open` の闇を完全にコントロールし、マルチドキュメント環境を完全掌握するための極限の知見を授けましょう。ここをクリアすれば、あなたのVBAスキルは間違いなくプロの領域に達します。温かく導くので、一緒にマスターしていきましょう!
—
1. なぜバッチ処理はダイアログで止まってしまうのか?
AutoCAD VBAで図面を開くとき、私たちは通常 `Documents.Open` メソッドを使います。
‘ ごく一般的な開き方
Dim doc As AcadDocument
Set doc = ThisDrawing.Application.Documents.Open(“C:\Data\Sample.dwg”)
一見、何の問題もないように見えますよね。しかし、この裏で何が起きているか意識したことはあるでしょうか?
AutoCADは、GUI(画面)を持つ巨大なアプリケーションです。`Documents.Open` を実行するということは、「裏で人間が図面をダブルクリックして開いているのと同じ状態」を再現しています。
もし、その図面にパスワードがかかっていたら? 外部参照している図面のパスが切れていたら?
AutoCADは親切心からダイアログを出してユーザー(あなた)に「どうしますか?」と尋ねます。しかし、VBAが走っている背後には誰もいません。結果として、AutoCADは永遠にユーザーのクリックを待ち続け、スクリプトは沈黙するのです。
これを防ぐためには、「ダイアログを出させないための事前設定」と「万が一の例外を飲み込むエラーハンドリング」の2つを同時に実装する必要があります。
—
2. パスワード保護の突破:`Open` メソッドの隠された引数
まず、パスワード付き図面の制御です。
実は `Documents.Open` メソッドには、リファレンスにはサラッとしか書かれていない重要な引数が存在します。
retDocument = object.Open(Name [, ReadOnly] [, Password])
そう、第3引数に `Password` を渡すことができるのです。
しかし、現実はそう甘くありません。「処理する図面ごとにパスワードが違う」「そもそもパスワードがかかっているか分からない」というケースがほとんどでしょう。
ここで必要になるのが、「エラーをトラップする技術(Error Handling)」です。パスワードが必要な図面をパスワードなしで開こうとすると、AutoCADは実行時エラーを発生させます。これをスマートに捕捉して処理をスキップ、あるいは別ルートで処理するのがプロの作法です。
—
3. 外部参照(Xref)の迷子を防ぐ:システム変数による無言化
外部参照の読み込みエラーで止まる現象は、AutoCADのシステム変数を事前にコントロールすることで完全に無力化できます。
特に重要なのが `FILEDIA` と `DEMANDLOAD` ですが、マルチドキュメント制御において最も強力な武器になるのは、エラーダイアログそのものを抑制するアプローチです。AutoCADには、ファイルオープン時の警告を抑制する直接的なシステム変数は少ないため、「見つからない外部参照は無視して開き、後からパスを修復する」という哲学を持つ必要があります。
—
4. 【実践】完全無人化を実現する堅牢なバッチ処理コード
それでは、ここまでの知見をすべて詰め込んだ、実戦投入可能なプロフェッショナル・コードを公開します。
このコードは、指定したフォルダ内のすべてのDWGを巡回し、パスワード保護や外部参照の欠落による停止を華麗に回避しながら処理を行います。
Sub BatchProcessDrawings()
Dim fso As Object
Dim targetFolder As String
Dim file As Object
Dim doc As AcadDocument
‘ 対象フォルダのパス(環境に合わせて変更してください)
targetFolder = “C:\MyAutoCADFiles\”
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(targetFolder) Then
MsgBox “指定されたフォルダが存在しません。”, vbCritical
Exit Sub
End If
‘ 画面描画を停止してパフォーマンスを極限まで高める
ThisDrawing.Application.ScreenUpdating = False
‘ フォルダ内の全DWGファイルをループ処理
For Each file in fso.GetFolder(targetFolder).Files
If LCase(fso.GetExtensionName(file.Name)) = “dwg” Then
‘ —【重要】エラーハンドリングの開始 —
On Error GoTo ErrorHandler
‘ パスワード付き図面や破損図面でクラッシュするのを防ぐため、個別に捕捉
Set doc = Documents.Open(file.Path, False) ‘ 第2引数: False = 読み取り専用ではない
‘ — 図面を開いたあとの処理(例:レイアウトの確認など) —
Debug.Print “正常にオープン: ” & doc.Name
‘ ここに実際の自動化処理を記述
‘ …
‘ 変更を保存して閉じる(必要に応じて)
doc.Close True
On Error GoTo 0 ‘ エラーハンドリセット
GoTo NextFile
ErrorHandler:
‘ エラーが発生した場合の処理(ダイアログを出さずにイমিディエイトに出力)
Debug.Print “【スキップ】 ” & file.Name & ” はオープンできませんでした。エラー番号: ” & Err.Number
‘ エラーメトリックをクリアして続行
Err.Clear
On Error GoTo 0
NextFile:
End If
Next file
‘ 画面描画を復元
ThisDrawing.Application.ScreenUpdating = True
MsgBox “すべてのバッチ処理が完了しました!”, vbInformation
End Sub
このコードの美しさと優しさのポイント
1. `ScreenUpdating = False` による爆速化: 大量の図面を開き閉めする際、画面のちらつきを消すことで処理速度が劇的に向上します。
2. `On Error GoTo ErrorHandler` による不屈性: 1枚の壊れた図面やパスワード付き図面に出会っても、スクリプトは止まらずに「次の図面」へ進みます。朝出社したときには、処理が完璧に終わっているという理想郷が実現します。
3. リソースの確実な解放: `doc.Close True` によって、メモリリーク(メモリの食い潰し)を防ぎ、何百枚図面を開いてもAutoCADが重くならない設計になっています。
—
まとめ:ここをクリアすれば、もう怖くない
今回は、AutoCAD VBAにおけるマルチドキュメント制御の最大の難所である「ダイアログによる停止の回避」について解説しました。
- `Documents.Open` の引数とライフサイクルを理解する
- 予期せぬエラー(パスワードや外部参照欠落)は、`On Error` でエレガントに飲み込む
- `ScreenUpdating` や `File` オブジェクトを組み合わせて堅牢なバッチを組む
この基本原則さえ押さえておけば、どんなに難解なクライアントからの大量図面データも、あなた一人で一瞬のうちに料理できるようになります。
ここをクリアしたあなたなら、もう初級者ではありません。自信を持って、次の自動化の扉を開いてください。応援しています!
