AutoCAD VBAを掌握する極限の知見:図面バージョンを「強制統一」する設計思想
「あ、この図面、バージョンが新しすぎて開けない……」
「社内標準は2013形式なのに、クライアントから送られてきたのは最新の2018形式だ……」
AutoCADの実務現場で、エンジニアが一度は直面するこの「バージョンの壁」。これを手作業で「名前を付けて保存」して回る時間は、エンジニアにとって最も価値のない時間の一つです。
こんにちは。今日は、マクロの記録(レコーディング)という「点」の知識から脱却し、業務プロセスを自動化する「線」の設計へとステップアップするための、非常に実践的な技術をお話ししましょう。
今回のテーマは、`SaveAs`メソッドを用いた「DWGバージョンの強制コントロール」です。
1. なぜ「マクロの記録」では足りないのか?
多くの初学者は、まず「マクロの記録」を使います。「名前を付けて保存」を選び、バージョンを選んで保存する……。記録されたコードを見ると、確かに`SaveAs`という命令が出てきます。
しかし、記録されたコードは「その時、そのファイル名」に対してしか機能しません。
「開いたファイルが何であれ、常に社内標準の2013形式で、特定のフォルダに保存する」といった動的な判断は、記録されたコードには書けないのです。
これを実現するには、AutoCADが内部で持っている「定数(Constants)」と、ファイルのプロパティを操作する「ロジック」を理解する必要があります。
2. 武器となる知識:DWGバージョン定数の一覧
AutoCAD VBAでファイルを保存する際、`SaveAs`メソッドには「どの形式で保存するか」を指定する引数が必要です。この引数に渡すのが、以下の定数です。
これを知っているだけで、あなたのコードの自由度は飛躍的に高まります。
| 定数名 | 対応するAutoCADバージョン(形式) | 実務上の位置付け |
|---|---|---|
| `acR2018` | AutoCAD 2018 形式 | 最新に近い標準。拡張性は高い。 |
| `acR2013` | AutoCAD 2013 形式 | 多くの企業で「標準」とされる安定版。 |
| `acR2010` | AutoCAD 2010 形式 | レガシー環境への互換性重視。 |
| `acR2007` | AutoCAD 2007 形式 | かなり古いシステムとの連携用。 |
| `acR2004` | AutoCAD 2004 形式 | ほぼメンテナンスモード。 |
> プロの視点:
> 実務では、あえて「新しすぎないバージョン(例:2013形式)」を標準に設定することが多いです。これは、古いバージョンのAutoCADを使用している協力会社や、古いデータ管理システムとのトラブルを未然に防ぐための、エンジニアとしての「配慮」なのです。
3. 実装:社内標準バージョンへの強制統一マクロ
では、実際に使えるコードを書いていきましょう。
単に保存するだけでなく、「元のファイルを壊さないように、新しい名前で保存する」という、実務で最も重要な安全設計を取り入れたコードです。
Option Explicit
''' <summary>
''' 現在の図面を、社内標準のAutoCAD 2013形式として別名保存するマクロ
''' </summary>
Sub ForceStandardVersionSave()
Dim doc As AcadDocument
Set doc = ThisDrawing ' 現在開いている図面オブジェクトを取得
Dim originalPath As String
Dim newPath As String
Dim fileName As String
Dim fileExt As String
Dim folderPath As String
' 1. エラーハンドリング: 図面が一度も保存されていない(パスがない)場合は終了
On Error GoTo ErrorHandler
If doc.Path = "" Then
MsgBox "この図面はまだ保存されていません。一度手動で保存してください。", vbExclamation
Exit Sub
End If
' 2. パス情報の分解
' 例: "C:\Project\Drawing1.dwg" -> folder="C:\Project\", name="Drawing1", ext=".dwg"
originalPath = doc.FullName
folderPath = doc.Path & "\"
' ファイル名と拡張子を分離(簡易的な実装)
fileName = Mid(originalPath, InStrRev(originalPath, "\") + 1)
fileExt = Mid(fileName, InStrRev(fileName, "."))
fileName = Left(fileName, InStrLen(fileName) - Len(fileExt))
' 3. 新しいファイル名の生成
' 元のファイル名に "_STD" を付与して、標準バージョンであることを明示する
newPath = folderPath & fileName & "_STD" & fileExt
' 4. 保存実行 (ここが核心部)
' FileFormat引数に acR2013 を指定することで、強制的に2013形式へ変換
Debug.Print "Saving to: " & newPath
doc.SaveAs Filename:=newPath, FileFormat:=acR2013
MsgBox "社内標準形式(2013)での保存が完了しました!" & vbCrLf & _
"保存先: " & newPath, vbInformation, "完了"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました。" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"内容: " & Err.Description, vbCritical, "実行エラー"
End Sub
コードの解説:ここが「プロ」の仕事です
1. `On Error GoTo ErrorHandler`:
実務用のツールにおいて、エラー対策をしないのは「ブレーキのない車」を運転するようなものです。ファイルが読み取り専用だった場合や、書き込み権限がない場合に、AutoCADがクラッシュするのを防ぎます。
2. `doc.Path` のチェック:
新規作成したばかりの「図面1.dwg」には保存先パスが存在しません。ここで判定を入れないと、`SaveAs`を実行した瞬間にエラーで止まってしまいます。
3. `acR2013` の指定:
ここが今回の主役です。この定数を渡すだけで、AutoCADの内部エンジンがデータの構造を古い形式へと再構築してくれます。
4. ファイル名の工夫 (`_STD`):
元のファイルを上書きしてしまうと、万が一の際に元に戻せません。`_STD`(Standardの略)などの接尾辞をつけることで、「これは標準化済みのファイルだ」と一目でわかるようにするのが、現場を混乱させないコツです。
4. 陥りやすい罠:オブジェクトのライフサイクル
ここで、一つだけ高度なアドバイスをさせてください。
`SaveAs`を実行すると、AutoCAD内での「現在の図面(`ThisDrawing`)」の状態が変わります。
もし、このマクロの後にさらに複雑な処理(例えば、大量の図面を連続して処理するループ処理)を続けたい場合、「今操作しているオブジェクトが、保存前のものか、保存後のものか」を常に意識しなければなりません。
大規模な自動化ツールを作る際は、`SaveAs`を実行した直後に、一度オブジェクト変数を再取得するか、あるいは「保存」と「編集」のフェーズを明確に分ける設計にしてください。これが、メモリリークや予期せぬ動作を防ぐ、アーキテクトの思考法です。
最後に
「マクロの記録」は、いわば「単語」を覚える段階です。
そして今回学んだ「定数」と「ロジック」の組み合わせは、「文章」を作る段階への入り口です。
単なる作業の自動化ではなく、「ミスが起きない仕組み」を作ること。それが、プロフェッショナルなエンジニアが目指すべきゴールです。
ここをクリアすれば、AutoCAD VBAの基礎はバッチリですよ。
さあ、次はもっと複雑な、図面間のデータ連携に挑戦してみましょう!
