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

スポンサーリンク

【CorelDRAW VBA極限の知見】複数フォーマット一括マルチエクスポート・システムの設計と実装

CorelDRAW VBAの自動化において、最も頻繁に遭遇し、かつエンジニアの技量が露呈するのが「マルチフォーマットのエクスポート処理」である。

印刷用のEPS、デジタル入稿やプレビュー用のPDF、Webベクター用のSVG、そしてマスターデータとしてのCDR。これらをデザイナーが手動で1つずつ「名前を付けて保存」あるいは「エクスポート」しているようでは、システム化の恩恵の半分も得られていない。それどころか、レイヤーの非表示し忘れや、プロファイルの設定ミスによる人為的災害(ヒューマンエラー)の温床となる。

今回は、UserFormによる洗練されたGUIを介し、単一のアクティブドキュメントからEPS・PDF・SVG・CDRを無駄なく、かつメモリリークを完全に排除した状態で一括マルチ出力する「プロダクション品質のカスタムダイアログシステム」の全貌を解説する。

—

1. アーキテクチャ設計思想:なぜ「一括出力」でクラッシュするのか

CorelDRAWのVBA環境(VBA7 / 64bit対応を含む)で大量のエクスポート処理を行う際、シニアエンジニアが真っ直ぐに対峙しなければならないのは「COMオブジェクトのライフサイクルとメモリ管理」である。

特にPDFやEPSのエクスポートフィルタは内部で重厚長大なC++ライブラリを呼び出しており、不適切なオブジェクトの参照保持や、イベントハンドリングの未解放は、決まって「メモリリーク」や「突然のCorelDRAW強制終了(Fatal Error)」を引き起こす。

本アーキテクチャでは以下の原則を鉄則とする。

1. オブジェクトの明示的解放(`Set obj = Nothing`)の徹底
2. エクスポート中の画面描画(ScreenUpdating)とイベントの完全抑制
3. 例外処理(`On Error GoTo`)による安全なリソース回収機構
4. Windows APIを活用した高速なディレクトリ存在確認と生成

—

2. GUI設計:UserForm(`ExportDialog`)の構築

まずは、ユーザーが直感的にフォーマットを選択し、出力先を指定できるUserFormを想像してほしい。
VBE(Visual Basic Editor)上で以下のコントロールを配置したUserForm名 `ExportDialog` を作成する。

  • CheckBox 1〜4: `chkCDR`, `chkPDF`, `chkEPS`, `chkSVG`
  • TextBox: `txtOutputDir`(出力先パス)
  • CommandButton: `btnBrowse`(フォルダ参照), `btnExecute`(実行), `btnCancel`(キャンセル)

フォームモジュールコード

Option Explicit

‘ フォルダ選択ダイアログ用API(シェルオブジェクトを使用するためAPI宣言は最小限に)
Private Sub btnBrowse_Click()
Dim shellApp As Object
Dim selectedFolder As Object

Set shellApp = CreateObject(“Shell.Application”)
Set selectedFolder = shellApp.BrowseForFolder(0, “保存先のフォルダを選択してください”, 0, “C:\”)

If Not selectedFolder Is Nothing Then
txtOutputDir.Text = selectedFolder.Self.Path
End If

Set selectedFolder = Nothing
Set shellApp = Nothing
End Sub

Private Sub btnCancel_Click()
Unload Me
End Sub

Private Sub btnExecute_Click()
‘ 入力検証
If Trim$(txtOutputDir.Text) = “” Then
MsgBox “出力先フォルダを指定してください。”, vbCritical, “エラー”
Exit Sub
End If

If Not chkCDR.Value And Not chkPDF.Value And Not chkEPS.Value And Not chkSVG.Value Then
MsgBox “少なくとも1つのフォーマットを選択してください。”, vbCritical, “エラー”
Exit Sub
End If

‘ メイン処理へ引き渡し
Me.Hide
Call CorelExportEngine.ExecuteBatchExport( _
txtOutputDir.Text, _
chkCDR.Value, _
chkPDF.Value, _
chkEPS.Value, _
chkSVG.Value _
)
Unload Me
End Sub

—

3. コアエンジン実装:極限まで最適化されたエクスポートロジック

ここからが本記事の核心である標準モジュール `CorelExportEngine` の実装コードだ。
各フォーマット特有のフィルタ設定(Filter Options)をコードベースで完全に制御し、ダイアログを出さずにバックグラウンドでサイレントエクスポートを完遂する。

Option Explicit

‘ Windows API: フォルダの存在確認・自動生成用
Private Declare PtrSafe Function MakeSureDirectoryPathExists Lib “imagehlp.dll” (ByVal DirPath As String) As Long

Public Sub ExecuteBatchExport(ByVal outputDir As String, ByVal doCDR As Boolean, ByVal doPDF As Boolean, ByVal doEPS As Boolean, ByVal doSVG As Boolean)
Dim doc As Document
Dim docPath As String, docName As String, baseName As String
Dim dotPos As Long

‘ 1. アクティブドキュメントの検証
If ActiveDocument Is Nothing Then
MsgBox “処理対象となるドキュメントが開かれていません。”, vbCritical, “CorelDRAW Automation”
Exit Sub
End If

Set doc = ActiveDocument

‘ 未保存ドキュメントの場合は一時パスかエラーとする
If doc.Saved = False Then
If MsgBox(“ドキュメントが未保存です。現在の状態のままエクスポートを続行しますか?”, vbYesNo + vbQuestion, “確認”) = vbNo Then
Exit Sub
End If
End If

‘ ファイル名(拡張子抜き)の抽出
docPath = doc.FullFileName
If docPath = “” Then
baseName = “Untitled_Export”
Else
dotPos = InStrRev(docPath, “.”)
If dotPos > 0 Then
baseName = Mid$(docPath, InStrRev(docPath, “\”) + 1, dotPos – InStrRev(docPath, “\”) – 1)
Else
baseName = doc.Name
End If
End If

‘ 出力ディレクトリの正規化と作成
If Right$(outputDir, 1) <> “\” Then outputDir = outputDir & “\”
MakeSureDirectoryPathExists outputDir

‘ 2. パフォーマンス最適化の牙城:描画とイベントの完全停止
With Application
.Optimization = True
.EventsEnabled = False
.ScreenRefresh
End With

On Error GoTo ErrorHandler

‘ — CDR Export —
If doCDR Then
Dim cdrOpt As StructSaveAsOptions
Set cdrOpt = CreateStructSaveAsOptions
With cdrOpt
.EmbedVBAProject = False
.Version = cdrCurrentVersion
.Range = cdrAllPages
End With
doc.SaveAs outputDir & baseName & “.cdr”, cdrOpt
Set cdrOpt = Nothing
End If

‘ — PDF Export —
If doPDF Then
Dim pdfParams As StructPDFExportSettings
Set pdfParams = CreateStructPDFExportSettings
‘ プリセットや詳細設定をここで極限チューニング
With pdfParams
.PublishRange = pdfAllPages
.ColorMode = pdfColorCMYK ‘ 印刷前提のCMYK強制
.DownsampleColorImages = True
.ColorImageResolution = 300
End With
doc.PublishToPDF outputDir & baseName & “.pdf”, pdfParams
Set pdfParams = Nothing
End If

‘ — EPS Export —
If doEPS Then
Dim epsFilter As ExportFilter
Dim epsParams As StructExportOptions
Set epsParams = CreateStructExportOptions
With epsParams
.LockAspectRatio = True
‘ 必要に応じたサイズ調整パラメータ
End With

Set epsFilter = doc.ExportEx(outputDir & baseName & “.eps”, cdrEPS, cdrAllPages, epsParams)
epsFilter.Finish
Set epsFilter = Nothing
Set epsParams = Nothing
End If

‘ — SVG Export —
If doSVG Then
Dim svgFilter As ExportFilter
Dim svgParams As StructExportOptions
Set svgParams = CreateStructExportOptions

Set svgFilter = doc.ExportEx(outputDir & baseName & “.svg”, cdrSVG, cdrAllPages, svgParams)
svgFilter.Finish
Set svgFilter = Nothing
Set svgParams = Nothing
End If

‘ 完了通知
Application.Optimization = False
Application.EventsEnabled = True
Application.Refresh

MsgBox “すべてのマルチフォーマットエクスポートが正常に完了しました。”, vbInformation, “完了”
Exit Sub

ErrorHandler:
‘ 異常系:確実に環境を復旧させてからエラーをスロー
Application.Optimization = False
Application.EventsEnabled = True
Application.Refresh

MsgBox “エクスポート中に致命的なエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “致命的エラー”

‘ オブジェクトの強制解放(多重保険)
Set cdrOpt = Nothing
Set pdfParams = Nothing
Set epsFilter = Nothing
Set epsParams = Nothing
Set svgFilter = Nothing
Set svgParams = Nothing
Set doc = Nothing
End Sub

—

4. チーフアーキテクトが解説するコードの急所

このコードが「単なるマクロ」を超えた「エンタープライズ・システム」たる所以を、プロフェッショナルの視点から解説する。

① `Application.Optimization = True` の強烈な効果

CorelDRAW VBAにおいて、大量のオブジェクト処理やファイルI/Oを行う際に画面描画が有効なままだと、OSのウィンドウメッセージループとCorelDRAWの内部再描画処理がコンフリクトを起こし、パフォーマンスが数十分の一に低下するだけでなく、メモリリークの温床となる。
`Optimization = True` により、CorelDRAWの画面更新エンジンを完全にサイレント化し、CPUリソースを純粋なエクスポート処理に集中させている。

② `ExportFilter.Finish` の絶対性

CorelDRAW VBAで `Document.ExportEx` メソッドを使用すると、非同期に近い形で `ExportFilter` オブジェクトが返される。
このフィルターオブジェクトは、ファイルへの書き出しストリームが完全にクローズされるまでメモリ上に残り続ける。コード内で `.Finish` を明示的にコールし、直後に `Set … = Nothing` で参照を断ち切っているのは、数百ファイル連続処理時のファイルハンドル枯渇を防ぐための必須の防衛策である。

③ `MakeSureDirectoryPathExists` による強靭なパス解決

VBA標準の `MkDir` 関数は、多階層のディレクトリ(例: `C:\Output\2023\11\Draft\`)を一度に作成することができず、親ディレクトリの存在有無をループで判定して順次作成していく必要がある。
ここではWindowsシステムDLL(`imagehlp.dll`)のAPIをDeclareし、1行で深層ディレクトリ構造を安全かつ高速に自動生成している。これにより、ユーザーが事前にフォルダを手動作成する手間を完全に排除している。

—

5. 運用と今後の拡張:システム間連携へのステップ

このUserFormベースのモジュールが完成すれば、これを起点としてさらなる高みへシステムを拡張することが可能だ。

  • 完全無人化(Headless)バッチへの転換:

UIフォームを廃し、WatchFolder(監視フォルダ)にCDRがドロップされた瞬間に本エンジンをバックグラウンドでサイレント実行するWindowsサービスやコンソールアプリ(C# / .NET Interop経由)へと容易にロジックを移植できる。

  • ログ監査証跡の付与:

エクスポート成功・失敗のタイムスタンプ、出力ファイルサイズ、所要時間をCSVやRDB(SQLite等)に非同期記録させることで、大規模印刷工場やECサイトの自動画像生成パイプラインの心臓部として完全に機能する。

妥協のない設計とリソース管理を施したCorelDRAW VBAコードは、レガシーな枠組みを超えて、現代の高度な自動化要件を完璧に満たすことができる。この知見をあなたの開発環境に導入し、真の自動化の果実を味わってほしい。

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