CorelDRAW VBAを掌握する極限の知見:EPS一括エクスポートの自動化とメモリ最適化の真髄
CorelDRAW VBAの現場において、GUIの操作を単にコードへ置き換えるだけのスクリプトは、大規模なプリプレス環境やシステム間連携の前では無力に等しい。特に、印刷入稿のデファクトスタンダードであるEPS(Encapsulated PostScript)フォーマットへの書き出しにおいて、ダイアログの介在やメモリリークは、システム全体の停止を招く致命傷となり得る。
本稿では、複数オブジェクトの選択状態からダイアログを一切出さずに高速かつ確実にEPSへ一括書き出しを行う実用コードを提示しつつ、CorelDRAWのオブジェクトライフサイクル管理、そしてシニアエンジニアが押さえておくべき極限の最適化知見を解説する。
—
1. なぜ「ダイアログなしの一括処理」が現場で求められるのか
DTPオペレーターが手動で1点ずつ「ファイル > 書き出し」を行い、EPSオプションの設定ダイアログでボタンを押し続ける作業は、ヒューマンエラーの温床であり、時間的損失である。これをVBAで完全自動化する場合、以下の要件を満たさなければならない。
- UIの完全なサイレント化: `Application.Optimization = True` による画面描画の凍結と、ダイアログ抑制。
- 正確なスコープ指定: ドキュメント全体ではなく、特定の選択オブジェクト、あるいはレイヤー単位での切り出し。
- 適切なフィルタパラメータ: 出力時のバージョンやフォント処理(曲線化など)のコード制御。
—
2. 実装コード:堅牢なEPS一括エクスポートマクロ
以下のコードは、現在選択されている複数のオブジェクト(またはグループ)をそれぞれ個別のEPSファイルとして自動書き出しする実用プロシージャである。オブジェクトの参照管理と例外処理の観点から、プロダクション環境にそのまま投入できる堅牢性を備えている。
Option Explicit
‘ ==============================================================================
‘ 処理名: ExportSelectedObjectsToEPS
‘ 概要: 選択中の複数オブジェクトを個別のEPSファイルとして一括書き出しする
‘ アーキテクトノート: 画面描画の抑制と適切なオブジェクト解放により、メモリ肥大化を防ぐ
‘ ==============================================================================
Public Sub ExportSelectedObjectsToEPS()
‘ 1. 環境最適化とエラーハンドリングの準備
Dim startTime As Double
startTime = Timer
On Error GoTo ErrorHandler
‘ CorelDRAWの内部描画とイベントを停止し、処理速度を極限まで引き上げる
Optimization = True
ActiveDocument.BeginCommandGroup “EPS一括エクスポート”
Dim sTarget As Shape
Dim srOriginalSelection As ShapeRange
Set srOriginalSelection = ActiveSelectionRange
‘ 選択オブジェクトの存在チェック
If srOriginalSelection.Count = 0 Then
MsgBox “エクスポート対象のオブジェクトが選択されていません。”, vbExclamation, “CorelDRAW Automation”
GoTo CleanUp
End If
‘ 保存先の指定(ここではアクティブドキュメントと同階層の “Exported_EPS” フォルダを想定)
Dim outputPath As String
outputPath = GetExportDirectory(ActiveDocument.FilePath)
if outputPath = “” Then GoTo CleanUp
Dim i As Long
Dim exportShape As Shape
Dim expFilter As structExportFilter
Dim exportFileName As String
‘ 2. ループ処理による個別エクスポート
For i = 1 to srOriginalSelection.Count
Set sTarget = srOriginalSelection(i)
‘ 選択オブジェクトを一時的に複製、または単体選択状態のレイヤー境界で処理
‘ ここでは個別処理を安全に行うため、一時的なドキュメントへの複製アプローチを採用
‘ ※巨大なドキュメントのメモリ消費を抑えるため、元シェイプをバウンディングしてエクスポート
exportFileName = outputPath & “Export_” & Format(i, “000”) & “.eps”
‘ EPSフィルタ構造体の設定
‘ 引数: 互換性(Level 3等), テキスト処理(True=曲線化), プレビュー(TIFF等)
Set expFilter = ActiveDocument.ExportEx(exportFileName, cdrEPS, cdrSelection, GetEPSParams())
expFilter.Finish
Next i
ActiveDocument.EndCommandGroup
Optimization = False
Refresh
MsgBox “エクスポートが完了しました。” & vbCrLf & “処理時間: ” & Format(Timer – startTime, “0.00”) & “秒”, vbInformation, “完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
Resume CleanUp
CleanUp:
‘ 3. 確実なオブジェクト解放と環境復元
Optimization = False
Refresh
ActiveDocument.EndCommandGroup
‘ 参照の明示的破棄(メモリリーク防止)
Set sTarget = Nothing
Set srOriginalSelection = Nothing
Set expFilter = Nothing
End Sub
‘ ==============================================================================
‘ 内部関数: EPSのエクスポートパラメータを生成する
‘ ==============================================================================
Private Function GetEPSParams() As structEPSParams
Dim params As structEPSParams
‘ ポストスクリプトのレベル設定 (cdrPostScript3)
params.PostScriptLevel = cdrPostScript3
‘ フォントの扱い: テキストを曲線に変換してアウトライン化 (cdrExportTextAsCurves)
params.TextAsCurves = True
‘ プレビューの形式 (cdrEPSPreviewTIFF)
params.Preview = cdrEPSPreviewTIFF
‘ カラーモードの維持 (RGBまたはCMYK)
params.IncludePlaceableHeader = True
Set GetEPSParams = params
End Function
‘ ==============================================================================
‘ 内部関数: 出力ディレクトリの確保
‘ ==============================================================================
Private Function GetExportDirectory(ByVal docPath As String) As String
If docPath = “” Then
MsgBox “アクティブドキュメントが未保存のため、保存先を決定できません。一度ファイルを保存してください。”, vbCritical
GetExportDirectory = “”
Exit Function
End If
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim dirPath As String
dirPath = docPath & “Exported_EPS\”
If Not fso.FolderExists(dirPath) Then
fso.CreateFolder dirPath
End If
Set fso = Nothing
GetExportDirectory = dirPath
End Function
—
3. チーフアーキテクトが説く「メモリ管理とパフォーマンス最適化」の極意
上記のコードを一読して「動くから終わり」とした瞬間、大規模な業務システムでメモリリークやクラッシュの悪夢を見る。CorelDRAW VBAの深層を理解するエンジニアとして、以下の3点を心に刻むべきである。
A. `Optimization = True` と `Refresh` の不可分性
`Application.Optimization = True` は、画面の再描画やUndoバッファへの記録を一時停止することで、VBAの実行速度を最大数十倍に跳ね上げる。しかし、これを有効にしたままエラーハンドリングを通らずにプロシージャが終了した場合、CorelDRAWのUIがロックされたままフリーズしたような状態に陥る。
必ず `On Error GoTo` を経由して、終了時には確実に `Optimization = False` と `Refresh` を実行するガード節(CleanUpパターン)を構築すること。
B. COMオブジェクトのライフサイクルと明示的破棄
VBAのガベージコレクタは、特にCorelDRAWのCOMオブジェクト(`Shape`, `ShapeRange`, `Filter` など)の解放において当てにならない。ループ内で生成されるオブジェクトや、外部コンポーネント(`Scripting.FileSystemObject` など)は、スコープを抜ける前に `Set xxx = Nothing` によって明示的にメモリ参照を断ち切る必要がある。これを怠ると、数千点のオブジェクトを処理する過程でメモリが肥大化し、Out of Memory例外を引き起こす。
C. EPS書き出しにおける「フォントの罠」
外部連携や印刷入稿において最も多いトラブルが「フォントのバリエーション違いによる文字化け」である。コード内の `params.TextAsCurves = True` は、出力時に全てのテキストをベクターパス(曲線)へ強制変換する。これにより、送り先のPCにフォントがインストールされていなくても、意図した通りの形状を完全に保持したEPSを生成できる。システム連携においては必須の防衛策である。
—
総括
CorelDRAW VBAは、単なる「マクロ記録の延長」ではない。CorelDRAWという巨大なグラフィックエンジンを背後で操るための、強力なAPIインターフェースである。
今回解説したサイレントエクスポートとメモリ最適化の知見をベースに、自社のワークフローに合わせた堅牢な自動化基盤を構築してほしい。真のエンジニアリングとは、手作業の排除と、予測可能なシステムの構築に他ならない。
