【入門編】【初心者向け】図面を開く際の「パスワード保護」有無の事前判定と、実行時エラーのスマートな回避方法 – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

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点を意識するだけで、あなたの作るマクロの品質は、一気に「ツール」から「システム」へと進化します。

一歩ずつ、着実に。
エラーを恐れず、エラーをコントロールするエンジニアを目指していきましょう。応援しています!

タイトルとURLをコピーしました