【実務・中級編】【初心者向け】SaveAsメソッドの引数徹底解説:DWGとDXFの保存形式を正しく切り替える – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する極限の知見:SaveAsメソッドの迷宮を断つ

業務自動化エンジニアの私のもとに、よくこんな相談が舞い込む。
「VBAで図面を自動保存しているんだが、取引先に送ったら『バージョンが古くて開けない』と言われた」
「DXFで保存したはずなのに、なぜかDWGになって上書きされてしまった」

笑い話のようだが、これらは実務の現場で頻発する重大なインシデントだ。原因は明確である。AutoCADの`SaveAs`メソッドの仕様、そして`AcSaveAsType`列挙型の挙動を「なんとなく」でコードに書いているからに他ならない。

今回は、DWGとDXFの保存形式を完璧に制御し、バージョン不整合による手戻りを完全にゼロにするための極限の知見を授けよう。

—

1. なぜ「なんとなくのSaveAs」はバグを生むのか

AutoCAD VBAにおける`Document.SaveAs`メソッドは、一見すると非常にシンプルな構文をしている。

AcDoc.SaveAs FileName, FileFormat

しかし、この第2引数である `FileFormat` (`AcSaveAsType` 列挙型) を軽視すると、痛い目を見る。
AutoCADはバージョンアップの歴史が長く、保存形式の互換性も複雑怪奇だ。特に、社内システムから外部の協力会社へ図面を納品する際、保存する「バージョン」と「ファイル形式(DWG/DXF)」の組み合わせを誤ると、相手の環境でパースエラーや読み込み拒否を引き起こす。

「コードが動いたからOK」ではなく、「意図した通りの正確なバイナリで保存されているか」を保証するのがプロのエンジニアの仕事である。

—

2. AcSaveAsType 列挙型の全貌とバージョンマッピング

`AcSaveAsType` には多くの定数が存在するが、実務で本当に使うべきものは限られている。まずは、主要な定数とそれが指し示す実体を正確に把握してほしい。

主なDWG保存形式(抜粋)

  • `acR12_DWG` : AutoCAD R12/LT2 DWG (注意: 非常に特殊な形式のため通常は使わない)
  • `ac2000_DWG` : AutoCAD 2000/LT2000 DWG
  • `ac2004_DWG` : AutoCAD 2004/LT2004 DWG
  • `ac2007_DWG` : AutoCAD 2007/LT2007 DWG
  • `ac2010_DWG` : AutoCAD 2010/LT2010 DWG
  • `ac2013_DWG` : AutoCAD 2013/LT2013 DWG
  • `ac2018_DWG` : AutoCAD 2018/LT2018 DWG (近年のモダンな標準形式)

主なDXF保存形式(抜粋)

  • `ac2000_DXF` : AutoCAD 2000 DXF
  • `ac2004_DXF` : AutoCAD 2004 DXF
  • `ac2018_DXF` : AutoCAD 2018 DXF

ここで重要なのは、「現在起動しているAutoCADのバージョンよりも新しい形式での保存はできないが、古い形式での保存は(基本的に)劣化を伴いながらも可能である」という点だ。しかし、古い形式で保存すると、最新のオブジェクト(カスタムオブジェクトやアソシエイティブなデータなど)が失われるリスクがあることを常に念頭に置かなければならない。

—

3. 【実践】堅牢なセーブ自動化モジュール

それでは、実務の現場でそのまま使えるプロダクションコードを提示しよう。
このコードでは、単に保存するだけでなく、以下の「守り」を実装している。

1. 保存先ディレクトリの自動存在確認・生成(I/Oエラーの防止)
2. 拡張子と `AcSaveAsType` の厳密な整合性チェック(DXFを指定したのにDWGで保存されるミスを防ぐ)
3. エラーハンドリングとオブジェクトのクリーンアップ

Option Explicit

‘ ==============================================================================
‘ 担当者名: シーフアーキテクト
‘ 概要: 指定されたバージョンとフォーマットでアクティブ図面を安全に保存する
‘ ==============================================================================
Public Sub ExecuteSafeSaveAs()
Dim targetPath As String
targetPath = “C:\AutoCAD_Output\WorkDrawings\Sample_2018.dwg”

‘ 堅牢な保存処理の呼び出し (2018形式のDWGとして保存)
Call SafeSaveDrawing(ActiveDocument, targetPath, ac2018_DWG)
End Sub

Public Sub SafeSaveDrawing(ByVal targetDoc As Document, ByVal fullPath As String, ByVal saveFormat As AcSaveAsType)
On Error GoTo ErrorHandler

‘ 1. 引数のバリデーション
If targetDoc Is Nothing Then
Err.Raise 9999, “SafeSaveDrawing”, “対象のドキュメントが無効です。”
End If

If Trim(fullPath) = “” Then
Err.Raise 9998, “SafeSaveDrawing”, “保存先のファイルパスが指定されていません。”
End If

‘ 2. 拡張子とフォーマットの論理整合性チェック
Dim fileExt As String
fileExt = LCase(Mid(fullPath, InStrRev(fullPath, “.”) + 1))

If (fileExt = “dwg” And IsDxfFormat(saveFormat)) Or _
(fileExt = “dxf” And Not IsDxfFormat(saveFormat)) Then
Err.Raise 9997, “SafeSaveDrawing”, “ファイル拡張子と指定された保存フォーマット(AcSaveAsType)が一致していません。”
End If

‘ 3. 保存先ディレクトリの存在確認・自動生成
Dim parentDir As String
parentDir = Left(fullPath, InStrRev(fullPath, “\”))
If Dir(parentDir, vbDirectory) = “” Then
MkDir parentDir
End If

‘ 4. 既存ファイルがある場合の属性クリア(読み取り専用対策)
If Dir(fullPath) <> “” Then
SetAttr fullPath, vbNormal
End If

‘ 5. 実行(SaveAs)
‘ ※注意: 既に同名ファイルが存在する場合、SaveAsは確認なしで上書きするため事前にガードする
targetDoc.SaveAs fullPath, saveFormat

MsgBox “図面の保存が正常に完了しました。” & vbCrLf & fullPath, vbInformation, “正常終了”
Exit Sub

ErrorHandler:
‘ 障害発生時のログ出力および適切なエラーハンドリング
MsgBox “【致命的なエラー】図面の保存に失敗しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “異常終了”

‘ 必要に応じてここでエラーログをテキストやDBに出力する処理を挟む
End Sub

‘ ==============================================================================
‘ プライベートヘルパー: 指定された定数がDXF形式かどうかを判定する
‘ ==============================================================================
Private Function IsDxfFormat(ByVal formatType As AcSaveAsType) As Boolean
Select Case formatType
Case ac2000_DXF, ac2004_DXF, ac2007_DXF, ac2010_DXF, ac2013_DXF, ac2018_DXF, acR12_DXF
IsDxfFormat = True
Case Else
IsDxfFormat = False
End Select
End Function

—

4. チーフアーキテクトからの実務アドバイス

上記のコードを見ればわかる通り、プロのVBAコードは「APIを呼び出すだけ」の素朴なものではない。

  • 拡張子と定数の二重チェック: `ac2018_DWG`を指定しながら、ファイル名を`sample.dxf`にしてしまうミスは、実務のバグとして非常に多い。コード側で論理矛盾を検知して弾く仕組みが、深夜のトラブルを防ぐ防波堤となる。
  • 上書きの恐怖: AutoCADの`SaveAs`は、同名ファイルが存在しても警告なしで上書きを敢行する凶暴な側面を持つ。必要であれば、保存前に `Dir` 関数等でファイルの存在チェックを行い、バックアップ(リネーム退避)を取るロジックを前段に挟むべきだ。

自動化とは、単なる「手作業の置き換え」ではない。人間のうっかりミスをシステムが完全にハイドレート(無効化)する構造を作ることこそが、真の業務効率化なのだ。

この知見をあなたの開発環境に組み込み、一歩上の堅牢性を手に入れてほしい。

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