【入門編】【実務中級者向け】図面オープン時の「プロキシオブジェクト」警告を完全に沈黙させるシステム変数操作 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
日々、大量の図面と格闘していると、こんなストレスに悩まされていませんか?

「Civil 3Dや専用アドオンで作成された図面を開いた瞬間、『プロキシ オブジェクト』の警告ダイアログがポップアップして、処理がそこでフリーズしてしまう……」

夜間にバッチ処理で何百枚もの図面を自動処理させようと組んだマクロが、このダイアログ一枚のせいで翌朝まで完全停止していた時の絶望感と言ったらありませんよね。人間なら「OK」を押すだけの動作ですが、容赦のない自動化の世界では、この「たった1つの警告」が致命傷になります。

今回は、このプロキシオブジェクトの警告を完全に沈黙させ、完全無人での図面処理を実現するためのシステム変数制御の極意を伝授します。ここをクリアすれば、あなたのVBAスキルは「マクロの記録者」から「真の自動化エンジニア」へと一気にステップアップしますよ。一緒に本質をマスターしていきましょう!

—

1. なぜ「プロキシオブジェクト」の警告が出るのか?

まず敵を知ることから始めましょう。
AutoCADには、標準の機能だけでなく、Civil 3D、Architecture、Map 3Dといった専門分野向けの専用オブジェクト(カスタムオブジェクト)が存在します。これらは通常のAutoCAD(LTやプレーンなAutoCAD)から見ると、中身が隠蔽された「プロキシ(代理)オブジェクト」として扱われます。

このプロキシが含まれる図面を開こうとすると、AutoCADの親切心(あるいは余計なお世話)で、次のような警告ダイアログが表示されます。

  • 「この図面には、他のアプリケーションで作成されたN個のプロキシオブジェクトが含まれています……」

自動化の文脈において、このダイアログは「処理を止める悪魔の割り込み」に他なりません。これをVBAの力でスマートに黙らせる方法を見ていきましょう。

—

2. 撃退の鍵を握る2つのシステム変数

AutoCAD VBAでこの問題を解決するためには、図面を開く「前」に、あるいは開いた瞬間に、特定のシステム変数を操作する必要があります。主役となるのは次の2つです。

1. `PROXYNOTICE` (プロキシ警告通知)

  • 図面を開いたときに、プロキシオブジェクトに関する警告ダイアログを表示するかどうかを決定します。
  • 設定値:`0`(警告を表示しない)、`1`(警告を表示する)

2. `PROXYSHOW` (プロキシ表示設定)

  • 図面内のプロキシグラフィックスを画面上にどのように表示するかを制御します。
  • 設定値:`0`(表示しない)、`1`(境界ボックスを表示)、`2`(プレビュー表示)

自動化における正解は、ずばり `PROXYNOTICE = 0` に設定することです。これによって、あの忌々しいダイアログの発生源を根から断つことができます。

—

3. 【実践】プロキシ警告を完全に沈黙させるVBAコード

それでは、実務でそのまま使える堅牢なコードを公開します。
このコードは、指定したフォルダ内のDWGファイルを次々と開き、警告を出さずにサイレント処理するためのテンプレート構造を持っています。

Sub SilentOpenAndProcess()
Dim targetFolder As String
Dim fileName As String
Dim openDoc As Document

‘ 処理対象のフォルダパスを指定(環境に合わせて変更してください)
targetFolder = “C:\AutoCAD_Drawings\”

‘ フォルダ内のDWGファイルを取得
fileName = Dir(targetFolder & “.dwg”)

If fileName = “” Then
MsgBox “対象の図面が見つかりませんでした。”, vbExclamation
Exit Sub
End If

‘ AutoCADの画面更新を一時停止し、パフォーマンスを爆発的に上げる
ThisDrawing.Application.ScreenUpdating = False

On Error GoTo ErrorHandler

Do While fileName <> “”
‘ —————————————————-
‘ 【重要】プロキシ警告を沈黙させるためのシステム変数設定
‘ —————————————————-
‘ 1. プロキシ警告ダイアログの表示をオフにする (0:非表示)
ThisDrawing.SetVariable “PROXYNOTICE”, 0

‘ 2. ついでに不要なプロキシ描画処理を抑制してメモリを節約 (0:非表示)
ThisDrawing.SetVariable “PROXYSHOW”, 0

‘ 図面をサイレントオープン
Set openDoc = Documents.Open(targetFolder & fileName)

‘ — ここに図面に対する実際の処理(画層整理や属性変更など)を書く —
‘ 例: Debug.Print openDoc.Name & ” を処理しました。”

‘ 変更を保存して閉じる(保存不要なら .Close False に変更)
openDoc.Close True

‘ 次のファイルへ
fileName = Dir()
Loop

‘ 画面更新を復元
ThisDrawing.Application.ScreenUpdating = True
MsgBox “すべての図面のサイレント処理が完了しました!”, vbInformation
Exit Sub

ErrorHandler:
‘ エラー発生時も画面更新とシステム変数がスタックしないようケア
ThisDrawing.Application.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub

—

4. チーフアーキテクトが教える「陥りやすい罠」と回避策

上記のコードは非常に強力ですが、AutoCAD VBAを極める上では、さらに一歩進んだ「エンジニアの視点」が必要です。現場でよくある失敗パターンを共有しておきます。

罠1:「図面が開いていない状態」で `SetVariable` を叩いてしまう

`ThisDrawing.SetVariable` は、あくまで「現在アクティブな図面(ThisDrawing)」のシステム変数を変更するメソッドです。
もしAutoCADを起動しただけで、まだ1枚も図面を開いていない(またはすべて閉じている)状態でこのコードを実行すると、「実行時エラー: オブジェクト変数または With ブロック変数が見つかりません」というエラーで即死します。

  • 対策:

AutoCADのシステム変数は、アプリケーション全体のデフォルト値として `Preferences` オブジェクトから変更するか、あるいは上記コードのように最初の図面を開く直前、あるいはアプリケーションスコープで制御する必要があります。ただ、実務上は、マスタードキュメントや起動用ルーチンから安全に呼び出す設計にすることが鉄則です。

罠2:処理が終わったあとの「環境復元」を忘れる

スクリプト内で `PROXYNOTICE` を `0` に書き換えた場合、マクロが終了した後もAutoCADはその設定を保持し続けます。
普段の設計作業に戻ったとき、「あれ?他の図面を開いたときに警告が出なくなっちゃったけど大丈夫?」と、かえってトラブルの原因になることがあります。
できれば、一連のバッチ処理の最後には、元の値(通常は `1`)に戻す後始末(クリーンアップ)の意識を持つと、プロとして非常に美しいコードになります。

—

まとめ

今回は、図面オープン時の最大の障壁である「プロキシオブジェクト警告」をシステム変数(`PROXYNOTICE` / `PROXYSHOW`)で完全に沈黙させるテクニックを解説しました。

  • `PROXYNOTICE` を `0` にするだけで、無人バッチ処理の最大の敵であるダイアログを消し去ることができる。
  • 大量ファイルを扱う際は、`ScreenUpdating = False` との組み合わせでパフォーマンスと安定性が飛躍的に向上する。

ここをクリアできれば、あなたのAutoCAD自動化の可能性は無限に広がります。夜間バッチも、朝出社したときの完全自動化も、すべてあなたの手の中に。

それでは、次回の極限の知見でお会いしましょう。あなたの開発ライフが素晴らしいものになりますように!

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