CorelDRAW VBAを掌握する極限の知見:複数フォーマット一括エクスポート・カスタムダイアログの設計
開発プロジェクトのリーダーである私から、現場のエンジニアたちへ問う。
「客先への納品のために、CDRを開き、EPS、PDF、SVG、そしてバックアップ用の旧バージョンCDRを、毎回手作業でメニューからポチポチと書き出している……」そんな非効率なルーティンワークを、まだ部下にやらせてはいないか?
CorelDRAWの標準UIは優秀だが、「同一ドキュメントから異なる規格・異なるプロファイルで同時にアセットを量産する」という現代のマルチデバイス・マルチプラットフォーム時代的要請に対しては、あまりにも無力だ。
今回は、CorelDRAW VBAのオブジェクトライフサイクル、メモリ管理、そしてUI(UserForm)のイベント駆動を完全に制御し、「1回のクリックで主要4フォーマットを完璧に多重出力するプロダクション品質のカスタムダイアログ」の全貌を伝授する。
単なるコードの寄せ集めではない。プロフェッショナルが現場で即座に採用できる、堅牢で拡張性の高い設計思想を叩き込め。
—
1. なぜ「その場しのぎのエクスポートマクロ」は現場で破綻するのか?
素人が書いたエクスポートマクロの多くは、次のような致命的な欠陥を抱えている。
1. アクティブドキュメントへの依存: `ActiveDocument` オブジェクトを無防備に信頼し、処理中にドキュメントが切り替わったり閉じられたりすると即座に `Run-time error` で落ちる。
2. エラーハンドリングの欠如: 出力先のフォルダが存在しない、ファイル名に使用できない文字(`/` や `?` など)が含まれている、同名ファイルがロックされている場合にマクロが沈黙する。
3. UIとビジネスロジックの密結合: フォームのボタンクリックイベントの中に直接エクスポート処理の生々しいコードが記述されており、保守や機能拡張が不可能になる。
我々が目指すべきは、「トランザクション的な安全性」と「疎結合なモジュール設計」を両立させた、実務に耐えうる堅牢なシステムだ。
—
2. システムアーキテクチャの全体像
今回構築するシステムは、以下の2つのコンポーネントで構成する。
- `frmExportHub` (UserForm): ユーザーからの入力を受け付け、入力値のバリデーション(検証)を行うUI層。
- `ExportEngine` (Standard Module): UIから渡されたパラメータを元に、CorelDRAWの各フィルタを安全に呼び出してファイル生成を行うビジネスロジック層。
この分離により、将来的にバッチ処理(UIなしでフォルダ内のCDRを全て一括変換する機能など)へ拡張する際も、エンジン部分をそのまま再利用できる。
—
3. プロダクションコード実装
以下のコードを、そのままあなたのCorelDRAW VBAプロジェクト(GlobalMacros または 任意のCDRファイル)に実装せよ。
ステップ 1: 標準モジュール `ExportEngine` の作成
まずは、ファイル出力の核心となるエンジン部だ。各フォーマット固有のオプション(PDFのプリセット、EPSのバージョンなど)を適切にハンドリングする。
Option Explicit
‘ ==============================================================================
‘ モジュール名: ExportEngine
‘ 概要: 各種フォーマットへのエクスポート処理をカプセル化したビジネスロジック層
‘ ==============================================================================
Public Sub ExecuteMultiExport(ByVal targetDoc As Document, _
ByVal outputFolder As String, _
ByVal baseFileName As String, _
ByVal exportCDR As Boolean, _
ByVal exportPDF As Boolean, _
ByVal exportEPS As Boolean, _
ByVal exportSVG As Boolean)
‘ エラーハンドリングの盾を構える
On Error GoTo ErrorHandler
‘ パスの末尾スラッシュの正規化
If Right$(outputFolder, 1) <> “\” Then outputFolder = outputFolder & “\”
‘ 出力先フォルダの存在確認・自動生成
If Len(Dir(outputFolder, vbDirectory)) = 0 Then
MkDir outputFolder
End If
‘ トランザクション開始:画面描画を停止してパフォーマンスを極限まで引き上げる
Application.Optimization = True
EventsEnabled = False
Dim fullPath As String
‘ 1. CDR (CorelDRAW) エクスポート
If exportCDR Then
fullPath = outputFolder & baseFileName & “.cdr”
‘ 最新バージョン、または必要に応じてバージョンを指定(例: cdrVersion15)
targetDoc.SaveAs fullPath, cdrCurrentVersion, True
End If
‘ 2. PDF エクスポート
If exportPDF Then
fullPath = outputFolder & baseFileName & “.pdf”
Dim pdfParams As StructPDFExportSettings
Set pdfParams = CreateStructPDFExportSettings
‘ プリセットや詳細設定をここで統御(例: PDF/X-1a準拠など)
‘ pdfParams.PublishPDFEx … 必要に応じたパラメータ設定
targetDoc.PublishToPDF fullPath, pdfParams
End If
‘ 3. EPS エクスポート
If exportEPS Then
fullPath = outputFolder & baseFileName & “.eps”
Dim epsParams As StructExportOptions
Set epsParams = CreateStructExportOptions
epsParams.Interactive = False
targetDoc.Export fullPath, cdrEPS, cdrSelection, epsParams
End If
‘ 4. SVG エクスポート
If exportSVG Then
fullPath = outputFolder & baseFileName & “.svg”
Dim svgParams As StructExportOptions
Set svgParams = CreateStructExportOptions
svgParams.Interactive = False
targetDoc.Export fullPath, cdrSVG, cdrSelection, svgParams
End If
CleanUp:
‘ 最適化の解除(絶対に忘れてはならない)
Application.Optimization = False
EventsEnabled = True
Application.CorelScript.RedrawScreen
Exit Sub
ErrorHandler:
‘ 異常系キャッチ
Application.Optimization = False
EventsEnabled = True
Application.CorelScript.RedrawScreen
MsgBox “エクスポート中に致命的なエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “Export Engine Error”
End Sub
ステップ 2: ユーザーフォーム `frmExportHub` の設計とコード
VBAエディタで `frmExportHub` という名前のUserFormを作成し、以下のコントロールを配置せよ。
- `txtFolderPath` (TextBox): 保存先フォルダパス
- `btnBrowse` (CommandButton): 「参照…」ボタン
- `txtFileName` (TextBox): ファイル名プレフィックス
- `chkCDR`, `chkPDF`, `chkEPS`, `chkSVG` (CheckBox): 各種フォーマット選択
- `btnExecute` (CommandButton): 「一括出力実行」ボタン
- `btnClose` (CommandButton): 「閉じる」ボタン
フォームのコードモジュールには、以下のコードをそのまま貼り付ける。
Option Explicit
‘ ==============================================================================
‘ フォーム名: frmExportHub
‘ 概要: ユーザーからのパラメータ入力を安全に受け付け、エンジンへ引き渡すUI層
‘ ==============================================================================
Private Sub UserForm_Initialize()
‘ 初期値の設定
Me.txtFileName.Text = “Design_Asset”
‘ デフォルトで全フォーマットにチェックを入れる
Me.chkCDR.Value = True
Me.chkPDF.Value = True
Me.chkEPS.Value = True
Me.chkSVG.Value = True
‘ デフォルトの保存先をアクティブドキュメントと同じ場所に設定(開いている場合)
On Error Resume Next
If Not ActiveDocument Is Nothing Then
If ActiveDocument.Saved Then
Me.txtFolderPath.Text = Left(ActiveDocument.FullFileName, InStrRev(ActiveDocument.FullFileName, “\”) – 1)
End If
End If
On Error GoTo 0
End Sub
Private Sub btnBrowse_Click()
‘ Shellオブジェクトを用いたモダンなフォルダ選択ダイアログ
Dim shellApp As Object
Set shellApp = CreateObject(“Shell.Application”)
Dim selectedFolder As Object
Set selectedFolder = shellApp.BrowseForFolder(0, “エクスポート先のフォルダを選択してください”, 0, “C:\”)
If Not selectedFolder Is Nothing Then
Me.txtFolderPath.Text = selectedFolder.Self.Path
End If
Set selectedFolder = Nothing
Set shellApp = Nothing
End Sub
Private Sub btnExecute_Click()
‘ — 1. 厳格な入力バリデーション(Validation) —
If ActiveDocument Is Nothing Then
MsgBox “処理対象となるCorelDRAWドキュメントが開かれていません。”, vbExclamation, “入力エラー”
Exit Sub
End If
If Trim(Me.txtFolderPath.Text) = “” Then
MsgBox “保存先フォルダを指定してください。”, vbExclamation, “入力エラー”
Me.txtFolderPath.SetFocus
Exit Sub
End If
If Trim(Me.txtFileName.Text) = “” Then
MsgBox “ファイル名を入力してください。”, vbExclamation, “入力エラー”
Me.txtFileName.SetFocus
Exit Sub
End If
‘ 不正文字の簡易チェック
Dim invalidChars As String
invalidChars = “\/:?<>|””‘”
Dim i As Long
For i = 1 To Len(invalidChars)
If InStr(Me.txtFileName.Text, Mid(invalidChars, i, 1)) > 0 Then
MsgBox “ファイル名に使用できない文字が含まれています: ” & Mid(invalidChars, i, 1), vbExclamation, “入力エラー”
Me.txtFileName.SetFocus
Exit Sub
End If
Next i
‘ 少なくとも1つフォーマットが選択されているか
If Not (Me.chkCDR.Value Or Me.chkPDF.Value Or Me.chkEPS.Value Or Me.chkSVG.Value) Then
MsgBox “少なくとも1つのエクスポートフォーマットを選択してください。”, vbExclamation, “入力エラー”
Exit Sub
End If
‘ — 2. ビジネスロジックの呼び出し —
Me.Hide
Call ExecuteMultiExport( _
targetDoc:=ActiveDocument, _
outputFolder:=Me.txtFolderPath.Text, _
baseFileName:=Me.txtFileName.Text, _
exportCDR:=Me.chkCDR.Value, _
exportPDF:=Me.chkPDF.Value, _
exportEPS:=Me.chkEPS.Value, _
exportSVG:=Me.chkSVG.Value _
)
MsgBox “すべてのアセットのエクスポートが正常に完了しました。”, vbInformation, “完了”
Unload Me
End Sub
Private Sub btnClose_Click()
Unload Me
End Sub
—
4. リーダーが教える「実務で絶対に外せない」極意
このコードをデプロイし、実際の現場で運用するにあたって、以下のアーキテクチャ上の知見を頭に叩き込んでおいてほしい。
1. `Application.Optimization = True` の魔力と恐怖
大量のエクスポートやオブジェクト操作を行う際、画面の再描画やイベント監視を有効にしたままだと、CorelDRAWは処理のたびにUIを更新しようとフリーズ寸前の重負荷に陥る。
`Optimization = True` を設定することで処理速度が劇的に向上するが、エラー発生時にこれを `False` に戻し忘れると、CorelDRAWの画面が一切再描画されなくなる(俗に言う「画面フリーズ状態」)という致命的なバグを誘発する。
そのため、今回のコードのように必ず `Error Handlers` 内の `CleanUp` ラベルで確実に復元する構造を徹底すること。
2. ファイルパスとデータベース連携への拡張性
今回はローカルフォルダへの出力だが、実務では社内NASや、PDM(製品データ管理)システム、さらには進捗管理DB(AccessやSQL Server)と連携し、「エクスポート完了と同時にDBのステータスを『納品待ち』に更新する」という要件が必ず降ってくる。
その際、今回分離した `ExportEngine` モジュールに対し、以下のようなコールバックやログ記録処理を1行追加するだけで対応できる。
‘ 例: エクスポート成功後にログをデータベースへ記録する処理のフックポイント
‘ Call LogExportHistory(fullPath, “SUCCESS”)
この疎結合設計こそが、プロとアマを分ける境界線である。
—
5. 結びにかえて
自動化とは、単に手作業をコードに置き換えることではない。「ヒューマンエラーが入り込む余地を完全に排除し、ビジネスの処理スループットを限界まで引き上げるエンジニアリング」だ。
今回提供したカスタムダイアログのアーキテクチャをベースに、あなたの組織のワークフローに合わせたカスタムフィルターやプリセットを組み込んでほしい。CorelDRAW VBAの限界を突破するのは、いつだって妥協を知らない君たちのコードだ。実装健闘を祈る。
