こんにちは!AutoCADの自動化の世界へようこそ。
チーフアーキテクトの私です。
「マクロの記録」で作ったコードをいざ再生してみたら、なぜか保存のところでエラーが起きる、あるいは意図しない古い形式になってしまって困った――そんな経験はありませんか?
AutoCAD VBAにおいて、図面を保存する操作は最も基本でありながら、オブジェクトモデルの作法と「ファイル形式・バージョン」の罠を知らないと、簡単に牙を剥くポイントでもあります。
今回は、初心者の方が絶対に躓かないための『`AcadDocument.SaveAs`の極意』を、優しく、そして本質的なところまで徹底的に解説していきましょう。ここをクリアすれば、あなたのVBAスキルは「マクロの初心者」から「脱・初心者エンジニア」へと確実にステップアップしますよ!
—
1. なぜ「SaveAs」でつまずくのか?(オブジェクトモデルの基本)
まず、AutoCAD VBAの心臓部を思い出してください。
AutoCADでは、開いている図面一つひとつが `AcadDocument` というオブジェクトとしてメモリ上に存在しています。そして、その図面をファイルとしてハードディスクに書き出すのが `SaveAs` メソッドです。
ここで初心者がやりがちなミスが、現在アクティブな図面(`ActiveDocument`)のコンテキストを無視して、いきなり保存メソッドを叩いてしまうこと。さらに厄介なのが、「保存先のファイル形式(DWGなのかDXFなのか)」や「どのAutoCADのバージョンで保存するのか」を正しく指定できていないケースです。
SaveAsの基本構文
object.SaveAs FileName, [FileFormat], [SecurityParams]
- FileName: 保存先のフルパス(例: `”C:\Works\Drawing1.dwg”`)
- FileFormat: 保存するファイルの形式とバージョン(超重要!)
- SecurityParams: パスワードなどのセキュリティ設定(通常は省略可)
この中の `FileFormat` に何を渡すかで、保存の成否が決まります。
—
2. 魔法の定数「AcSaveAsType」をマスターする
異なるバージョンのAutoCADを使っている取引先や協力会社へ図面を渡すとき、「AutoCAD 2013形式のDWGで保存してほしい」「DXF形式で吐き出してほしい」と言われることはよくありますよね。
ここで登場するのが、AutoCAD VBAがあらかじめ用意してくれている定数グループ、`AcSaveAsType`(ファイル形式列挙型) です。
これを知っていれば、もうバージョン違いのトラブルに怯える必要はありません。代表的なものをいくつか見てみましょう。
| 指定する定数 | 意味・ファイル形式 | 主な用途 |
| :— | :— | :— |
| `acR12_DXF` | AutoCAD R12/LT2 DXF | 古い他社製CAMや特殊な加工機へデータを渡すとき |
| `ac2000_DWG` / `ac2000_DXF` | AutoCAD 2000 形式 | レガシーなシステムとの連携 |
| `ac2004_DWG` / `ac2004_DXF` | AutoCAD 2004 形式 | 一部の堅いインフラ系データやり取り |
| `ac2010_DWG` / `ac2010_DXF` | AutoCAD 2010 形式 | 幅広いバージョンで読める汎用形式 |
| `ac2018_DWG` / `ac2018_DXF` | AutoCAD 2018 以降形式 | 最新の標準形式(2018〜2025現在) |
※AutoCADのバージョンが上がるにつれて、新しい形式の定数が追加されていきます。「今の自分の環境で何が使えるか」は、VBAのオブジェクトブラウザ(`F2`キー)で `Ac` から始まる定数を覗いてみると一目瞭然です。
—
3. 【実践】絶対に失敗しない!バージョンを指定した保存マクロ
それでは、実際に動かせる実用的なコードを見てみましょう。
このコードでは、現在開いている図面を「AutoCAD 2010形式のDWG」として別名保存する処理を行います。
Sub SaveAsSpecificVersion()
Dim oDoc As AcadDocument
Set oDoc = ThisDrawing.Application.ActiveDocument
‘ 保存先のパスとファイル名を設定
Dim targetPath As String
targetPath = “C:\AutoCAD_Works\Sample_2010.dwg”
‘ エラーハンドリングの準備(上書き時のトラブル防止)
On Error GoTo ErrorHandler
‘ 【重要】すでに同名のファイルが存在する場合の対策
If Dir(targetPath) <> “” Then
‘ すでにファイルがある場合は削除するか、別名にするなどの処理を挟む
‘ ここではシンプルに上書きを許可するため一度ファイルをキル(削除)
Kill targetPath
End If
‘ AutoCAD 2010 形式の DWG として保存を実行
‘ ac2010_DWG を指定することで、古いバージョンを使っている相手にも優しく渡せます
oDoc.SaveAs targetPath, ac2010_DWG
MsgBox “保存が正常に完了しました!”, vbInformation, “成功”
Exit Sub
ErrorHandler:
MsgBox “保存中にエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
コードの解説とエンジニアの知見
1. `ThisDrawing.Application.ActiveDocument`:
今まさに操作しているドキュメントを安全に取得しています。`ActiveDocument` を明示的に変数に格納することで、コードが迷子になるのを防げます。
2. `Dir` 関数と `Kill` ステートメント:
実は、`SaveAs` メソッドは「すでに同名のファイルが存在する場合、エラーを吐くか、警告ダイアログを出して処理が止まる」という性格を持っています。完全自動化(バッチ処理など)を目指す場合、このダイアログは致命的な足止めになります。そのため、事前にファイルが存在するかチェックし、安全にクリアしておくのがプロの技です。
—
4. 警告ダイアログや上書きエラーを華麗に回避する極意
先ほど少し触れましたが、AutoCAD VBAで最も厄介なのは、「保存しますか?」「上書きしますか?」という見えないダイアログが背後でポップアップし、プログラムがフリーズしたように止まってしまう現象です。
これを防ぐための、知られざる強力なシステム変数があります。それが `EXPERT` と `FILEDIA` です。
もし完全に裏側でサイレント保存(確認なしでの上書き保存)を行いたい場合は、以下のようにシステム変数を一時的に操作します。
Sub SilentSaveAs()
Dim oDoc As AcadDocument
Set oDoc = ThisDrawing.Application.ActiveDocument
Dim targetPath As String
targetPath = “C:\AutoCAD_Works\SilentSample.dwg”
‘ — ダイアログや警告を完全ブロック —
‘ FILEDIAを0にすると、ファイル保存ダイアログの表示を抑制
Dim oldFileDia As Integer
oldFileDia = ThisDrawing.GetVariable(“FILEDIA”)
ThisDrawing.SetVariable “FILEDIA”, 0
‘ EXPERTを5などにすると、「上書きしますか?」の警告すらスキップして強制上書き
Dim oldExpert As Integer
oldExpert = ThisDrawing.GetVariable(“EXPERT”)
ThisDrawing.SetVariable “EXPERT”, 5
—————————————–
On Error GoTo SafeExit
‘ 保存実行(同名ファイルがあっても警告なしで上書きされる)
oDoc.SaveAs targetPath, ac2018_DWG
SafeExit:
‘ — 設定を必ず元の状態に戻す(これ超重要!) —
ThisDrawing.SetVariable “FILEDIA”, oldFileDia
ThisDrawing.SetVariable “EXPERT”, oldExpert
If Err.Number = 0 Then
MsgBox “サイレント保存が完了しました。”, vbInformation
Else
MsgBox “エラー: ” & Err.Description, vbCritical
End If
End Sub
チーフアーキテクトからの警告
`FILEDIA` や `EXPERT` などのシステム変数をいじるコードを書くときは、必ず「エラーが起きようとも、元の値に復元する(SafeExitのような脱出経路を作る)」ことを鉄則にしてください。これを怠ると、ユーザーが手動でAutoCADを操作するときに「ファイル保存画面が出ない!」「警告が出なくて怖い!」という深刻なユーザビリティのバグを引き起こす原因になります。
—
まとめ:ここをクリアすればAutoCAD VBAの基本はバッチリ!
今回は、`AcadDocument.SaveAs` を用いたファイル形式・バージョンの指定方法と、自動化の大敵である「警告ダイアログの回避策」について解説しました。
- ファイル形式の指定には `AcSaveAsType` 列挙体(例: `ac2010_DWG`)を使うこと
- 同名ファイルが存在する場合のエラーやダイアログの挙動を予測しておくこと
- 完全自動化にはシステム変数(`FILEDIA` や `EXPERT`)のコントロールが有効だが、復元処理を忘れないこと
この3つさえ押さえておけば、図面の保存周りで路頭に迷うことはもうありません。
日々の面倒な「バージョン変換の手間」や「ファイル名の付け替え作業」は、すべてVBAに肩代わりさせちゃいましょう。
あなたのAutoCAD自動化ライフが、より快適で創造的なものになることを応援しています!
