こんにちは!AutoCAD VBAの世界へようこそ。
日々、膨大な図面と格闘しているあなたなら、「せっかくマクロで自動処理を作ったのに、保存した図面を古いバージョンのAutoCADを使っている協力会社に送ったら『開けないよ!』と怒られてしまった……」なんて悲劇を、一度や二度ではなく経験しているはずです。
AutoCADはバージョンが変わるたびに、内部の図面データ形式(DWGのバージョン)も進化します。
新しいバージョンで保存された図面は、そのままでは古いバージョンで開くことができません。かといって、毎回手動で「名前を付けて保存」からファイル形式を切り替えるのは、自動化のロマンに反しますよね。
今回は、「実行しているAutoCADのバージョンを自動で判別し、相手が確実に開ける最適なバージョンへ賢くダウングレード保存する」という、実務で今すぐ使える超実践的な汎用モジュールを一緒に作っていきましょう。
ここをクリアすれば、AutoCAD VBAのバージョン制御はバッチリです!優しく丁寧にお伝えするので、リラックスしてついてきてくださいね。
—
なぜ「バージョン互換」でエンジニアは頭を悩ませるのか?
AutoCAD VBAで図面を上書き保存、あるいは別名で保存するには、お馴染みの `SaveAs` メソッドを使います。
ThisDrawing.SaveAs “C:\Work\Drawing1.dwg”, ac2018DWG
このコード、実は大きな爆弾を抱えています。
もしこのマクロを、少し古い AutoCAD 2014 がインストールされているPCで実行したらどうなるでしょうか?
答えは 「実行時エラー」。AutoCAD 2014のVBAエンジンは `ac2018DWG` なんて定数を知らないからです。
「じゃあ、常に一番古い形式で保存すればいいじゃないか」と思われるかもしれませんが、それも悪手です。最新のハイスペックな機能やオブジェクトが失われたり、データが劣化するリスクがあります。
だからこそ、「動的に(その場で柔軟に)バージョンを判定し、安全な形式を選ぶ」という知的なアプローチが必要になるのです。
—
3つのステップで理解する、バージョン判定と保存の仕組み
プログラミング初心者のうちは、「なんだか難しそう……」と身構えてしまうかもしれませんが、やっていることはたったの3つです。
1. 今動いているAutoCADのバージョン番号(メジャーバージョン)を調べる
2. そのバージョンに合わせた「安全な保存形式(AcSaveAsType)」の定数を決定する
3. 決定した形式でスマートに保存する
図解的にコードの流れを表すと、以下のようになります。
[マクロ実行]
↓
[AutoCADのバージョンを取得 (例: “24.1” -> 2024)]
↓
[バージョンに応じたSaveAsTypeを自動選択]
├─ 2025/2024 -> ac2018DWG (互換性を考慮)
├─ 2018〜2022 -> ac2018DWG
├─ 2013〜2016 -> ac2013DWG
└─ それ以前 -> ac2004DWG
↓
[SaveAs実行] = 完了!
—
【実用コード】環境適応型・スマートセーブモジュール
それでは、実際の開発現場でそのままコピペして使える完全版の汎用モジュールをプレゼントします。標準モジュールにペタッと貼り付けて使ってください。
Option Explicit
” =================================================================ヨン
” 概要: 実行環境のAutoCADバージョンを自動判別し、最適なDWG形式で保存する
” 著者: チーフアーキテクト(あなたを導く先輩より)
” =================================================================
Public Sub SmartSaveDrawing(ByVal targetFolderPath As String, ByVal baseFileName As String)
On Error GoTo ErrorHandler
Dim appVersion As String
Dim saveFormat As AcSaveAsType
Dim fullPath As String
‘ 1. ホストアプリケーションのバージョン文字列を取得 (例: “24.1.5…”, AutoCAD 2024なら “24.x”)
appVersion = Application.Version
‘ 2. バージョン番号の先頭(メジャーバージョン)を抽出して判定
‘ AutoCADの内部バージョンと西暦の対応:
‘ R24 (2025/2024/2023/2022) -> AutoCAD 2018形式が業界標準の安全圏
‘ R23 (2021/2020/2019) -> ac2018DWG
‘ R22 (2018) -> ac2018DWG
‘ R20 (2015/2016) -> ac2013DWG
‘ R19 (2013/2014) -> ac2013DWG
‘ R18 (2010/2012) -> ac2010DWG
Dim majorVersion As Integer
majorVersion = CInt(Left(appVersion, InStr(appVersion, “.”) – 1))
Select Case majorVersion
Case Is >= 22 ‘ AutoCAD 2018以降 (R22, R23, R24 など)
‘ 近年のAutoCADは2018形式をデフォルト且つ互換性の要としています
saveFormat = ac2018DWG
Case 20, 21 ‘ AutoCAD 2015 〜 2017 (R20, R21)
saveFormat = ac2013DWG
Case 18, 19 ‘ AutoCAD 2010 〜 2014 (R18, R19)
saveFormat = ac2010DWG
Case Else ‘ さらに古いレガシー環境
saveFormat = ac2004DWG
Select End
‘ 保存先のパスを結合
‘ フォルダパスの末尾に “\” がない場合の考慮も忘れないプロの配慮
If Right(targetFolderPath, 1) <> “\” Then
targetFolderPath = targetFolderPath & “\”
End If
fullPath = targetFolderPath & baseFileName & “.dwg”
‘ 3. 図面をアクティブ図面のまま指定形式で保存
‘ ※すでにファイルが存在する場合は上書き警告が出るため、必要に応じてKill等で事前削除
If Dir(fullPath) <> “” Then
Kill fullPath ‘ 既存ファイルがある場合は強制上書きの準備
End If
ThisDrawing.SaveAs fullPath, saveFormat
MsgBox “保存が完了しました!” & vbCrLf & _
“保存形式: ” & GetFormatName(saveFormat) & vbCrLf & _
“保存先: ” & fullPath, vbInformation, “スマートセーブ成功”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
” ヘルパー関数: 保存形式の列挙体を分かりやすい文字列に変換する
private Function GetFormatName(ByVal fType As AcSaveAsType) As String
Select Case fType
Case ac2018DWG: GetFormatName = “AutoCAD 2018 図面 (.dwg)”
Case ac2013DWG: GetFormatName = “AutoCAD 2013 図面 (.dwg)”
Case ac2010DWG: GetFormatName = “AutoCAD 2010 図面 (.dwg)”
Case ac2004DWG: GetFormatName = “AutoCAD 2004 図面 (.dwg)”
Case Else: GetFormatName = “その他の形式”
End Select
End Function
—
コードの注目ポイント(プロの技)
ここでお伝えしたコードには、現場で泥をかぶってきたプロフェッショナルの知見がいくつか詰まっています。
- `Application.Version` のスマートな解析
AutoCADのバージョンは単なる「2024」ではなく、`24.1.5…` のような文字列で返ってきます。そのため、`InStr` 関数を使って最初のドット(`.`)の位置を探し、そこから左側(メジャーバージョン番号)だけを抜き出すことで、将来のバージョンアップにも耐えうる堅牢な判定を実現しています。
- 業界標準としての `ac2018DWG` の採用
近年のAutoCAD(2018〜最新の2025など)は、内部のDWGデータ構造として「AutoCAD 2018形式」をベースに採用し続けています。そのため、新しい環境であっても、互換性を最大化するためにあえて `ac2018DWG` で出力するという判断が、実務では非常に効果的です。
—
陥りやすい罠とエラー回避の心得
AutoCAD VBAでファイル保存を自動化する際、初心者が必ずと言っていいほどハマる「落とし穴」が2つあります。
1. 未保存の新規図面(Drawing1.dwgなど)で `SaveAs` する場合
一度も名前をつけて保存していない図面に対して、いきなりパスを指定して保存するのは問題ありませんが、もし図面が既に別の場所にあって、それを別名で保存するようなケースでは、フォルダが存在しないとエラーになります。あらかじめ `MkDir` などでフォルダの存在確認・作成を行っておくのがプロの流儀です。
2. ファイルの排他制御(アクセス権・上書きエラー)
既に開いている図面や、他のプロセスが掴んでいるファイルを上書きしようとすると、VBAは無慈悲にエラーを吐いて止まります。上記のサンプルコードのように、保存前に `Dir` でファイルの有無を確認し、必要に応じて `Kill` するか、エラーハンドリング(`On Error GoTo`)を必ず仕込むようにしましょう。
—
まとめ
今回は、実行環境のAutoCADバージョンを自動判別し、最適な `SaveAsType` を動的に選択する汎用モジュールを解説しました。
「バージョン違いでマクロが止まるストレス」から解放されるだけでなく、コードの裏側にあるホストアプリケーションの仕組みまで理解できたあなたは、もう立派なAutoCAD自動化エンジニアの一歩を踏み出しています。
ぜひ、あなたの職場にある環境へこのモジュールを組み込んで、スマートで優雅な自動化ライフを満喫してくださいね。「ここをもっとこうしたい!」という疑問があれば、いつでも先輩エンジニアを頼ってください。応援しています!
