AutoCAD VBAを掌握する:バッチ処理の天敵「パスワード保護」をスマートに回避する技術
こんにちは。AutoCADの自動化の世界へようこそ。
マクロの記録機能を使って、「あ、こんなことも自動化できるんだ!」と感動した時期は、誰にでもあります。しかし、いざ「フォルダ内の図面を100枚、一気に処理しよう」と一歩踏み出したとき、多くの人が一つの壁にぶつかります。
それは、「予期せぬダイアログによる処理の停止」です。
特に、パスワードがかかった図面が混ざっていた場合、VBAは「パスワードを入力してください」というダイアログを表示して、あなたの操作を待ってしまいます。これでは、せっかくの「自動化」が、ただの「手動作業の延長」になってしまいますよね。
今日は、プログラミング初学者の方が「マクロの記録」という殻を破り、「エラーを制御できるエンジニア」へとステップアップするための、極めて実践的な知見をお伝えします。
1. なぜ、あなたのマクロは途中で止まってしまうのか?
まず、現象の本質を理解しましょう。
AutoCAD VBAにおける `Documents.Open` メソッドは、図面を開くという「命令」を投げます。しかし、その図面にパスワードがかかっている場合、AutoCADはユーザーに対して「パスワードを入れてください」というモーダルダイアログ(操作を強制するウィンドウ)を表示します。
このとき、プログラムの実行フローは、「ユーザーがダイアログを閉じるまで、次の行へ進めない」という状態になります。
- マクロの記録レベル: 「エラーが起きたら止まる」のが当たり前。
- エンジニアの思考: 「エラーが起きることを前提に、どうやって次へ進むか」を設計する。
この思考の転換こそが、自動化エンジニアへの第一歩です。
2. 解決策の鍵:エラーハンドリング(Error Handling)
パスワード付き図面を「エラーとして検知」し、それを「スキップしてログに残す」ための手法を学びましょう。
今回使用するのは、VBAの強力な武器である `On Error` ステートメント です。
実装のロジック・フロー図
プログラムの動きをイメージしてみましょう。
1. 図面を開こうとする
2. もしエラー(パスワード要求など)が発生したら?
- [YES] → エラー番号を取得し、「このファイルはスキップ」と記録する。
- [NO] → 図面を開き、通常通り処理を行う。
3. 次のファイルへ進む
この「エラーが起きても、止まらずに次のステップへ進む」仕組みをコードに落とし込んでいきます。
3. 実践:スマートなバッチ処理コード
それでは、実際に現場で使えるテンプレートコードを見てみましょう。このコードは、指定したフォルダ内のDWGファイルを順番に開き、パスワードなどで開けなかった場合は、エラー内容をイミディエイトウィンドウ(ログ)に書き出して、次のファイルへ進む設計になっています。
Option Explicit
''' <summary>
''' 指定フォルダ内の図面をバッチ処理するメインルーチン
''' </summary>
Sub BatchProcessDrawings()
Dim targetFolder As String
Dim fileName As String
Dim fullPath As String
Dim doc As AcadDocument
Dim errorCount As Integer
Dim successCount As Integer
' --- 設定エリア ---
' 処理したい図面が入っているフォルダのパスを指定してください
targetFolder = "C:\Temp\TestDrawings\"
' ------------------
' フォルダパスの末尾に "\" がなければ補完する(エンジニアの細かな配慮)
If Right(targetFolder, 1) <> "\" Then targetFolder = targetFolder & "\"
' フォルダ内の最初のDWGファイルを探す
fileName = Dir(targetFolder & "*.dwg")
errorCount = 0
successCount = 0
' ファイルが見つかるまでループ
Do While fileName <> ""
fullPath = targetFolder & fileName
' --- ここからが重要:エラー制御の核心 ---
' 一時的にエラーを無視する設定(エラーが起きても次の行へ進む)
On Error Resume Next
' 図面を開く試行
Set doc = ThisDrawing.Application.Documents.Open(fullPath)
' エラーが発生したかチェック
If Err.Number <> 0 Then
' エラーが発生した場合(パスワード保護、ファイル破損、使用中など)
errorCount = errorCount + 1
' イミディエイトウィンドウにエラー内容を記録(ログ出力)
' これにより、どのファイルがなぜ失敗したか後で確認できる
Debug.Print "[SKIP] Error in: " & fileName & " | Reason: " & Err.Description
' エラー情報をクリアして、次のファイルへ
Err.Clear
On Error GoTo 0 ' エラー制御をリセット
Else
' --- 正常に開けた場合の処理 ---
' ここに図面に対する実際の処理(例:レイヤー変更、印刷など)を書く
' 今回はデモンストレーションとして、図面名をイミディエイト出力
Debug.Print "[OK] Opened: " & fileName
' 処理が終わったら図面を閉じる(保存せずに閉じる例)
doc.Close False
successCount = successCount + 1
' エラー制御を通常の状態に戻す
On Error GoTo 0
End If
' 次のファイルへ
fileName = Dir
Loop
' --- 最終結果の報告 ---
MsgBox "バッチ処理が完了しました。" & vbCrLf & _
"成功: " & successCount & " 件" & vbCrLf & _
"失敗: " & errorCount & " 件" & vbCrLf & _
"※失敗した詳細はイミディエイトウィンドウを確認してください。", vbInformation
End Sub
4. コードの深層解説:なぜこれで動くのか?
このコードには、プロの現場で必須となる「3つの設計思想」が組み込まれています。
① `On Error Resume Next` の局所利用
エラーハンドリングをマクロ全体にかけるのではなく、「ファイルを開く」という、エラーが起きやすい特定の箇所だけに絞って適用しています。これを「局所化」と呼びます。全体にかけてしまうと、本当に重大なエラー(メモリ不足など)を見逃してしまうからです。
② `Err.Number` と `Err.Description` の活用
単に「失敗した」とだけ知るのでは不十分です。
- `Err.Number`: エラーの種類を特定する番号
- `Err.Description`: 「パスワードが必要です」といった具体的な理由
これらを `Debug.Print` で出力しておくことで、後から「あ、あの図面はパスワードがかかっていたんだな」と、人間が原因を特定できるようになります。これが「ログ記録」の本質です。
③ オブジェクトのライフサイクル管理
`Set doc = …` で図面を開いた後、成功した場合は必ず `doc.Close` で閉じる。失敗した場合は、そもそも `doc` オブジェクトは生成されないため、エラー処理へ流れる。この「成功と失敗でルートを分ける」動きが、メモリの肥大化を防ぎ、安定した動作を実現します。
5. まとめ:ここをクリアすれば、AutoCAD VBAの基本はバッチリです
「エラーが起きたら止まってしまう」という問題は、裏を返せば「プログラムが図面の状態を予測できていない」という状態です。
今回学んだ「エラーを検知し、ログに残し、次の処理へ進む」というパターンは、図面処理に限らず、あらゆる自動化(Excel操作、ファイル操作、ネットワーク通信など)において共通の「黄金律」です。
1. エラーが起きる場所を予測する。
2. `On Error` でその場所を保護する。
3. 失敗を「無視」せず「記録」する。
この3点を意識するだけで、あなたの作るマクロの品質は、一気に「ツール」から「システム」へと進化します。
一歩ずつ、着実に。
エラーを恐れず、エラーをコントロールするエンジニアを目指していきましょう。応援しています!
