DWGバージョンの罠を回避せよ:社内標準への強制統一を実現する堅牢なアーキテクチャ設計
業務自動化の現場で、中級者が陥る最も「痛い」ミスの一つがある。それは、「AutoCADのバージョン」と「DWGファイルの保存形式(バージョン)」を混同することだ。
「最新のAutoCAD 2024を使っているから、保存したファイルは最新形式だ」という思い込み。これが、協力会社や古いバージョンのAutoCADを使用する他部署との間で、ファイルが開けない、あるいはデータが欠落するといった、プロジェクトを停滞させる致命的なトラブルを引き起こす。
本記事では、単なる「SaveAs」の書き方ではない。設計思想としての「バージョン管理」と、実務で即戦力となる「強制統一マクロ」の極致を伝授する。
1. 概念の再定義:AutoCADのバージョン vs DWG形式
まず、エンジニアとしてこの違いを脳に刻んでほしい。
- AutoCAD Application Version: あなたが起動しているソフトウェアのバージョン(例: 2024)。
- DWG File Format Version: ファイル自体が保持しているデータ構造のバージョン(例: acR2018)。
AutoCAD 2024で作業していても、保存形式を `acR2013` に指定すれば、そのファイルは AutoCAD 2013 形式としてシリアライズされる。この「変換」のプロセスは、単なるファイル名の変更ではなく、データベース構造の再構築である。ここを理解していないコードは、パフォーマンスの低下や予期せぬエラーを招く。
実務で扱うべきDWG形式定数一覧
`SaveAs` メソッドで使用する `dwgformat` 引数は、以下の定数で制御される。これらを「マジックナンバー」として直接コードに書くのは素人のすることだ。必ず列挙型(Enum)や定数として定義し、可読性を確保せよ。
| 定数名 | DWG形式名 | 対応するAutoCAD世代の目安 |
|---|---|---|
| `acR2018` | AutoCAD 2018形式 | AutoCAD 2018以降(現在のデファクト) |
| `acR2013` | AutoCAD 2013形式 | AutoCAD 2013 – 2017 |
| `acR2010` | AutoCAD 2010形式 | AutoCAD 2010 – 2012 |
| `acR2007` | AutoCAD 2007形式 | AutoCAD 2007 – 2009 |
| `acR2000` | AutoCAD 2000形式 | AutoCAD 2000 – 2006 |
2. 堅牢な設計:プロフェッショナルのための3つの原則
自動化ツールを「ただ動くもの」から「プロダクション品質」へ昇華させるには、以下の設計原則が必要だ。
① 冪等性(Idempotency)の確保
「既にターゲットのバージョンで保存されている場合、何もしない」という設計にせよ。何度も `SaveAs` を実行して、無駄なファイル書き込みやファイルロックの発生を防ぐことは、システム全体の安定性に直結する。
② エラーハンドリングの階層化
ファイルが「読み取り専用」ではないか? 「他のユーザーが開いていないか?」 「保存先ディレクトリに書き込み権限はあるか?」 これらのチェックを怠るマクロは、現場で「使い物にならない」と切り捨てられる。
③ 設定の外部化(Hard-codingの排除)
「社内標準バージョン」は、数年単位で変わる。VBAのコード内に `acR2013` と直接書き込む設計は、保守性の観点から「悪」だ。将来的に、ExcelやINIファイルから設定を読み込める構造にしておくのが、チーフアーキテクトの流儀である。
3. 実装例:社内標準バージョン強制統一モジュール
以下に、実務に投入可能なレベルのVBAコードを示す。このコードは、現在のファイル形式をチェックし、必要であれば指定された形式で「別名保存」を行う。
Option Explicit
' =================================================================
' Module: StandardVersionManager
' Description: 図面を社内標準のDWG形式へ強制統一するプロフェッショナル・ツール
' Author: Lead Automation Architect
' =================================================================
' 社内標準のバージョンを定義(将来的に外部ファイルから読み込む設計を推奨)
' ここでは例として AutoCAD 2013 形式 (acR2013) を標準とする
Private Const TARGET_DWG_FORMAT As Integer = acR2013
''' <summary>
''' 現在の図面が社内標準形式であるかを確認し、異なる場合は保存を実行する
''' </summary>
Public Sub EnforceStandardVersion()
Dim doc As AcadDocument
Set doc = ThisDrawing
On Error GoTo ErrorHandler
' 1. 読み取り専用チェック
If doc.ReadOnly Then
MsgBox "エラー: ファイルが読み取り専用です。書き込み権限を確認してください。", vbCritical, "実行不能"
Exit Sub
End If
' 2. 現在のファイル形式を取得
' 注意: dwgformatプロパティは、現在のファイルの保存形式を返す
Dim currentFormat As Integer
currentFormat = doc.dwgformat
' 3. 冪等性のチェック(既に標準形式なら終了)
If currentFormat = TARGET_DWG_FORMAT Then
Debug.Print "Info: すでに社内標準形式です。処理をスキップします。"
Exit Sub
End If
' 4. 保存処理の実行
' 保存先パスの生成(ここでは元のファイル名に "_Standard" を付与する設計)
' ※実務では上書き保存するか、別名保存するかをポリシーに基づいて決定せよ
Dim newFilePath As String
newFilePath = GetStandardFilePath(doc.FullName)
Debug.Print "Info: バージョン変換を実行中... " & currentFormat & " -> " & TARGET_DWG_FORMAT
' SaveAsの実行
' 引数: (FileName, dwgformat)
doc.SaveAs newFilePath, TARGET_DWG_FORMAT
MsgBox "成功: 図面を社内標準形式で保存しました。" & vbCrLf & newFilePath, vbInformation, "完了"
Exit Sub
ErrorHandler:
Select Case Err.Number
Case -2147352567 ' 実行時エラー: ファイルアクセス拒否など
MsgBox "エラー: ファイルへのアクセスが拒否されました。他のユーザーが使用中ではないか確認してください。", vbCritical, "アクセスエラー"
Case Else
MsgBox "予期せぬエラーが発生しました: " & Err.Description, vbCritical, "システムエラー"
End Select
End Sub
''' <summary>
''' 新しい保存パスを生成する(ロジックの分離)
''' </summary>
Private Function GetStandardFilePath(ByVal originalPath As String) As String
' 実務上の設計:元のファイル名.dwg -> 元のファイル名_Standard.dwg
' 運用ルールに合わせて、上書き(originalPath)にするか検討すること
Dim pathParts() As String
Dim baseName As String
Dim extension As String
Dim dotPos As Integer
dotPos = InStrRev(originalPath, ".")
If dotPos > 0 Then
baseName = Left(originalPath, dotPos - 1)
extension = Mid(originalPath, dotPos)
GetStandardFilePath = baseName & "_Standard" & extension
Else
GetStandardFilePath = originalPath & "_Standard"
End If
End Function
4. 運用における高度な知見:データベース・連携の注意点
このマクロを大規模なプロジェクトに組み込む際、さらに一段上の設計レベルを求めるなら、以下の点に留意せよ。
ファイル管理DBとの同期
もし社内で図面管理システム(SQL ServerやAccess等)を運用している場合、`SaveAs` によってファイルパスが変わると、DB上のパス情報と不整合が起きる。
- 対策: `SaveAs` 成功後に、新しいパスをDBに書き戻す、あるいは「元のファイル名で上書き(`doc.SaveAs doc.FullName, TARGET_DWG_FORMAT`)」する設計を徹底すること。
外部参照(Xref)への影響
バージョンを下げて保存した場合、その図面が「外部参照元」となっていると、参照先のバージョンとの互換性には問題ないが、逆に「参照される側」が極端に古い形式になると、最新版のAutoCADで開いた際にアタッチ時の挙動が変わるリスクがゼロではない。常に「図面ツリー全体のバージョン整合性」を意識せよ。
結論
AutoCAD VBAによる自動化の本質は、単に「操作を代行すること」ではない。「業務ルール(標準化)を、コードという形で強制・担保すること」にある。
今回紹介した「冪等性を備えた、エラーハンドリングの徹底されたバージョン制御」を実装することで、あなたの作るツールは、単なる「便利なスクリプト」から、企業の資産を守る「信頼されるシステム」へと進化する。
設計に妥協するな。それが、エンジニアとしての誇りだ。
