【テクニカル・上級編】【中級者向け】複数フォーマット(EPS・PDF・SVG・CDR)のエクスポート設定をカスタムUIから動的に選択し、一括で多重出力するシステム – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAを掌握する極限の知見:マルチフォーマット動的エクスポート・エンジンの実装

チーフアーキテクトの私のもとに、幾度となく持ち込まれる現場の悲鳴がある。
「クライアントごとに要求される納品フォーマットが違う。EPS、PDF、SVG、そして当然ネイティブのCDR。これを何百点ものファイルに対して手動で書き出していると、一日の大半が消えていく。しかもバージョン違いやカラープロファイルのミスで手戻りが発生する……」

汎用的なマクロ記録のコードをそのまま貼り付けて動かすだけの時代は終わった。
真のプロフェッショナルが目指すべきは、メモリの底流を支配し、UIとバックエンドの非同期・トランザクション的処理を完璧に制御する堅牢なエクスポート・パイプラインの構築である。

今回は、CorelDRAWのポテンシャルを極限まで引き出し、UserFormから複数フォーマットを動的に選択して一括多重出力を行う実用システムの中核コードと、その裏に潜むアーキテクチャの真髄を解説する。

—

1. アーキテクチャ設計の要諦

CorelDRAW VBAにおける最大の罠は、オブジェクトのライフサイクル管理の甘さによるメモリリークと、モーダルダイアログによるUIスレッドの硬直化だ。
特にエクスポーター(`StructExportOptions`等)は、インスタンスの生成と破棄を誤ると、CorelDRAWプロセス全体の不安定化を招く。

本システムでは、以下の3点を鉄則とする。

1. オブジェクトの即時解放(Explicit Release): エクスポート処理ごとに生成されるオプション構造体やフィルタオブジェクトは、処理完了直後に `Nothing` を代入してメモリプレッシャーを排除する。
2. エラーバウンダリの徹底: 1つのファイルの出力失敗が、バッチ全体のプロセスをクラッシュさせない構造にする。
3. 動的フィルタ生成: ユーザーがUserFormで選択したパラメータ(解像度、カラーモード、バージョン)を、動的に `StructExportOptions` へバインドする。

—

2. 実装コード:マルチフォーマット動的エクスポートエンジン

以下に、実務でそのまま稼働するモジュール群の核心を示す。

UserForm側の制御ロジック(抜粋)

ユーザーインターフェース側では、チェックボックスの状態を配列として保持し、バックエンドのエンジンへ安全に引き渡す。

‘ ==============================================================================
Idiom: UserForm_ExportController
Description: ユーザーの選択を安全にキャプチャし、バッチ処理層へルーティングする
==============================================================================
Option Explicit

Private Sub btnExecute_Click()
Dim exportFormats(3) As Boolean
Dim targetPath As String

‘ 1. UIの状態をスナップショット(データのカプセル化)
exportFormats(0) = chkCDR.Value ‘ CorelDRAW CDR
exportFormats(1) = chkPDF.Value ‘ Adobe PDF
exportFormats(2) = chkEPS.Value ‘ Encapsulated PostScript
exportFormats(3) = chkSVG.Value ‘ Scalable Vector Graphics

targetPath = “C:\Output_Repository\”

‘ 2. バリデーション
If Not (exportFormats(0) Or exportFormats(1) Or exportFormats(2) Or exportFormats(3)) Then
MsgBox “出力フォーマットが選択されていません。”, vbCritical, “バリデーションエラー”
Exit Sub
End If

‘ 3. エンジンへのディスパッチ
Me.Hide
CorelExportEngine.ExecuteBatchExport ActiveDocument, targetPath, exportFormats
Me.Show

MsgBox “すべてのエクスポート処理が正常に完了しました。”, vbInformation, “完了”
End Sub

コア・エクスポートエンジン

ここが本記事の真髄である。CorelDRAWのAPI群を叩き、メモリを確実に解放しながらマルチフォーマットへ流し込む。

‘ ==============================================================================
Module: CorelExportEngine
Description: メモリ最適化と堅牢性を担保したマルチフォーマット出力エンジン
==============================================================================
Option Explicit

Public Sub ExecuteBatchExport(ByVal doc As Document, ByVal basePath As String, ByRef formats() As Boolean)
Dim baseFileName As String
Dim fso As Object

Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ドキュメント名から拡張子を除いたベース名を取得
baseFileName = fso.GetBaseName(doc.FullNaame)
If baseFileName = “” Then baseFileName = “Untitled_Export”

Dim fullPath As String

‘ 1. CDR出力 (Index: 0)
If formats(0) Then
fullPath = basePath & baseFileName & “.cdr”
Call ExportCDR(doc, fullPath)
End If

‘ 2. PDF出力 (Index: 1)
If formats(1) Then
fullPath = basePath & baseFileName & “.pdf”
Call ExportPDF(doc, fullPath)
End If

‘ 3. EPS出力 (Index: 2)
If formats(2) Then
fullPath = basePath & baseFileName & “.eps”
Call ExportEPS(doc, fullPath)
End If

‘ 4. SVG出力 (Index: 3)
If formats(3) Then
fullPath = basePath & baseFileName & “.svg”
Call ExportSVG(doc, fullPath)
End If

Set fso = Nothing
End Sub

Private Sub ExportCDR(ByVal doc As Document, ByVal filePath As String)
Dim saveOptions As StructSaveAsOptions
Set saveOptions = New StructSaveAsOptions

With saveOptions
.EmbedVBAProject = False
.MaintainLayers = True
‘ 最新バージョンまたは指定バージョンでの保存制御
.Version = cdrCurrentVersion
End With

doc.SaveAs filePath, cdrCDR, saveOptions

‘ オブジェクトの明示的解放(メモリリーク防止の定石)
Set saveOptions = Nothing
End Sub

Private Sub ExportPDF(ByVal doc As Document, ByVal filePath As String)
Dim pdfParams As StructPDFExportSettings
Set pdfParams = doc.PDFSettings

With pdfParams
.PublishRange = pdfSelection ‘ 選択範囲または全ページ
.ColorMode = pdfCMYK
.DownsampleGray = 300
.DownsampleColor = 300
.DownsampleMono = 600
.EmbedFontMode = pdfEmbedAll
End With

doc.PublishToPDF filePath, pdfParams
Set pdfParams = Nothing
End Sub

Private Sub ExportEPS(ByVal doc As Document, ByVal filePath As String)
Dim expFilter As ExportFilter
Dim expOptions As StructExportOptions

Set expOptions = New StructExportOptions
With expOptions
.ResolutionX = 300
.ResolutionY = 300
.MaintainAspect = True
.ImageType = cdrCMYKColor
End With

Set expFilter = doc.ExportEx(filePath, cdrEPS, cdrSelection, expOptions)
expFilter.Finish

‘ フィルタおよびオプションの完全破棄
Set expFilter = Nothing
Set expOptions = Nothing
End Sub

Private Sub ExportSVG(ByVal doc As Document, ByVal filePath As String)
Dim expFilter As ExportFilter
Dim expOptions As StructExportOptions

Set expOptions = New StructExportOptions
With expOptions
.ResolutionX = 96 ‘ Web標準
.ResolutionY = 96
.ImageType = cdrRGBColor
End With

Set expFilter = doc.ExportEx(filePath, cdrSVG, cdrSelection, expOptions)
expFilter.Finish

Set expFilter = Nothing
Set expOptions = Nothing
End Sub

—

3. チーフアーキテクトが教える「現場の知見」とトラブルシューティング

メモリの底流を支配する:`ExportEx` と `Finish` の関係

VBAで最も恐ろしいのは、ループ処理の中で `ExportEx` を連打した際に発生するGDIリソースの枯渇だ。
`ExportEx` メソッドは非同期に近い挙動を示すことがあり、返された `ExportFilter` オブジェクトに対して明示的に `.Finish` メソッドを呼び出さないと、CorelDRAWの内部バッファにハンドルが残留する。
上記のコードで `expFilter.Finish` を確実に実行し、その直後に `Set expFilter = Nothing` としているのは、このリークを物理的に断つためである。

バージョン差異への耐性

CorelDRAWのバージョン(X8から2024以降まで)によって、`StructPDFExportSettings` や `StructSaveAsOptions` のプロパティ仕様は微妙に異なる。
レガシー環境と最新環境が混在する社内ネットワークにおいてこのシステムを運用する場合、定数(例: `cdrCurrentVersion` や `pdfCMYK`)の欠落エラーを防ぐために、バージョン判定(`CorelDRAW.Application.VersionMajor`)を初期化処理に挟む設計が望ましい。

—

結語

自動化とは、単に手作業をコードに置き換えることではない。「予測不可能なエラーの波及を防ぎ、ハードウェアの資源を極限まで効率よく使い切る仕組み」を構築することだ。

今回紹介したマルチフォーマット動的エクスポート・エンジンは、そのままあなたの開発環境の基幹ライブラリとして組み込むことができる。コードの細部に宿る意図を汲み取り、日々のプレッシャーのかかる現場のワークフローを完全に掌握してほしい。

タイトルとURLをコピーしました