こんにちは!AutoCAD VBAの世界へようこそ。
日々、膨大な図面と格闘していると、「マクロを実行中に途中でエラーが起きて、図面が中途半端な状態で保存されてしまった……!」なんていう冷や汗をかくトラブルに遭遇したことはありませんか?
今回は、そんな現場のエンジニアなら誰もが一度は絶望する瞬間を防ぐための、「図面オープン・セーブ時のトランザクション管理とロールバック機能」について、徹底的に解説していきます。
「マクロの記録」から一歩進んで、実務で使える堅牢なプログラムを作りたいあなたへ。ここをクリアすれば、あなたのAutoCAD VBAスキルは確実にプロの領域に達します。優しく紐解いていくので、リラックスしてついてきてくださいね!
—
1. なぜAutoCAD VBAに「ロールバック」が必要なのか?
皆さんは、データベースの「トランザクション」という言葉を聞いたことがありますか?
「一連の処理をすべて成功させるか、もし失敗したらすべてを元の状態(なかったこと)に戻す」という安全装置の仕組みです。
AutoCADのVBAでよくある失敗パターンを見てみましょう。
1. 図面を開く
2. 大量のブロックを挿入したり、レイヤを書き換える(処理A)
3. 寸法線を自動生成する(処理B) ← ここで予期せぬエラー発生!
4. 慌てて `ActiveDocument.Save` を実行してしまう(またはAutoCADが勝手に上書き保存する)
結果、「半分だけ書き換わった使い物にならない破損図面」が誕生します。これが現場で最も恐れられている事態です。
これを防ぐためには、「処理が完全に成功するまでは、元の図面ファイルを絶対に汚さない(または、失敗したら安全に破棄する)」という強い意志をコードに宿す必要があります。VBAにはデータベースのような標準の `Rollback` 命令がないため、ファイルシステムのコピーとCOMオブジェクトのライフサイクル管理を組み合わせた「自前セーフティネット」を構築します。
—
2. 実装の全体像:安全な図面処理の4ステップ
今回目指す仕組みは、以下の4段構えです。
1. 退避(Backup): 操作対象の図面ファイルを、処理前に一時フォルダへ安全にコピーする。
2. 絶縁(Isolation): 読み取り専用、もしくはコピー先のファイルを安全な環境で開いて操作する。
3. 実行(Execution): 本丸の処理を行う。エラーが起きたら即座にキャッチする。
4. 決着(Commit or Rollback):
- 成功(Commit): 何もしない(または正式に保存)
- 失敗(Rollback): 開いていた図面を保存せずに閉じ、退避させておいたバックアップファイルを元の位置に復元する。
図解すると、このようなイメージです。
[ 元の図面 (DWG) ]
│ (1. 念のためバックアップを作成)
▼
[ テンポラリ領域 ] ──> [ VBAでガチャガチャ操作 (エラーの危険地帯) ]
│
┌──────────────────┴──────────────────┐
【 成功 】 【 失敗 】
│ │
▼ ▼
(そのままクローズ) (強制終了 + バックアップから復元)
—
3. 実用コード:トランザクション管理を実装する
それでは、百聞は一見にしかず。現場でそのまま使える実践的なVBAコードを公開します。
このコードは、指定した図面を開いて何らかの処理を行い、途中でエラーが発生した場合は自動的に変更前の状態に復元するプロシージャです。
Option Explicit
‘ メイン処理:安全な図面オープン・セーブ制御(トランザクション風)
Sub SafeDrawingProcessSample()
Dim targetPath As String
Dim backupPath As String
Dim fso As Object
Dim targetDoc As Document
Dim isSuccess As Boolean
‘ 対象の図面パス(環境に合わせて変更してください)
targetPath = “C:\AutoCAD_Work\SampleDrawing.dwg”
‘ FileSystemObjectの準備(ファイルのコピーや存在確認に使用)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 0. 事前チェック
If Not fso.FileExists(targetPath) Then
MsgBox “対象の図面ファイルが見つかりません。”, vbCritical, “エラー”
Exit Sub
End If
‘ 1. 退避(Backup):作業前に必ずバックアップを作成
backupPath = fso.GetParentFolderName(targetPath) & “\_backup_” & fso.GetFileName(targetPath)
On Error GoTo ErrorHandler
‘ 既存の古いバックアップがあれば削除し、現在の状態を退避
If fso.FileExists(backupPath) Then fso.DeleteFile backupPath, True
fso.CopyFile targetPath, backupPath, True
isSuccess = False
‘ 2. 絶縁・オープン:対象ファイルを開く
Set targetDoc = Documents.Open(targetPath)
‘ —————————————————-
‘ 3. 実行(Execution):ここに危険を伴う処理を書く
‘ —————————————————-
‘ (例として、レイヤを追加する処理をシミュレート)
Dim newLayer As AcadLayer
Set newLayer = targetDoc.Layers.Add(“MY_AUTOMATION_LAYER”)
‘ わざとエラーを起こすテストをしたい場合は、次の行のコメントアウトを外してください
‘ Err.Raise 9999, “TestError”, “意図的なテストエラー発生!”
‘ 処理が正常に完了した場合のみ、明示的に保存する
targetDoc.Save
isSuccess = True
‘ —————————————————-
‘ 4. 正常終了処理 (Commit)
targetDoc.Close False ‘ 変更を保持したまま閉じる(すでにSave済み)
‘ 不要になったバックアップを削除(お掃除)
If fso.FileExists(backupPath) Then fso.DeleteFile backupPath, True
MsgBox “すべての処理が安全に完了し、コミットされました。”, vbInformation, “成功”
GoTo CleanUp
ErrorHandler:
‘ 5. 異常終了処理 (Rollback)
MsgBox “エラーが発生しました。変更をロールバックします。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “ロールバック実行”
‘ 開いているドキュメントを保存せずに強制クローズ
If Not targetDoc Is Nothing Then
On Error Resume Next
targetDoc.Close False ‘ 保存せずに閉じる!
On Error GoTo 0
End If
‘ 【重要】バックアップファイルから元の状態を復元!
If fso.FileExists(backupPath) Then
‘ 現在壊れている可能性のあるファイルを上書きして元に戻す
fso.CopyFile backupPath, targetPath, True
fso.DeleteFile backupPath, True ‘ バックアップも削除
End If
CleanUp:
Set fso = Nothing
Set targetDoc = Nothing
End Sub
—
4. コードの深掘りと、エンジニアとしての知見
上記のコードには、AutoCAD VBAを極めるための重要なエッセンスが詰まっています。いくつかポイントを解説しましょう。
① `targetDoc.Close False` の意味
VBAで図面を閉じる際、引数に `False` を渡すことで、「変更を破棄して閉じる」という挙動になります。エラーが発生した際、メモリ上にあるドキュメントが勝手に自動保存されないよう、この `False` が命綱になります。
② ファイルシステム(FSO)による物理的なロールバック
AutoCADのCOM API自体には「開いた後のUndoをまとめてファイル単位で戻す」ような高レベルなトランザクション機能はありません。だからこそ、OSのファイルシステムレベルで事前にコピーを作っておき、失敗したら丸ごと上書きし直すというアナログかつ最強の物理的ロールバックが実務ではモノを言います。
③ エラーハンドリングの罠に注意
VBAで `On Error GoTo ErrorHandler` を使うときは、エラー処理の最中(`ErrorHandler` 内)でさらなるエラーが起きないよう細心の注意を払う必要があります。上記のコードでは、閉じる処理の前に `On Error Resume Next` を挟むことで、「すでにドキュメントが閉じられていてオブジェクトがない」といった二次エラーを防ぐ防護壁を作っています。
—
まとめ:ここをクリアすれば、基本はバッチリ!
いかがでしたでしょうか?
今回は、少し背伸びをした「図面オープン・セーブ時のトランザクション管理とロールバック」について解説しました。
- 単にコードを実行するだけでなく、「失敗したときにどうやって元の世界線に戻すか(保全)」をデザインすること。
- これこそが、マクロの記録から脱却し、現場で信頼されるプログラミングの第一歩です。
ここをしっかりと理解し、自分のコードに組み込めるようになれば、あなたの書くAutoCAD VBAマクロは、同僚や上司から「おっ、こいつのツールは安心して任せられるな」と一目置かれるものになるはずです。
ぜひご自身の開発環境でも試してみてくださいね。それでは、次回の極限の知見でお会いしましょう!
