こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録から一歩踏み出し、「自分の手で業務を完全に自動化したい!」という熱意を持つあなたを、今日は心から歓迎します。
さて、現場でバリバリとVBAを書くようになると、誰もが一度はこんな壁にぶつかります。
「バックグラウンド(画面非表示)で図面を大量処理させたいのに、途中で『上書きしますか?』みたいなダイアログが出て、処理が完全にフリーズしやがった……!」
……失礼、思わずエンジニアの血が騒いで言葉が乱れてしまいました(笑)。
でも、これ、本当によくある「AutoCAD VBAあるある」なんです。画面が見えていない状態でダイアログを出されても、人間はクリックできませんよね。結果、AutoCADは無限にユーザーからの返事を待ち続け、夜通し走らせるはずだったバッチ処理が朝出社したら1枚目で止まっていた、という悲劇が起きます。
ここを綺麗にクリアできるようになると、あなたの自動化スキルは一気に「プロの領域」へとランクアップします。
今日は、非表示処理の裏側で何が起きているのか、そしてそれをどうやって完璧に手なずけるのか。私が現場で使っている「定石」を優しく、そして深く伝授しましょう。ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ!
—
なぜ、バックグラウンド処理はダイアログで止まるのか?
私たちが普段何気なく使っている `AcadApplication.Visible = False`。これを使うと、AutoCADの画面を隠したまま、裏側で高速に図面を開き、修正し、保存して閉じるという夢のような「完全バックグラウンド処理」が実現できます。
しかし、ここに大きな罠があります。
AutoCADは、ユーザーが画面の前に座っていることを前提に作られています。そのため、図面を閉じる時に未保存の変更があったり、同名のファイルが既に存在したりすると、親切心(?)からこう聞いてきます。
- 「変更を保存しますか? (はい/いいえ/キャンセル)」
- 「既存のファイルを上書きしますか? (はい/いいえ)」
画面が表示されていればポチッとクリックすれば済む話ですが、`Visible = False` の世界にはクリックするマウスも、それを映すモニターもありません。 結果として、AutoCADは裏側でポツンと立ち尽くし、永遠の眠りにつくことになります。
—
救世主は「システム変数」! プロが使う2つの魔法
この問題を解決するために、私たちはAutoCADの心臓部である「システム変数」を操作します。
特に覚えておくべきなのは、この2つです。
1. `FILEDIA` (ファイルダイアログの表示制御)
- 通常は `1`(ダイアログを表示する)。これを `0` にすると、ダイアログを出さずにコマンドラインからのテキスト入力で処理を進めるようになります。
2. `EXPERT` (エキスパートモード)
- AutoCADの「本当にいいんですね?」というお節介な確認プロンプトを強制的にスキップさせるための変数です。レベルを `5` などに上げると、「上書きしてもいい?」といった警告をすべて「はい」とみなして自動突破してくれます。
これらをVBAのコード内で一時的に書き換え、処理が終わったら元の状態に必ず戻す。これが、バックグラウンド処理を完遂するための絶対的な定石です。
—
【実践】ダイアログを完全無視するバッチ処理コード
それでは、実際に動かせる実用的なコードを見てみましょう。
今回は、指定したフォルダ内にある複数の図面をバックグラウンドで開き、文字を置き換えて上書き保存する……というシナリオを想定しています。
開発環境のVBE(Visual Basic Editor)を開き、標準モジュールに以下のコードを貼り付けてみてください。
Sub PerfectBackgroundProcess()
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim targetPath As String
Dim fileName As String
‘ 1. 現在のシステム変数を退避(後で元に戻すため)
Dim oldFileDia As Integer
Dim oldExpert As Integer
On Error GoTo ErrorHandler ‘ エラー時に必ず設定を戻すための安全装置
‘ AutoCADのインスタンスを取得(または起動)
Set acadApp = ThisDrawing.Application
‘ 【重要】ここでシステム変数を退避&変更!
oldFileDia = acadApp.GetSystemVariable(“FILEDIA”)
oldExpert = acadApp.GetSystemVariable(“EXPERT”)
‘ ダイアログを非表示、確認プロンプトを完全抑制
acadApp.SetSystemVariable “FILEDIA”, 0
acadApp.SetSystemVariable “EXPERT”, 5
‘ 2. 画面を非表示にする(完全バックグラウンド化)
‘ acadApp.Visible = False ‘ ※テスト時はコメントアウトを外してください
‘ 処理対象のフォルダパス(環境に合わせて変更してください)
targetPath = “C:\AutoCAD_Work\”
fileName = Dir(targetPath & “.dwg”)
‘ 3. ループ処理によるバッチ処理の実行
Do While fileName <> “”
‘ 図面をバックグラウンドで開く
Set acadDoc = acadApp.Documents.Open(targetPath & fileName)
‘ — ここに実際の図面処理(画層変更や文字置換など)を書く —
‘ 例:図面が開いたことをイミディエイトウィンドウに表示
Debug.Print “処理中: ” & fileName
‘ 図面を上書き保存して閉じる(FILEDIA=0 と EXPERT=5 のおかげでダイアログが出ない!)
acadDoc.Close True
‘ 次のファイルへ
fileName = Dir
Loop
ErrorHandler:
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
‘ 4. 【最重要】どんな状況でも必ずシステム変数を元に戻す!
acadApp.SetSystemVariable “FILEDIA”, oldFileDia
acadApp.SetSystemVariable “EXPERT”, oldExpert
‘ 画面を元に戻す
acadApp.Visible = True
MsgBox “すべてのバックグラウンド処理が完了しました!”, vbInformation
End Sub
—
コードの注目ポイント(プロのこだわり)
このコードには、現場で生き残るための「エンジニアの知見」がいくつか詰められています。
1. エラーハンドリング(`On Error GoTo`)の徹底
バックグラウンド処理中に何らかの予期せぬエラー(ファイルが壊れているなど)が発生した場合、もしそのままプログラムが止まるとどうなるでしょう?
「`FILEDIA = 0`、`EXPERT = 5` のままAutoCADが放置される」という恐ろしい状態になります。次に手動でAutoCADを使った時、ダイアログが出なくなったり、確認なしで上書きされてしまったりして大惨事になります。
だからこそ、エラーが起きようとも確実に元の設定値に戻す仕組み(ファイアウォールのようなもの)が絶対に不可欠なのです。
2. システム変数の「退避と復元」
`oldFileDia = acadApp.GetSystemVariable(“FILEDIA”)` で今の状態を記憶し、処理の最後で必ず書き戻す。この丁寧な作法が、他のマクロやユーザーの操作環境を壊さないプロのプログラミングです。
—
まとめ
いかがでしたか?
`AcadApplication.Visible = False` を使うときは、必ずセットで `FILEDIA` と `EXPERT` の制御をセットで考える。これが、夜間に安心してPCを放置できる自動化システムを作るための極意です。
ここをクリアできれば、あなたはもう単なる「マクロ記録者」ではありません。現場の生産性を劇的に向上させる「AutoCAD自動化エンジニア」の第一歩を確実に踏み出しています。
ぜひ、ご自身の環境でも試してみてくださいね。それでは、次回の応用編でお会いしましょう!
