こんにちは!AutoCADの自動化の世界へようこそ。
あなたが普段、図面を描くときに何気なく使っている「OSNAP(オブジェクトスナップ)」や「PICKBOX(選択ボックス)」のサイズ。実はこれ、図面や人によって好みが分かれたり、作業内容によって最適な値がガラリと変わったりしますよね。
「マクロの記録から一歩抜け出して、本格的なVBAツールを作りたい!」
そう思ったとき、避けて通れないのが「システム変数(System Variables)の制御」です。
今回は、AutoCAD VBAを使ってシステム変数をスマートに操り、「ツール実行時は最適な環境に強制変更し、終わったら元の状態に完璧に復元する」という、実務で絶対に知っておくべきプロの作法を伝授します。
ここをクリアすれば、あなたのVBAスキルは「おもちゃのマクロ」から「現場で頼られる実用ツール」へと一気にランクアップしますよ。さあ、一緒に扉を開けましょう!
—
1. なぜVBAでシステム変数をいじる必要があるのか?
AutoCADには、コマンドの挙動を裏でコントロールする数百もの「システム変数」が存在します。
例えば、こんな経験はありませんか?
- 「プログラムで線分を描画したいのに、変なスナップが効いて変なところに吸い寄せられる……」
- 「オブジェクトを選択するカーソル(ピックボックス)が小さすぎて、クリックミスが多発する……」
これらは、ユーザーが手動で設定を変えていれば防げますが、「他人が作った図面」や「初期化されたばかりの環境」でVBAを動かすと、予期せぬバグや作図ミスを引き起こす原因になります。
プロのエンジニアは、コードの冒頭で「我が闘争(作図)に最適な環境」を強制構築し、処理が終わったら「元の平和な状態」に戻してしれっと立ち去ります。この「後始末の美学」をコードで実現するのが今回のテーマです。
—
2. 魔法のメソッド:`GetVariable` と `SetVariable`
AutoCAD VBAでシステム変数を操作するには、`AcadDocument` オブジェクトが持つ2つのメソッドを使います。
1. `GetVariable(“変数名”)`:現在のシステム変数の値を取得する(記憶する)
2. `SetVariable(“変数名”, 値)`:システム変数を新しい値に書き換える(変更する)
言葉で説明するより、実際のコードを見た方が早いですね。
まずは、実務でそのままコピペして使える「安全設計のテンプレート」を見てください。
【実践コード】環境設定を自動最適化する安全なマクロ
Sub OptimizeEnvironmentExample()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing.Application.ActiveDocument
‘ — 【ステップ1】変更前の元の値を退避(記憶)する —
Dim originalOsMode As Integer
Dim originalPickBox As Integer
On Error GoTo ErrorHandler ‘ エラー時に復元処理へジャンプする保険
‘ GetVariableで現在の値を取得
originalOsMode = acadDoc.GetVariable(“OSMODE”)
originalPickBox = acadDoc.GetVariable(“PICKBOX”)
‘ — 【ステップ2】作業に最適な環境へ強制書き換え —
‘ OSMODE = 1 + 2 (端点+中点スナップのみ有効にするビット値)
acadDoc.SetVariable “OSMODE”, 3
‘ PICKBOX = 5 (選択ボックスのピクセルサイズを少し大きめに)
acadDoc.SetVariable “PICKBOX”, 5
MsgBox “環境設定を最適化しました!作図処理を実行します……”, vbInformation, “最適化中”
‘ —————————————————-
‘ ここに本来の作図処理(LineやCircleの生成など)が入ります
‘ —————————————————-
‘ — 【ステップ3】正常終了時に元の値へ完璧に復元する —
acadDoc.SetVariable “OSMODE”, originalOsMode
acadDoc.SetVariable “PICKBOX”, originalPickBox
MsgBox “処理が正常に完了しました。設定を元に戻しました。”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ — 【もし途中でエラーが起きた場合の安全装置】 —
MsgBox “エラーが発生しましたが、環境設定を安全に復元します。”, vbCritical, “エラー検知”
‘ エラー時でも確実に元に戻す
acadDoc.SetVariable “OSMODE”, originalOsMode
acadDoc.SetVariable “PICKBOX”, originalPickBox
End Sub
—
3. コードの解説:なぜこの書き方が「プロ仕様」なのか?
上記のコードには、現場で生き残るための3つの重要な工夫が詰まっています。
① `On Error GoTo` によるエラーハンドリングの鉄則
VBAの実行中に何らかのエラー(例えば、予期せぬオブジェクト選択エラーなど)が発生した場合、プログラムはそこで強制停止します。
もし「元の値に戻す処理」の前にプログラムが止まってしまったらどうなるでしょう?
ユーザーのAutoCADの「OSスナップが勝手に変わったまま」になり、「このマクロを使うと設定が壊れる!」という最悪の評判が立ちます。
それを防ぐために、エラーが起きたら必ず復元ルート(ErrorHandler)を通る仕組みが不可欠なのです。
② 正しいデータ型の選択
`GetVariable` が返す値のデータ型は、システム変数によって異なります(整数、実数、文字列など)。
- `OSMODE` や `PICKBOX` は整数(Integer / Long)なので、受け取る変数も整数型で宣言します。
- 浮動小数点数(例: `LTSCALE` など)の場合は `Double` 型、文字列(例: `FILEDIA` などは整数ですが、文字を返すものもあります)の場合は `String` 型で受け取る必要があります。型が合わないと「型が一致しません(Error 13)」というエラーになるので注意しましょう。
—
4. 初学者が陥りがちな「3つの罠」
AutoCAD VBAを学び始めたばかりの頃、多くの人が次のような罠にハマります。あらかじめ知っておけば怖くありません。
罠1:読み取り専用(Read-only)のシステム変数を書き換えようとする
すべてのシステム変数が `SetVariable` で変更できるわけではありません。例えば、現在の図面ファイル名を表す `DWGNAME` や、図面の状態を示す一部の変数は「読み取り専用」です。これらを変更しようとするとAutoCADが怒りだしてエラーになります。変更したい変数が書き換え可能か、AutoCADのヘルプで確認する習慣をつけましょう。
罠2:アプリケーションスコープとドキュメントスコープの混同
システム変数には、「図面ごとに保持されるもの(例: OSMODE)」と「AutoCAD全体で共通のもの(例: FILEDIA:ファイルダイアログを表示するかどうか)」があります。
基本的には今回紹介したように `ThisDrawing.Application.ActiveDocument.SetVariable`(または単に `ThisDrawing.SetVariable`)を使っておけば、アクティブな図面内の変数に関しては確実にコントロールできます。
罠3:マクロの記録をそのまま信じる
「マクロの記録」機能を使うと、メニュー操作がそのままVBAコードになりますが、システム変数の変更は記録されないことが多いです。そのため、手動でコードを書き下ろす必要があります。「ここぞという設定は自分でコードを書く!」この意識が上達への近道です。
—
5. おわりに:ここをクリアすれば、基本はバッチリ!
いかがでしたか?
`GetVariable` と `SetVariable` を使いこなせるようになると、単に図形を描くだけのプログラムから、「ユーザーの作業環境を思いやり、安全に動作する洗練されたアドインツール」を作ることができるようになります。
「環境を整える ⇒ 処理をする ⇒ 元に戻す」
このサンドイッチ構造は、ファイル操作やレイヤー操作など、他の高度な自動化処理でも共通して使える黄金パターンです。
ここをクリアできれば、あなたのAutoCAD VBAの基礎力はもうバッチリです!
ぜひ今日の業務から、あなたのマクロに「安全な環境復元」を取り入れてみてくださいね。それでは、次のステップでお会いしましょう!
