レガシー資産の呪縛を解く:CorelDRAW VBAによる「全自動・堅牢変換エンジン」の設計思想
CorelDRAWの運用現場において、最も神経をすり減らす作業の一つが「古いCDRファイルの救済」だ。バージョンが混在する数千のファイルを、一つひとつ開き、形式を確認し、上書き保存する。この単純作業にエンジニアの貴重な時間を溶かしてはならない。
しかし、単に「開いて保存する」だけのコードを書いて安心するのは素人だ。メモリリーク、バックグラウンドでのダイアログ停止、予期せぬリンク切れ……。これらを防ぎ、真に運用に耐えうる「堅牢な変換エンジン」を構築するための極意を伝授する。
—
1. 堅牢な設計のための「3つの鉄則」
現場で生き残るツールには、以下の原則が不可欠である。
1. 「非表示(Invisible)」での実行は避けろ:
`Application.Visible = False` で無理やり隠すと、エラー発生時にCorelDRAWのプロセスがゾンビ化し、タスクマネージャーでの強制終了を余儀なくされる。常にユーザーに進行状況を見せる設計こそが、最も「安全」である。
2. 例外処理の標準化:
ファイル破損や読み取り専用属性によってクラッシュするのを防ぐため、`On Error Resume Next` を乱用せず、ファイルアクセス前に属性チェックを行うこと。
3. 再帰的ファイル検索:
フォルダ階層を維持するためには、`Scripting.FileSystemObject` を使い、再帰的な探索ロジックを組むのが定石だ。
—
2. 実務プロダクションコード:CDR一括変換エンジン
以下のコードは、指定フォルダ以下の全CDRファイルを検索し、カレントバージョンで安全に再保存するプロトタイプだ。
Option Explicit
‘ 参照設定: Microsoft Scripting Runtime が必要
Sub BatchConvertCDR()
Dim fso As New FileSystemObject
Dim rootFolder As String
Dim targetExt As String
rootFolder = “C:\LegacyAssets” ‘ 変換対象のルートパス
targetExt = “cdr”
‘ 処理開始の警告(安全装置)
If MsgBox(“指定フォルダ以下のファイルを最新形式に変換します。バックアップはありますか?”, vbYesNo) = vbNo Then Exit Sub
‘ 再帰処理の開始
ProcessFolder fso.GetFolder(rootFolder), targetExt
MsgBox “全プロセスの変換が完了しました。”
End Sub
Private Sub ProcessFolder(folder As Folder, ext As String)
Dim file As file
Dim subFolder As Folder
‘ ファイルの変換実行
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = ext Then
ConvertCDRFile file.Path
End If
Next
‘ サブフォルダを再帰的に巡回
For Each subFolder In folder.SubFolders
ProcessFolder subFolder, ext
Next
End Sub
Private Sub ConvertCDRFile(filePath As String)
Dim doc As Document
‘ エラーハンドリング:ファイルが開けない場合を考慮
On Error Resume Next
Set doc = Application.OpenDocument(filePath)
If Err.Number = 0 Then
‘ 最新形式で保存(上書き)
‘ 注意: 必要に応じて別名保存(SaveAs)に切り替えること
doc.Save
doc.Close
Else
Debug.Print “変換失敗: ” & filePath
End If
On Error GoTo 0
End Sub
—
3. 開発現場で陥りやすい罠と解決策
メモリの枯渇問題
数百ファイルに及ぶループ処理を行うと、CorelDRAWの内部メモリが徐々に圧迫されることがある。これを回避するには、「一定数(例えば50ファイル)ごとにApplicationを再起動する」という荒技も一つの正解だ。COMオブジェクトの参照を完全に開放するためには、メインのループをVBAではなく、VBScriptやPowerShellからCorelDRAWを制御する構成にするのが最も安定する。
リンク切れとフォントの問題
古いファイルはフォント欠落やリンク画像のリロードでダイアログが出る。これを自動で回避するには:
- `Application.Optimization = True`: 画面描画と再計算を停止し、処理速度を劇的に向上させる。
- `Application.EventsEnabled = False`: イベントを抑制し、ダイアログのポップアップを抑止する。
これらはコードの冒頭で `True` にし、終了時(`Finally` ブロック相当)に必ず `False` に戻すことが肝要だ。
—
最後に:エンジニアとしての矜持
VBAはレガシーと言われるが、CorelDRAWの内部APIを直接叩ける唯一無二の強力な武器だ。今回紹介したスクリプトは、単なる自動化ツールではない。古い技術的負債を現代のワークフローに適合させるための「架け橋」である。
コードをコピペして動かして終わりにするな。その先の「なぜこの例外処理が必要なのか」「なぜパスの扱いにFSOを使うのか」という設計思想を読み解いてほしい。そうして初めて、君は「作業者」から「自動化アーキテクト」へと進化できる。
もし更なる最適化――例えば、変換ログをDBに記録したい、あるいは特定のバージョン以下のファイルだけを抽出したいといった要件があれば、いつでも聞いてくれ。設計の深層から最適解を提示しよう。
