【AutoCAD VBA入門】「名前のない図面」でエラーを出さないために。初回保存ダイアログをスマートに制御する方法
こんにちは。AutoCAD VBAの世界へようこそ。
マクロの記録機能を使って「あ、これ便利だな」と最初の一歩を踏み出したあなた。素晴らしいセンスです。まずは「動くものを作る」ことから始める。それがエンジニアとしての正しいスタートラインですから。
しかし、いざ自分でコードを書き始めると、ある「壁」にぶつかることがあります。
それは、「マクロの記録では動いたのに、新規図面で実行するとエラーで止まってしまう」という問題です。
今日は、その壁の正体と、それを鮮やかに回避して「プロっぽい挙動」を実現するテクニックを伝授します。ここをクリアすれば、あなたのコードは一段上の「道具」へと進化しますよ。
1. なぜ「Save」メソッドは失敗するのか?
まず、何が起きているのかを整理しましょう。
多くの初心者が最初に書くコードは、おそらくこのようなものです。
' 失敗する例
Sub SimpleSave()
ThisDrawing.Save ' ← ここでエラーが出る!
End Sub
「保存するだけなのに、なぜエラーが出るんだ?」と不思議に思うかもしれませんね。
理由はシンプルです。AutoCADにとって、保存(Save)とは「既存のファイルに上書きすること」を意味するからです。
図解:図面の「アイデンティティ」
図面オブジェクトには、目に見えない「履歴」があります。
- 保存済みの図面: 「私は `C:\Projects\Drawing1.dwg` という名前で、この場所に存在しています」という明確な身分(パス)を持っている。
- 新規図面(Drawing1): 「私はまだ名前も場所も決まっていない、メモリ上の存在です」という、まだ身分証を持っていない状態。
身分証(ファイルパス)を持っていない状態の図面に対して、「今ある場所に上書き保存して!」と命令(`Save`メソッド)を出しても、AutoCADは「どこに? 何という名前で? そんな場所、知らないよ!」とパニックを起こしてエラーを返してしまうのです。
2. 解決への鍵:`Path` プロパティを見極める
この問題をスマートに解決するには、プログラムに「今、この図面は保存済みか、それとも新規図面か?」を判断させる知能を持たせる必要があります。
ここで登場するのが、`ThisDrawing.Path` プロパティです。
- 保存済みの場合: `”C:\Users\Documents”` のように、ファイルが置かれているフォルダのパスが返ってきます。
- 新規図面の場合: `””` (空の文字列)が返ってきます。
「パスが空なら、まだ名前が決まっていない新規図面だ」と判断する。これこそが、プロフェッショナルな制御の第一歩です。
3. 実践:ダイアログを強制表示させる「黄金のテンプレート」
それでは、実際に現場でそのまま使えるコードを見てみましょう。
「保存済みならそのまま保存、新規なら名前を付けて保存ダイアログを出す」という、ユーザーに優しいロジックです。
Sub SmartSaveRoutine()
' 変数の宣言:エラーを防ぐための基本です
Dim filePath As String
Dim fileFilter As String
' 1. 図面の現在の状態をチェック
' Pathプロパティが空("")なら、まだ一度も保存されていない新規図面と判断します
If ThisDrawing.Path = "" Then
' --- 【新規図面の場合】名前を付けて保存ダイアログを表示 ---
' 保存時のファイル形式を指定(AutoCADの標準形式)
fileFilter = "AutoCAD Drawing (*.dwg)|*.dwg"
' ダイアログを表示して、ユーザーにファイル名を入力してもらう
' GetFileSaveName は、ユーザーが「キャンセル」を押すと空文字を返します
filePath = Application.GetFileSaveName(InitialFilename:="Drawing1.dwg", FileFilter:=fileFilter)
' ユーザーがキャンセルを押した場合の処理
If filePath = "" Then
MsgBox "保存がキャンセルされました。処理を終了します。", vbInformation
Exit Sub
End If
' ユーザーが選んだ名前で「名前を付けて保存」を実行
On Error Resume Next ' 万が一のファイル書き込みエラーに備える
ThisDrawing.SaveAs filePath
If Err.Number <> 0 Then
MsgBox "保存に失敗しました。ファイルが使用中か、権限がありません。", vbCritical
Err.Clear
Exit Sub
End If
On Error GoTo 0
MsgBox "新規保存が完了しました!", vbInformation
Else
' --- 【保存済み図面の場合】そのまま上書き保存 ---
ThisDrawing.Save
MsgBox "上書き保存が完了しました。", vbInformation
End If
End Sub
コードの重要ポイント解説
1. `Application.GetFileSaveName`: これが魔法のコマンドです。Windows標準の「名前を付けて保存」ダイアログを呼び出します。これを使わずに無理やり保存しようとするからエラーになるのです。
2. `If filePath = “”`: ユーザーは必ずしも「保存」ボタンを押すとは限りません。「キャンセル」を押した時にエラーで止まるのは、非常に不親切なプログラムです。キャンセルを検知して、優しく処理を抜けるのが「デキるエンジニア」の作法です。
3. `On Error Resume Next`: ファイルが「読み取り専用」だったり、他のソフトで開かれていたりすると、保存時にエラーが発生します。これを防ぐための「守りの構え」です。
4. まとめ:オブジェクトの「状態」を意識しよう
今回の学びを振り返りましょう。
- `Save` は、既存のファイルに「上書き」するもの。
- `SaveAs` は、新しい名前や場所で「保存」するもの。
- `Path` プロパティが空なら、それは「身分証のない新規図面」。
AutoCAD VBAを操る上で大切なのは、単に命令(メソッド)を並べることではありません。「今、操作しようとしているオブジェクト(図面)が、どのような状態にあるのか?」を常に問いかけることです。
オブジェクトのライフサイクル(誕生から保存、そして消滅まで)を意識できるようになると、あなたの書くコードは驚くほど堅牢で、使いやすいものに変わっていきます。
ここをクリアしたあなたは、もう「マクロの記録」の枠を超え始めています。
自信を持って、次のステップへ進んでください。応援していますよ!
