こんにちは!AutoCAD VBAの世界へようこそ。
日々の業務で、何枚もの図面を一括処理するマクロを作っていると、決まって私たちの前に立ちはだかる「アイツ」がいますよね。
そう、「プロキシオブジェクト」の警告ダイアログです。
別のCADソフトで作られたデータや、専用の拡張オブジェクトが含まれているDWGファイルを開くたびに、「この図面にはプロキシが含まれていますがどうしますか?」と画面がポップアップで停止してしまう……。これでは、完全自動化を目指す私たちエンジニアにとって、コーヒーを淹れて席を外すこともできない、致命的なボトルネックになってしまいます。
今回は、この厄介な警告ダイアログをスマートに消し去り、完全なるノーブレーキの自動処理を実現するための極意を、優しく知的な先輩エンジニアの視点から授けましょう。
ここをクリアすれば、AutoCAD VBAの基本と「システム変数の手懐け方」はバッチリですよ!
—
1. なぜプロキシオブジェクトの警告が出るのか?
まず、敵を知ることから始めましょう。
AutoCADには、標準の図形(線分、円、文字など)のほかに、特定の業界向けアドオン(AutoCAD ArchitectureやCivil 3Dなど)が作り出す「カスタムオブジェクト」が存在します。
これらは、そのアドオンが入っていない環境(または純粋なベースのAutoCAD)で開くと、中身が正確に読み込めないため「プロキシオブジェクト(代理の入れ物)」という姿に置き換わります。
AutoCADの親切心から、開くたびに「本当にこれ、中身が不完全な状態で開いちゃっていいんですか?」とダイアログで確認を取ろうとするのですが……バッチ処理で100枚の図面を処理しているとき、この親切心は単なる邪魔者でしかありませんよね。
—
2. 解決の鍵:システム変数「EXPERT」を操る
この警告ダイアログを黙らせるために、AutoCADの隠しパラメータであるシステム変数を利用します。
とりわけ、対話型プロンプトや警告の表示レベルを制御するのが `EXPERT` という変数です。
AutoCAD VBAでは、`ThisDrawing.SetVariable` メソッドを使うことで、このシステム変数を自由自在に書き換えることができます。
EXPERT変数の主な値
- `0` : 通常モード(すべての警告や確認プロンプトが表示される)
- `1`〜`5` : コマンドラインでの特定の警告や「本当に上書きしますか?」などのプロンプトを抑制するレベルが上がっていく
プロキシオブジェクトの警告を沈黙させるには、この `EXPERT` を一時的に `2` 以上(実務では安全のために `5` など)に引き上げてやります。
—
3. 実践!プロキシ警告を完全に無視して図面を開くVBAコード
それでは、実務の現場でそのままコピペして使える、極めて堅牢なプロシージャを公開します。
エラーハンドリング(後始末)まで完璧に組み込まれた、プロのコードを味わってください。
Sub OpenDrawingWithoutProxyWarning()
Dim targetFilePath As String
Dim originalExpert As Integer
‘ 処理対象の図面パス(ご自身の環境に合わせて書き換えてください)
targetFilePath = “C:\MyDrawings\Sample_With_Proxy.dwg”
On Error GoTo ErrorHandler
‘ —————————————————-
‘ 1. 現在の EXPERT の値を取得・退避しておく
‘ —————————————————-
originalExpert = ThisDrawing.GetVariable(“EXPERT”)
‘ —————————————————-
‘ 2. EXPERT を引き上げて、警告ダイアログを強制抑制
‘ —————————————————-
‘ 5に設定することで、致命的でない警告プロンプトを自動的にスルーさせます
ThisDrawing.SetVariable “EXPERT”, 5
‘ —————————————————-
‘ 3. 図面を開く処理
‘ —————————————————-
Debug.Print “図面を開いています: ” & targetFilePath
AcadApplication.Documents.Open targetFilePath
‘ —————————————————-
‘ 4. EXPERT の値を元の状態に必ず戻す(ここ超重要!)
‘ —————————————————-
ThisDrawing.SetVariable “EXPERT”, originalExpert
MsgBox “図面が警告なしで正常に開かれました!”, vbInformation, “自動化成功”
Exit Sub
ErrorHandler:
‘ 予期せぬエラーが発生した場合でも、環境を汚さないための後始末
ThisDrawing.SetVariable “EXPERT”, originalExpert
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
End Sub
—
4. ここで絶対に外せない「エンジニアの美学(注意点)」
上記のコードを見て、「あれ、`SetVariable` だけじゃなくて、元の値に戻す処理が入ってるぞ」と気づいたあなたは素晴らしいセンスの持ち主です。
⚠️ 黄金律:変えたシステム変数は必ず元に戻せ!
VBAの実行中にシステム変数を書き換えた場合、マクロが終了してもその設定はAutoCADに残ったままになります。
もし `EXPERT` を `5` にしたまま放置すると、ユーザーが普段手動で作業する際にも必要な警告が出なくなってしまい、最悪の場合、意図しないデータ上書きなどのヒューマンエラーを誘発します。
そのため、必ず `On Error GoTo` によるエラーハンドリングをセットで記述し、成功しても失敗しても必ず元の値(`originalExpert`)に復元する。これがプロのエンジニアとしての作法です。
—
まとめ
今回は、図面を一括処理する際の最大のストレス源である「プロキシオブジェクトの警告ダイアログ」を、システム変数 `EXPERT` を使ってスマートに抑制する方法を解説しました。
- プロキシ警告は `EXPERT` 変数でコントロールできる
- `ThisDrawing.SetVariable` で一時的に値を変更する
- 処理が終わったら、必ず元の値にリストア(復元)する
この基本パターンを身につければ、他の厄介なシステム変数(`FILEDIA` や `CMDECHO` など)を制御する際にも全く同じアプローチで応用が利くようになります。
自動化の歯車がかみ合ったときの心地よさを、ぜひご自身の開発環境で体感してください。それでは、また次の極限の知見でお会いしましょう!
