CorelDRAW VBAを掌握する極限の知見
【実務直結】指定フォルダ内の複数CDRを一括別名保存する堅牢な自動化スクリプトの設計思想
業務自動化エンジニアの視点から言わせてもらおう。CorelDRAWにおけるバッチ処理(一括処理)は、一見すると単純なファイルの「開く・保存する」の繰り返しに思える。しかし、実務の現場で安易に組まれたマクロは、メモリリーク、ダイアログの予期せぬポップアップによるフリーズ、そしてファイル破損という致命的なエラーを引き起こす。
今回は、指定フォルダ内をFileSystemObject(FSO)で走査し、大量のCorelDRAWファイル(.cdr)を指定バージョンの形式で安全に別名保存(または別フォルダへ一括出力)するためのプロダクションコードを授ける。
初心者であっても、プロのアーキテクトが書く「落ちないコード」の構造をそのまま手に入れてほしい。
—
なぜ「単純なループ処理」では実務で破綻するのか?
多くの入門書では、`Dir`関数を使ってフォルダ内のファイルをループさせ、そのまま開いて保存するコードが紹介されている。だが、実務の現場では以下のリスクが存在する。
1. モーダルダイアログの罠
フォントの欠落やリンク切れの画像がある場合、CorelDRAWは裏で警告ダイアログを出し、処理が完全に停止する。人が画面の前で「OK」をクリックし続けなければならない自動化など、自動化の名に値しない。
2. オブジェクトの寿命とメモリ管理
大量のドキュメントを連続して開閉すると、VBAの背後にあるCOMオブジェクトの参照が解放しきれず、CorelDRAW自体がクラッシュする。
3. エラーハンドリングの欠如
1つのファイルが破損していただけで、数千個の処理が途中でストップし、どこまで終わったか分からなくなる。
これらを完全にクリアする堅牢なアーキテクトコードを以下に提示する。
—
プロダクションコード:一括別名保存マクロ
以下のコードは、エラーハンドリング、ダイアログの抑制、そして適切なオブジェクト解放を網羅した実務仕様のスクリプトだ。VBAエディタ(Alt + F11)の標準モジュールに貼り付けて実行してほしい。
Option Explicit
‘ —————————————————————–
‘ @Title: CDR一括バージョン変換・別名保存ツール
‘ @Description: 指定フォルダ内のCDRファイルを走査し、
‘ エラーを回避しながら別名(別バージョン)で一括保存する
‘ —————————————————————–
Sub BatchSaveCDRFiles()
Dim fso As Object
Dim targetFolder As Object
Dim targetFile As Object
Dim doc As Document
‘ 入力・出力フォルダのパス(環境に合わせて書き換えてください)
Const INPUT_PATH As String = “C:\Data\CDR_Input\”
Const OUTPUT_PATH As String = “C:\Data\CDR_Output\”
‘ 1. FileSystemObjectの生成(初期化)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ フォルダの存在チェック
If Not fso.FolderExists(INPUT_PATH) Then
MsgBox “入力フォルダが存在しません: ” & INPUT_PATH, vbCritical, “パスエラー”
Exit Sub
End If
If Not fso.FolderExists(OUTPUT_PATH) Then
fso.CreateFolder (OUTPUT_PATH) ‘ 出力フォルダがなければ作成
End If
Set targetFolder = fso.GetFolder(INPUT_PATH)
‘ 2. CorelDRAWの安全装置(警告や画面描画の抑制)
‘ ※処理速度の向上と、予期せぬダイアログによるフリーズを防止します
With Application
.Optimization = True
.EventsEnabled = False
.SuppressScriptErrors = True
End With
On Error GoTo ErrorHandler
‘ 3. フォルダ内のファイルを走査
Dim processedCount As Long
processedCount = 0
For Each targetFile In targetFolder.Files
‘ 拡張子が “.cdr” のファイルのみを対象とする(大文字小文字を区別しない)
If LCase(fso.GetExtensionName(targetFile.Name)) = “cdr” Then
Dim inputFilePath As String
Dim outputFilePath As String
inputFilePath = targetFile.Path
outputFilePath = OUTPUT_PATH & targetFile.Name
‘ ドキュメントを開く(非表示またはバックグラウンドに近い状態で開く)
‘ ※CorelDRAW VBAではOpenドキュメント時にモーダルを出さない配慮が必要
Set doc = Application.OpenDocument(inputFilePath)
‘ 4. 別名保存の実行
‘ 例としてCorelDRAW 2020形式(Ver.22)で保存する場合の定数指定
‘ ※バージョンに応じたcdrVerXX定数を使用してください
Dim saveOptions As StructSaveOptions
Set saveOptions = CreateStructSaveOptions
With saveOptions
.Version = cdrVer22 ‘ 例: CorelDRAW 2020フォーマット
.EmbedFonts = True
.Thumbnail = True
End With
‘ 名前を付けて保存
doc.SaveAs outputFilePath, saveOptions
‘ 5. メモリリークを防ぐため、速やかにドキュメントを閉じる
doc.Close
Set doc = Nothing
processedCount = processedCount + 1
End If
Next targetFile
‘ 終了処理
GoTo CleanUp
ErrorHandler:
‘ 予期せぬエラーが発生した場合でも、全体のバッチ処理を止めずにログを残すかスキップする
MsgBox “ファイル処理中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“説明: ” & Err.Description, vbExclamation, “例外発生”
If Not doc Is Nothing Then
doc.Close False ‘ 変更を破棄して閉じる
Set doc = Nothing
End If
Resume Next ‘ 次のファイルの処理へ強制移行
CleanUp:
‘ 6. 環境設定の復元(絶対に忘れてはならない)
With Application
.Optimization = False
.EventsEnabled = True
.SuppressScriptErrors = False
.Refresh
End With
‘ オブジェクトの解放
Set targetFolder = Nothing
Set fso = Nothing
MsgBox “処理が完了しました。” & vbCrLf & “処理ファイル数: ” & processedCount & “件”, vbInformation, “一括処理完了”
End Sub
—
コードの急所:エンジニアが解説する3つのポイント
1. `Application.Optimization = True` の魔力
大量のファイルを処理する際、CorelDRAWは画面の再描画(レンダリング)やイベント監視に膨大なリソースを割く。これを `True` にすることで、UIの描画を停止し、処理速度を劇的に向上させると同時に、バックグラウンド処理の安定性を確保できる。処理の最後で必ず `False` に戻すことを忘れてはならない。
2. `StructSaveOptions` による厳密なバージョンコントロール
単なる `doc.Save` では、現在のバージョンそのままで上書きされるか、意図しない設定で保存されてしまう。`CreateStructSaveOptions` を明示的に呼び出し、`.Version = cdrVerXX` を指定することで、クライアントや印刷所から指定された「特定の古いバージョン(例: Ver.14やVer.20など)」へ確実にダウングレード保存が可能になる。
3. エラーハンドリングと `Resume Next` の戦略
バッチ処理において「1つのファイルでマクロ全体が停止する」ことは最悪のバグである。`On Error GoTo ErrorHandler` を経由させて `Resume Next` を使うことで、壊れたファイルや読み込み権限のないファイルを華麗にスルーし、次のファイルの処理へ移行できるタフな構造を実現している。
—
まとめ:現場で即戦力となる自動化を目指して
今回紹介したコードは、単なる「動くサンプル」ではない。実務の泥臭い例外やパフォーマンスのボトルネックを計算し尽くしたプロダクションクオリティの設計だ。
フォルダのパスや保存バージョン(`cdrVerXX` の部分)は、あなたのプロジェクトの要件に合わせて書き換えてほしい。この設計思想をマスターすれば、CorelDRAWを使ったDTP・デザイン業務の自動化において、恐れるものは何もない。
圧倒的な効率化を手に入れ、クリエイティブな時間を取り戻してほしい。
