【実務・中級編】【実務中級者向け】図面を開いたまま、別名で保存:差分管理を容易にするVBA – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵:なぜ「別名保存」にすら設計思想が必要なのか

AutoCADの自動化において、「図面を別名で保存する」という処理は、初学者が最初に通る登竜門だ。しかし、多くのエンジニアはここで躓く。`ThisDrawing.SaveAs` を単純に叩くだけのコードを書いて、現場で「ファイルロックが解除されない」「バックアップが破損した」といった怪奇現象に悩まされるのだ。

いいか、AutoCADのオブジェクトモデルにおいて、ファイルI/Oは最もコストが高く、かつ不安定なプロセスだ。本稿では、実務レベルで「絶対に失敗しない」差分管理のアーキテクチャを伝授する。

—

1. 非効率なコードの何が問題なのか?

多くのコードは以下のような単純な実装に終始している。

‘ 悪い例:やってはいけない実装
ThisDrawing.SaveAs “C:\Backup\test.dwg”

これの何が悪いのか?
1. 実行環境の依存性: フルパスの指定がハードコーディングされている。
2. エラーハンドリングの欠如: 保存先フォルダが存在しない場合、あるいはファイルが読み取り専用の場合、AutoCADがフリーズ、または致命的な例外を吐く。
3. カレントファイルへの影響: `SaveAs`を実行すると、AutoCADの「現在の図面」がその別名ファイルに切り替わってしまう。連続処理を行いたい場合、致命的なタイムロスを招く。

プロのエンジニアなら、「現在の図面状態を保持したまま、安全な別領域へバックアップを吐き出す」という設計思想を持つべきだ。

—

2. 堅牢な別名保存を実装する:プロダクション・コード

現場でそのまま使える、保守性を考慮したコードがこれだ。

Option Explicit

‘ @brief 現在の図面を、日付スタンプ付きでバックアップフォルダへ別名保存する
Public Sub ExportDrawingBackup()
Dim currentDoc As AcadDocument
Dim savePath As String
Dim folderPath As String
Dim fileName As String

Set currentDoc = ThisDrawing

‘ 1. 保存先ディレクトリの定義と作成(環境依存を排除)
folderPath = “C:\Project\Backup\” & Format(Date, “yyyyMMdd”) & “\”
If Dir(folderPath, vbDirectory) = “” Then
MkDir folderPath
End If

‘ 2. ファイル名の生成
fileName = Left(currentDoc.Name, InStrRev(currentDoc.Name, “.”) – 1) & _
“_REV_” & Format(Now, “HHmm”) & “.dwg”
savePath = folderPath & fileName

‘ 3. エラーハンドリングを伴う保存処理
On Error GoTo ErrorHandler

‘ acNative = 最新形式, ac2018_DWG = 汎用性の高い形式
currentDoc.SaveAs savePath, ac2018_DWG

MsgBox “バックアップ完了: ” & vbCrLf & savePath, vbInformation
Exit Sub

ErrorHandler:
MsgBox “保存失敗: ” & Err.Description, vbCritical
End Sub

このコードの「賢さ」のポイント

  • 動的なディレクトリ生成: `MkDir`を組み込むことで、フォルダ不在によるランタイムエラーを事前に防いでいる。
  • 命名規則の自動化: 図面名に時刻を付与することで、上書きを防止し、後から差分追跡が可能な状態を保っている。
  • 列挙型の明示: `ac2018_DWG`を指定することで、取引先の環境に合わせたバージョン互換をコードレベルで制御している。

—

3. 大規模運用へのアドバイス:データベース連携と注意点

もし君が、この別名保存を「図面管理システム(PDM)の一部」として構築しようとしているなら、以下の3点に注意せよ。

1. ファイルロックの競合: ネットワークドライブ上で実行する場合、AutoCADが一時的に作成する`.ac$`, `.bak`ファイルの競合が発生しやすい。保存先のパスは可能な限りローカル、あるいは排他制御が効くサーバー領域に限定すること。
2. データベースへのインデックス登録: 別名保存した際、そのパスをSQL ServerやSQLiteに記録したいという要望が必ず出る。その際は、`SaveAs`実行後に `ThisDrawing.FullName` を取得し、それをDBへプッシュする「フック」処理を実装せよ。
3. 軽量化の検討: 大容量図面を頻繁に保存する場合、`Purge`コマンドをVBA経由で発行してから保存するルーチンを挟むと、バックアップファイルの肥大化を抑制できる。

—

結論:コードは「状態」を意識せよ

AutoCADのAPIは、単なる命令の羅列ではない。「図面オブジェクト」という巨大なメモリ空間を操作する行為だ。

今回紹介した「別名保存」の実装は、単なる保存処理ではなく、「設計履歴をロストさせないための防波堤」である。このコードをベースに、君のプロジェクトの運用ルールに合わせて拡張してほしい。

自動化とは、ただ楽をすることではない。「ミスが起きる余地をプログラムの力で消滅させること」。これこそが、真の業務自動化エンジニアの仕事だ。

何か詰まったら、またいつでも相談に来るといい。現場からは以上だ。

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