こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録から一歩踏み出し、「自分の手で業務を自動化するぞ!」と意気込んでいるあなたへ。
今回は、AutoCAD VBAの基礎中の基礎でありながら、実務の現場で100%の確率で遭遇する「罠」を回避するための極意を伝授します。
ここをクリアすれば、AutoCAD VBAのオブジェクトモデルの扱い方がグッと体に馴染んできますよ。気負わずに、一緒に見ていきましょう!
—
1. なぜ「上書き保存」でエラーが起きるのか?
AutoCADで図面を編集しているとき、私たちは迷わず「上書き保存(Ctrl + S)」をしますよね。VBAの世界でも同じように、図面を保存したいときは `Save` というメソッドを使います。
しかし、ここでプログラミング初学者が必ずと言っていいほどハマる「壁」があります。
それは、「まだ一度も名前を付けて保存していない(新規作成したばかりの)図面」に対して、いきなり `Save` を実行してしまうエラーです。
想像してみてください
あなたがメモ帳を開いて、新しい文章をサラサラと書き殴ったとします。まだ一度もファイルを保存していません。その状態で「上書き保存ボタン」を押したらどうなりますか?
パソコンは「えっ、どこに、なんて名前で保存すればいいの?」と困ってしまい、「名前を付けて保存」のダイアログを出してきますよね。
しかし、AutoCAD VBAの `Save` メソッドは冷酷です。保存先(ファイルパス)が決まっていない図面に対して `Save` を命じると、ダイアログを出して優しく聞いてくれるわけではなく、無慈悲な実行時エラー(Runtime Error)を発生させてマクロを強制終了させます。
自動化ツールを作ったつもりが、エラーで止まってしまっては本末転倒ですよね。
—
2. 救世主:`AcadDocument.FullName` という判定基準
この悲劇を防ぐために、AutoCADのオブジェクトモデルには素晴らしいプロパティが用意されています。それが `FullName` です。
- `AcadDocument.FullName` とは?
現在アクティブな図面が、ハードディスク上のどこに、どんな名前で保存されているか(例:`C:\Works\Drawing1.dwg`)をフルパスで返す文字列プロパティです。
未保存図面の「無の世界」
もし、その図面が新規作成されたままで、まだ一度も保存されていなければ……。
なんと、`FullName` は「長さゼロの文字列(`””`)」を返します。 パスが存在しないからです。
つまり、次のようなロジックが成り立ちます。
> 「`FullName` が空っぽ(`””`)なら、まだ保存されていない新規図面だ!」
この判定さえできれば、エラーを完全に回避できるというわけです。
—
3. 実装コード:安全な保存処理の全貌
それでは、実務でそのまま使える「安全な保存処理」のVBAコードを見てみましょう。
開発環境(VBE)の標準モジュールに、そっくりそのままコピー&ペーストして試してみてください。
Sub SafeSaveDrawing()
Dim oDoc As AcadDocument
Set oDoc = ThisDrawing.Application.ActiveDocument
‘ 【重要】FullNameプロパティを使って、保存済みか判定する
If oDoc.FullName = “” Then
‘ — パスが空 = まだ一度も保存されていない新規図面 —
MsgBox “この図面はまだ保存されていません。” & vbCrLf & _
“「名前を付けて保存」ダイアログを表示します。”, vbInformation, “保存確認”
‘ SendCommandを使って「SAVEAS」コマンドを呼び出す
‘ ※注意: ダイアログを確実に出すためにプレフィックスとしてハイフンなしの SAVEAS を実行
oDoc.SendCommand “._SAVEAS ”
Else
‘ — パスが存在する = すでに保存されている図面 —
oDoc.Save
MsgBox “上書き保存が完了しました。” & vbCrLf & _
“パス: ” & oDoc.FullName, vbInformation, “保存完了”
End If
End Sub
コードのポイント解説
1. `ThisDrawing.Application.ActiveDocument`
今まさに画面で開かれているアクティブな図面(Documentオブジェクト)を変数 `oDoc` に格納しています。これがAutoCAD VBAのすべての基本です。
2. `If oDoc.FullName = “” Then`
ここが今回のテーマの核心です。文字列が空(カラ)であるかを判定し、新規図面か既存図面かを鮮やかに仕分けています。
3. `oDoc.SendCommand “._SAVEAS “`
未保存の場合、いきなりプログラム側でファイル名を指定して保存するのではなく、AutoCADの標準コマンド(`SAVEAS`)をVBAから実行(SendCommand)させています。これにより、ユーザーにいつもの見慣れたダイアログボックスを提示し、保存場所を安全に選ばせることができます。
(※コマンドの頭にある `._` は、言語の違いやコマンドのオーバーライドによるエラーを防ぐためのプロの技です)
4. `oDoc.Save`
すでにパスが存在する場合は、迷わず `Save` メソッドを叩いてスマートに上書き保存します。
—
4. チーフアーキテクトからのワンポイントアドバイス
今回は「新規作成図面への上書き保存エラーを回避する」というテーマでお届けしましたが、この `FullName` (あるいはファイル名の取得に特化した `Name` や、ファイル拡張子を除いた `GetVariable` による管理など)を意識するクセをつけると、AutoCAD VBAのコードの「堅牢性(エラーに強いこと)」が劇的に向上します。
実務でバッチ処理(複数の図面をまとめて開いて処理し、上書き保存して閉じるマクロなど)を書く際も、「この図面は本当に上書き保存して大丈夫なパスを持っているか?」を最初にチェックするガード節(Guard Clause)を設けるのが、プログラマーの美しい習慣です。
ここをクリアしたあなたなら、もう「マクロの記録」だけの初心者ではありません。堂々と胸を張って、より高度な自動化の世界へ進んでください。
それでは、次回の極意でお会いしましょう。あなたのAutoCADライフが快適で爆速になりますように!
