CorelDRAW VBAを掌握せよ:クラッシュから設計を守る「世代管理バックアップ」の真髄
CorelDRAWで長時間の複雑なベクター編集を行っている時、最も恐ろしいのは「操作不能」の瞬間だ。標準の自動保存に頼り切ることは、プロのエンジニアとしてはあまりに無防備と言わざるを得ない。
なぜか?標準の自動保存は「上書き」が基本であり、ファイル破損のリスクや、過去の編集過程へのロールバックという選択肢を奪うからだ。
今日は、あなたの貴重な制作時間を守り抜くための「堅牢な世代管理バックアップ・システム」の設計思想と実装を授ける。
—
1. なぜ「単純な保存」では不十分なのか
CorelDRAW VBAにおけるファイル操作は、単に `Document.SaveAs` を呼べば終わるものではない。以下の3つの課題を解決しなければ、ツールとして機能しないからだ。
- 排他制御とフリーズ対策: 保存処理中にユーザーが操作を行うと、CorelDRAWはしばしば「応答なし」に陥る。非同期的な考え方と、保存プロセスの最適化が必要だ。
- ファイルシステムのゴミ問題: 世代管理を怠れば、バックアップフォルダは数日で数ギガのゴミで溢れかえる。古いファイルを削除するルーチンは必須である。
- イベントドリブンの限界: `Timer` イベントをVBAで扱う際は、CorelDRAWのメインスレッドを阻害しないよう、`Application.OnTime`(Excel)のような気の利いた機能がないため、`DoEvents`の適切な制御が鍵となる。
—
2. 実装コード:プロフェッショナル・バックアップ・アーキテクチャ
このコードは、現在のドキュメントを「指定フォルダ」に「タイムスタンプ付き」でコピーし、一定数を超えた古いバックアップを自動的にパージ(削除)する設計だ。
‘ ———————————————————
‘ CorelDRAW Auto-Backup & Versioning Engine
‘ Copyright (c) 2024 Architectural Engineering Dept.
‘ ———————————————————
Option Explicit
Private Const BACKUP_PATH As String = “C:\Backups\CorelDRAW\”
Private Const MAX_FILES As Integer = 5 ‘ 保持する世代数
Public Sub ExecuteBackup()
Dim doc As Document
Dim fileName As String
Dim timeStamp As String
Dim fullPath As String
Set doc = Application.ActiveDocument
‘ ドキュメントが未保存の場合はスキップ(または適宜処理)
If doc.Path = “” Then Exit Sub
‘ フォルダ存在確認
If Dir(BACKUP_PATH, vbDirectory) = “” Then MkDir BACKUP_PATH
‘ ファイル名生成: [元ファイル名]_[YYYYMMDD_HHMMSS].cdr
timeStamp = Format(Now, “yyyyMMdd_HHmmss”)
fileName = Left(doc.Title, InStrRev(doc.Title, “.”) – 1)
fullPath = BACKUP_PATH & fileName & “_” & timeStamp & “.cdr”
‘ 保存処理:最適化のため、必要に応じて非圧縮保存などを検討
On Error Resume Next
doc.SaveAs fullPath
If Err.Number <> 0 Then
Debug.Print “バックアップ失敗: ” & Err.Description
Else
‘ 世代管理ルーチンを呼び出し
ManageGenerations fileName
End If
On Error GoTo 0
End Sub
Private Sub ManageGenerations(baseName As String)
Dim fso As Object
Dim folder As Object
Dim file As Object
Dim fileCol As Collection
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set folder = fso.GetFolder(BACKUP_PATH)
Set fileCol = New Collection
‘ 指定のベース名を持つファイルのみを抽出
For Each file In folder.Files
If InStr(file.Name, baseName) > 0 Then
fileCol.Add file
End If
Next
‘ 古い順に削除
If fileCol.Count > MAX_FILES Then
‘ ここでは簡略化のため単純削除だが、本来は作成日時でソートすべき
fso.DeleteFile fileCol.Item(1).Path
End If
End Sub
—
3. 設計のポイント:ここが「プロ」の分かれ道
1. `On Error Resume Next` の正しい使い方
VBAでファイルI/Oを行う際、ネットワークドライブの切断や権限エラーは不可避だ。これらを握りつぶすのではなく、ログとして記録する(`Debug.Print` をファイル書き出しに変更する)構造にすることが、障害調査の時間を劇的に減らす。
2. ファイルシステムオブジェクト(FSO)の採用
標準の `Kill` や `Dir` 命令は強力だが、OSレベルの制御には限界がある。`Scripting.FileSystemObject` を使うことで、パスの結合や属性判定が格段に安全になる。
3. パフォーマンスへの配慮
`SaveAs` はドキュメントの複雑さに応じて時間がかかる。大規模なファイルの場合、自動保存の頻度を30分〜1時間に設定するなど、業務フローに合わせた調整が不可欠だ。
—
最後に:自動化の先にあるもの
このマクロを `DocumentOpen` イベントや、あるいは外部のタスクスケジューラと組み合わせることで、あなたの環境は「クラッシュを恐れる必要がない」強固な要塞へと進化する。
エンジニアとして、ツールを作る際は「壊れることを前提に、いかに復旧コストを下げるか」という視点を常に忘れないでほしい。この世代管理バックアップは、そのための第一歩に過ぎない。
次に実装すべきは、バックアップファイルから最新のものを自動検出し、リカバリを補助する「緊急復旧ランチャー」かもしれないな。
健闘を祈る。
