【入門編】【初心者向け】図面を開く前の「ファイル属性」確認:読み取り専用属性をVBAで判定・解除してからオープンする – AutoCAD VBA解析バイブル

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

【AutoCAD VBA 掌握術】図面を開く前に「属性」を支配せよ:読み取り専用を回避するプロの作法

こんにちは。AutoCADの自動化の世界へようこそ。

マクロの記録機能を使って、「あ、こんなこともできるんだ!」と感動した時期は、エンジニアとして最も輝かしい瞬間の一つです。しかし、あなたが「もっと複雑な処理を、もっとスマートに自動化したい」と願うようになった今、一つの壁にぶつかっているかもしれません。

それは、「予期せぬエラーやダイアログ(確認画面)によって、自動化が止まってしまう」という問題です。

例えば、大量の図面を連続して処理するプログラムを書いたとしましょう。途中で「このファイルは読み取り専用です。上書きしますか?」というダイアログが出て止まってしまったら……。せっかくの自動化が、ただの「手動作業の代行」に成り下がってしまいます。

今日は、そんな事態を防ぐための、極めて基本的かつ強力なテクニック「ファイル属性の事前判定」についてお話しします。ここをクリアすれば、あなたのコードは「ただ動くもの」から「プロの道具」へと進化します。

1. なぜ「開いてから」では遅いのか?

多くの初学者が陥る罠があります。それは、「AutoCADの命令(Document.Open)にすべてを任せようとすること」です。

AutoCADのオブジェクトモデルは非常に強力ですが、ファイルの状態(OSレベルの属性)までは、開く瞬間まで完全にコントロールしきれません。読み取り専用のファイルに対して無理に書き込みを試みると、AutoCADはユーザーに判断を仰ごうとしてダイアログを表示します。

プロの自動化エンジニアは、「AutoCADという重厚なエンジンを回す前に、OS(Windows)のレイヤーで状況を把握する」という考え方を持ちます。

図面をAutoCADにロードする前に、そのファイルが「書き込み可能な状態か」を先にチェックする。この「一歩手前の準備」こそが、堅牢なプログラムを作る鍵なのです。

2. 鍵となる武器:`GetAttr` 関数

ここで登場するのが、VBA(VB6由来)の標準関数である `GetAttr` です。
これは、AutoCADの機能ではなく、Windowsのファイルシステムに対して「このファイルの属性(性格)は何ですか?」と尋ねる関数です。

ファイルには、以下のような「属性」というラベルが付いています。

  • Normal (vbNormal): 通常の状態
  • ReadOnly (vbReadOnly): 読み取り専用(書き込み禁止)
  • Hidden (vbHidden): 隠しファイル
  • System (vbSystem): システムファイル

私たちは、この中の `vbReadOnly` が付いているかどうかを判定したいわけです。

3. 実践:読み取り専用を検知し、解除して開くコード

それでは、実際に使えるコードを見てみましょう。単に判定するだけでなく、「もし読み取り専用だったら、属性を書き換えて編集可能にする」という一連の流れを実装します。

Option Explicit

''' <summary>
''' 指定した図面ファイルを、読み取り専用属性を解除した状態で安全に開く
''' </summary>
''' <param name="filePath">図面ファイルのフルパス</param>
Sub SafeOpenDrawing(ByVal filePath As String)
    Dim attr As VbFileAttribute
    Dim acadDoc As AcadDocument
    
    ' 1. ファイルが存在するかどうかのチェック(基本中の基本!)
    If Dir(filePath) = "" Then
        MsgBox "指定されたファイルが見つかりません:" & vbCrLf & filePath, vbExclamation
        Exit Sub
    End If

    ' 2. ファイルの属性を取得
    ' GetAttr関数は、ファイルの属性を「数値(ビット列)」として返します
    attr = GetAttr(filePath)

    ' 3. 読み取り専用属性(vbReadOnly)が付いているか判定
    ' ビット演算(And)を使って、特定の属性が含まれているかをチェックします
    If (attr And vbReadOnly) = vbReadOnly Then
        Debug.Print "警告: 読み取り専用属性を検出しました。解除を試みます..."
        
        ' 4. 属性の変更
        ' vbNormalを指定することで、読み取り専用属性を取り除いた「通常状態」に書き換えます
        ' ※注意: 他のユーザーがファイルを開いている場合はここでエラーになります
        On Error Resume Next
        SetAttr filePath, vbNormal
        
        If Err.Number <> 0 Then
            MsgBox "属性の変更に失敗しました。ファイルが他のプログラムで使用中の可能性があります。" & vbCrLf & _
                   "エラー内容: " & Err.Description, vbCritical
            On Error GoTo 0
            Exit Sub
        End If
        On Error GoTo 0
        
        Debug.Print "成功: 属性を正常に解除しました。"
    Else
        Debug.Print "確認: ファイルは書き込み可能な状態です。"
    End If

    ' 5. いよいよAutoCADでファイルを開く
    ' ここまで到達したということは、ファイルは「開ける状態」であることが保証されています
    On Error Resume Next
    Set acadDoc = ThisDrawing.Application.Documents.Open(filePath)
    
    If Err.Number <> 0 Then
        MsgBox "図面を開く際にエラーが発生しました。" & vbCrLf & Err.Description, vbCritical
    Else
        MsgBox "図面を正常に開きました!", vbInformation
    End If
    On Error GoTo 0
End Sub

''' <summary>
''' テスト実行用メインルーチン
''' </summary>
Sub TestRoutine()
    ' ここにテストしたい図面のパスを入力してください
    Dim testPath As String
    testPath = "C:\Users\YourName\Documents\TestDrawing.dwg"
    
    SafeOpenDrawing testPath
End Sub

4. 伝説のアーキテクトが教える「落とし穴」と回避策

このコードを使いこなすために、あえて厳しい視点で「注意点」を伝えておきます。ここを知っているかどうかが、初心者とプロの境界線です。

① 「属性解除」と「ファイルロック」は別物

`SetAttr` で読み取り専用を解除できても、「他の誰かがそのファイルを開いている」場合はエラーになります。これはWindowsのファイルロックという仕組みによるものです。
コード内の `On Error Resume Next` は、この「予期せぬエラー(Permission Denied)」をキャッチするために不可欠です。エラーが起きたら、無理に開こうとせず、ユーザーに通知して処理を中断するのが「優しい設計」です。

② ビット演算の魔法

コードの中に `(attr And vbReadOnly)` という記述がありましたね。これは少し難しく感じるかもしれません。
ファイル属性は、複数のフラグ(スイッチ)が重なり合った状態です。「読み取り専用」であり、かつ「隠しファイル」でもある、といった具合です。
`And` 演算子を使うことで、「たくさんのスイッチの中から、読み取り専用のスイッチだけが ON になっているか?」をピンポイントで判定しているのです。

③ ライフサイクルの意識

図面を開いた後、その図面をどう扱うか(保存して閉じるのか、そのまま編集させるのか)までを設計に含めてください。自動化において、「開いたまま放置されるファイル」が溜まっていくことは、メモリを圧迫し、システムを不安定にする最大の原因となります。

まとめ:一歩先の自動化へ

今回学んだ `GetAttr` と `SetAttr` による事前チェックは、AutoCAD VBAにおける「守りの技術」です。

1. まず外側(OS)を確認する
2. 問題があれば、環境を整える
3. 整った環境で、メインの処理(AutoCAD)を行う

この「三段構え」の思考プロセスを身につければ、あなたの作るマクロは、どんな環境でも動じない強靭なものになります。

さあ、 fear(恐れ)を捨てて、コードを書き進めてください。エラーは敵ではなく、あなたがより良い設計に辿り着くための道標なのですから。

応援していますよ。

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