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

スポンサーリンク

AutoCAD VBAを掌握する:別名保存による「不可逆な履歴管理」の極意

設計現場の最前線で「SaveAs」を単なるファイル操作だと捉えているうちは、真の自動化エンジニアとは呼べない。

図面データのライフサイクルを制御するとは、メモリ上のオブジェクト状態とディスク上のバイナリ整合性を、OSの制約を超えて完全に統御することだ。今回は、ただ別名で保存するだけのルーチンではなく、「レガシー環境での安定稼働」と「後続プロセスへのフック」を意識した、プロダクション品質のSaveAsロジックを伝授する。

—

1. 破壊的変更を許さない:オブジェクト・ライフサイクルの防衛

AutoCAD VBAにおいて、`ThisDrawing.SaveAs`を不用意に叩くことは、ドキュメントのポインタを不安定にするリスクを孕む。特に複雑な外部参照(XRef)や、ObjectARXで拡張されたカスタムオブジェクトが絡む図面では、内部メモリの整合性を維持しながら「別名保存」を行う必要がある。

実務的な実装コード

以下のコードは、エラーハンドリングを最小限に抑え、確実に別名保存を完了させるための「プロ仕様のテンプレート」だ。

Public Sub ArchiveDrawingWithTimestamp()
‘ 極限までメモリを節約するため、オブジェクト参照は最小限にする
Dim doc As AcadDocument
Dim baseName As String
Dim savePath As String
Dim timeStamp As String

Set doc = ThisDrawing

‘ タイムスタンプ生成:ファイル名衝突をシステムレベルで回避
timeStamp = Format(Now, “yyyyMMdd_HHmmss”)

‘ フルパスからファイル名のみを抽出(FSOを使わずに処理しオーバーヘッドを低減)
baseName = Left(doc.Name, InStrRev(doc.Name, “.”) – 1)
savePath = doc.Path & “\” & baseName & “_BAK_” & timeStamp & “.dwg”

On Error GoTo ErrorHandler

‘ 保存処理:第2引数(acNative)でバージョンを固定する設計思想が重要
‘ 互換性を考慮し、常に特定のバージョンを指定することを推奨する
doc.SaveAs savePath, ac2018_dwg

MsgBox “アーカイブ完了: ” & vbCrLf & savePath, vbInformation

ExitRoutine:
‘ オブジェクトの明示的解放:VBAはガベージコレクションが脆弱なため必須
Set doc = Nothing
Exit Sub

ErrorHandler:
MsgBox “システムエラー: ” & Err.Description, vbCritical
Resume ExitRoutine
End Sub

—

2. なぜ「バージョン制御」が重要なのか

多くのエンジニアが陥る罠が「デフォルト保存」だ。AutoCADのバージョンが混在する環境で、最新形式で保存されたファイルを旧バージョン側で開こうとすれば、データ構造の再構築(プロキシ図形化)が発生し、図面精度が損なわれる。

アーキテクトの知見:

  • `ac2018_dwg` 等の定数を明示的に指定せよ。これにより、設計プロセスにおける「データ互換性の揺らぎ」を物理的に排除できる。
  • 大規模なバッチ処理を行う場合、`SaveAs`の前に `doc.PurgeAll` を挟むことを検討すべきだ。不要な名前付きオブジェクトが蓄積されたままのバックアップは、単なるゴミの山に過ぎない。

—

3. Windows APIによる「強制的なファイルロック確認」

システム管理者の視点から言えば、別名保存の最大の敵は「共有アクセス違反」である。ネットワークドライブ上で他者が図面を参照している際、`SaveAs`は非情にもエラーを返す。

ここで、Windows APIの `CreateFile` を活用し、保存前に当該パスが「排他ロック可能か」をプレチェックする手法が有効だ。

‘ API宣言(宣言部へ記述)
Private Declare PtrSafe Function CreateFile Lib “kernel32” Alias “CreateFileA” ( _
ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, _
ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As Long) As Long

‘ ファイルがロック可能かを確認する簡易関数
Public Function IsFileAvailable(filePath As String) As Boolean
Dim hFile As Long
hFile = CreateFile(filePath, &H80000000, 0, 0, 3, 128, 0)
If hFile <> -1 Then
‘ CloseHandleでハンドルを解放(実装省略)
IsFileAvailable = True
Else
IsFileAvailable = False
End If
End Function

—

結びに:エンジニアとしての矜持

VBAは古い言語かもしれないが、それは「枯れた技術」の証でもある。AutoCADのAPI層は、何十年もの歴史を背負いながら、依然として強力なパワーを秘めている。

今回提示した「別名保存」のロジックは、単なるファイル操作を超え、君たちの設計ワークフローを「盤石なもの」へと昇華させるための第一歩だ。メモリ管理を怠らず、エラーの予兆をAPIで検知する。その徹底した泥臭いまでのこだわりこそが、伝説と呼ばれる自動化エンジニアの背中を形作る。

次は、この別名保存を起点とした「図面DB自動同期」のアーキテクチャについて語ろうか。準備ができたら、また戻ってきなさい。

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