【入門編】【初心者向け】図面を開く前に「既に開いているか」をチェック:実行時エラーを未然に防ぐ基本ロジック – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの極意:図面を「安全に」開くための鉄則

こんにちは。AutoCADの自動化の世界へようこそ。
日々、膨大な図面と格闘している皆さん、マクロの記録ボタンを押すだけの世界から一歩踏み出し、「プログラムで図面を制御する」という領域に足を踏み入れたことは、皆さんのキャリアにとって大きな転換点になります。

今日は、AutoCAD VBA開発において、「これを知らないと現場で痛い目を見る」という最も基本的で、かつ極めて重要な「図面のオープン制御」についてお話しします。

—

なぜ「既に開いているか」を確認する必要があるのか?

初心者の方がまず直面する壁。それは、「既に開いている図面を、プログラムで再度開こうとしてエラーになる」という現象です。

AutoCADは一つのファイルに対して非常に厳格です。人間であれば「あ、もう開いてた」と気づけますが、プログラムは指示された通りに「開け!」と命令を実行するため、既に開いているファイルを無理やり開こうとして実行時エラー(Run-time error)を吐き出し、プログラムが強制終了してしまいます。

これを防ぐのが、今回紹介する「確認ロジック」です。

—

魔法のロジック:Documentsコレクションを監視せよ

AutoCADには、現在開いている全ての図面を管理する`Documents`という箱(コレクション)が存在します。この箱の中身を一つずつ順番に確認(ループ)し、目的のファイル名と一致するものがないかを探せばいいのです。

実践コード:安全なオープン手順

このコードをコピーして、あなたのVBAエディタに貼り付けてみてください。

Sub OpenDrawingSafe()
Dim targetPath As String
Dim doc As AcadDocument
Dim isAlreadyOpen As Boolean

‘ 開きたい図面のフルパスを指定
targetPath = “C:\Projects\Sample.dwg”
isAlreadyOpen = False

‘ 1. 現在開いている図面を一つずつチェック
For Each doc In Documents
‘ UCase関数で大文字小文字の区別を無くして比較するのがコツ
If UCase(doc.FullName) = UCase(targetPath) Then
isAlreadyOpen = True
Exit For ‘ 見つかったらループを抜ける(パフォーマンス向上)
End If
Next

‘ 2. 状態に応じた処理の分岐
If isAlreadyOpen Then
‘ 既に開いている場合は、その図面をアクティブにする
doc.Activate
MsgBox “既に開いています。”
Else
‘ 開いていない場合のみ、新しく開く
On Error Resume Next ‘ 万が一のファイル不在エラー等を回避
Documents.Open targetPath
If Err.Number <> 0 Then
MsgBox “ファイルを開けませんでした。” & vbCrLf & “パスを確認してください。”
End If
On Error GoTo 0
End If
End Sub

—

コードのここがポイント!

1. `For Each … In Documents`
これがAutoCAD VBAの基本にして奥義です。開いている全ての図面を「走査(スキャン)」することで、プログラムの安全性を担保します。
2. `UCase`関数による正規化
Windowsのファイルパスは、大文字・小文字を区別しません。`”C:\Test.dwg”`と`”C:\test.dwg”`は同じファイルです。プログラムで比較する際は、必ず両方を大文字(または小文字)に揃えて比較するのが、プロのエンジニアの常識です。
3. `On Error Resume Next`の正しい使い方
「エラーを無視する」のではなく、「ファイルが存在しない」といった予期せぬ事態が起きた時に、プログラムをクラッシュさせずに優雅にエラーハンドリングを行うために使います。

—

次のステップへ向けて

このロジックをマスターすれば、あなたのマクロは「エラーで止まる」ことが激減します。

AutoCAD VBAにおいて大切なのは、「プログラムを動かすこと」ではなく、「プログラムが意図しない状況に陥った時に、どう振る舞うかを定義すること」です。

今回紹介した「既に開いているかチェック」は、まさにその第一歩。ここをクリアすれば、次は「図面を閉じる前に保存を促す」処理や「属性情報を抽出する」処理など、いくらでも応用が効くようになります。

まずはこのコードを自分の環境で動かし、メッセージボックスが出る感覚を体感してください。それが、明日からの業務自動化の強力な武器になります。

何かあれば、いつでもこの場所に戻ってきてください。皆さんの技術の向上が、私の何よりの喜びです。頑張りましょう!

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