【入門編】【初心者向け】新規図面(Drawing1)の初回保存時に「名前を付けて保存」ダイアログを強制表示させるVBA制御 – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

【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を操る上で大切なのは、単に命令(メソッド)を並べることではありません。「今、操作しようとしているオブジェクト(図面)が、どのような状態にあるのか?」を常に問いかけることです。

オブジェクトのライフサイクル(誕生から保存、そして消滅まで)を意識できるようになると、あなたの書くコードは驚くほど堅牢で、使いやすいものに変わっていきます。

ここをクリアしたあなたは、もう「マクロの記録」の枠を超え始めています。
自信を持って、次のステップへ進んでください。応援していますよ!

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