こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して出てきたコードをそのまま貼り付けるだけの自動化は、もう卒業しませんか?
実務の現場では、「クライアントから『EPS、PDF、SVG、そして当然CDR形式も、全部まとめてくれ』と言われた……」なんてシーンが毎日のように発生します。これを一つひとつ手作業で「ファイル > 書き出し」とやっていたら、指が何本あっても足りませんし、何よりミスが起きます。
今回は、UserForm(専用の操作画面)を使ってチェックボックスでフォーマットを選び、一撃でマルチフォーマットへと多重出力する「プロ仕様のバッチ書き出しシステム」の作り方を、基礎から徹底的に解説していきます。
ここをクリアすれば、あなたのCorelDRAW VBAスキルは一気に中級者の領域に到達します。さあ、一緒にスマートな自動化の世界へ踏み出しましょう!
—
なぜ「専用UI(UserForm)」と「一括処理」が必要なのか?
実務でVBAを使うとき、プロンプト(`MsgBox`や`InputBox`)だけで処理しようとすると、ユーザーが途中で混乱したり、入力ミスをしたりします。
直感的なチェックボックスを持つUIフォームを一枚挟むだけで、ツールとしての「信頼性」と「使いやすさ」は劇的に跳ね上がります。
さらに、CorelDRAWのエクスポート処理(`ActiveDocument.Export`など)は、適切な引数やフィルター設定を与えないと、予期せぬエラー(「ファイルが使用中です」「不正な引数です」など)を引き起こしやすいデリケートな一面を持っています。
今回は、オブジェクトのライフサイクルとエラーハンドリングを意識した、実務でそのまま使える堅牢なコードを組み立てていきます。
—
全体像:システム構築のステップ
今回の自動化システムは、以下の2つのパーツで構成します。
1. UserForm(GUIの作成): ユーザーが保存先フォルダを指定し、書き出したいフォーマット(CDR, EPS, PDF, SVG)をチェックボックスで選ぶ画面。
2. 標準モジュール(コアロジック): フォームからの指示を受け取り、現在のドキュメントを指定されたフォーマット群へ順次レンダリング・保存していくエンジン。
まずは、VBAのVBE(Visual Basic Editor)を開き、準備を始めましょう。
—
ステップ1:UserForm(操作画面)の設計
VBEを開き、[挿入] > [ユーザーフォーム] を選択してください(`UserForm1`が生成されます)。
プロパティウィンドウで、このフォームの名前を `frmExportManager` に変更し、キャプション(Caption)を「マルチフォーマット・エクスポート・マネージャー」に変更します。
フォーム上には、以下のコントロールを配置してください。
- フレーム (`Frame`): 「出力フォーマット選択」
- チェックボックス (`CheckBox`) x 4
- `chkCDR` (Caption: CDR形式)
- `chkEPS` (Caption: EPS形式)
- `chkPDF` (Caption: PDF形式)
- `chkSVG` (Caption: SVG形式)
- テキストボックス (`TextBox`): `txtFolderPath` (保存先フォルダパスを表示・入力)
- コマンドボタン (`CommandButton`): `btnBrowse` (Caption: 「参照…」)
- コマンドボタン (`CommandButton`): `btnExecute` (Caption: 「一括書き出し実行」)
—
ステップ2:フォームのコードを実装する
`frmExportManager` のコードウインドウを開き、以下のコードを記述します。
ここでは、フォルダ選択の簡易的な処理と、ボタンが押されたときのイベントを制御します。
‘ ==========================================
‘ UserForm: frmExportManager
‘ ==========================================
Option Explicit
‘ 実行ボタンが押されたかどうかを判定するフラグ
Public IsExecuted As Boolean
‘ 「参照」ボタン:フォルダパスを手動入力する代わりにダイアログを出したいところですが、
‘ 今回はシンプルにアクティブドキュメントと同じ階層をデフォルト設定します。
Private Sub UserForm_Initialize()
IsExecuted = False
‘ アクティブドキュメントが保存されている場合、その親フォルダをデフォルトパスにする
On Error Resume Next
If ActiveDocument.FullFileName <> “” Then
txtFolderPath.Text = GetParentFolder(ActiveDocument.FullFileName)
Else
txtFolderPath.Text = “C:\” ‘ 未保存の場合はCドライブを仮置き
End If
On Error GoTo 0
‘ 初期状態で全チェックを入れる親切設計
chkCDR.Value = True
chkEPS.Value = True
chkPDF.Value = True
chkSVG.Value = True
End Sub
‘ 「一括書き出し実行」ボタン
Private Sub btnExecute_Click()
‘ バリデーション:保存先が空でないか
If Trim(txtFolderPath.Text) = “” Then
MsgBox “保存先フォルダを指定してください。”, vbExclamation, “入力エラー”
Exit Sub
End If
‘ 最低1つはチェックが入っているか
If Not chkCDR.Value And Not chkEPS.Value And Not chkPDF.Value And Not chkSVG.Value Then
MsgBox “少なくとも1つのフォーマットを選択してください。”, vbExclamation, “選択エラー”
Exit Sub
End If
IsExecuted = True
Me.Hide
End Sub
‘ 簡易的なパス抽出関数
Private Function GetParentFolder(ByVal fullPath As String) As String
Dim pos As Long
pos = InStrRev(fullPath, “\”)
If pos > 0 Then
GetParentFolder = Left(fullPath, pos – 1)
Else
GetParentFolder = “C:\”
End If
End Function
—
ステップ3:コアエンジン(標準モジュール)の実装
次に、[挿入] > [標準モジュール] を選択し、`modExportEngine` という名前でモジュールを追加します。
ここが今回の処理の心臓部です。CorelDRAWの強力なエクスポーターを呼び出します。
‘ ==========================================
‘ 標準モジュール: modExportEngine
‘ ==========================================
Option Explicit
Sub RunMultiExporter()
‘ 1. アクティブドキュメントの存在チェック(大前提!)
If Documents.Count = 0 Then
MsgBox “処理対象となるドキュメントが開かれていません。”, vbCritical, “致命的エラー”
Exit Sub
End If
Dim doc As Document
Set doc = ActiveDocument
‘ ドキュメントが一度も保存されておらず、ファイル名がない場合のガード
If doc.FullFileName = “” Then
MsgBox “一度ドキュメントを名前を付けて保存してから実行してください。”, vbExclamation, “未保存のドキュメント”
Exit Sub
End If
‘ 2. ユーザーフォームのインスタンス化と表示
Dim frm As frmExportManager
Set frm = New frmExportManager
frm.Show vbModal
‘ ユーザーがキャンセル、または×ボタンで閉じた場合は処理を中断
If Not frm.IsExecuted Then
Unload frm
Exit Sub
End If
‘ 3. フォームから設定値を取得
Dim savePath As String
savePath = frm.txtFolderPath.Text
‘ パス末尾のバックスラッシュ(\)の有無を正規化
If Right(savePath, 1) <> “\” Then savePath = savePath & “\”
Dim doCDR As Boolean, doEPS As Boolean, doPDF As Boolean, doSVG As Boolean
doCDR = frm.chkCDR.Value
doEPS = frm.chkEPS.Value
doPDF = frm.chkPDF.Value
doSVG = frm.chkSVG.Value
‘ フォームのメモリ解放
Unload frm
‘ 4. ファイル名のベース(拡張子を除いた部分)を取得
Dim baseName As String
baseName = GetBaseFileName(doc.Name)
‘ 5. エラーハンドリングを有効にして一括書き出しループへ
On Error GoTo ErrorHandler
Dim successCount As Long
successCount = 0
‘ 処理中の画面描画をフリーズさせてパフォーマンスを極限まで引き上げる(超重要テクニック)
EventsEnabled = False
CorelDRAW.Optimization = True
‘ — 【CDR形式での保存】 —
If doCDR Then
Dim cdrPath As String
cdrPath = savePath & baseName & “.cdr”
‘ CDR形式は SaveAs または CopyEx / Save で別名保存するのが確実
doc.SaveAs cdrPath
successCount = successCount + 1
End If
‘ — 【EPS形式でのエクスポート】 —
If doEPS Then
Dim epsPath As String
epsPath = savePath & baseName & “.eps”
Dim expFilterEPS As ExportFilter
Set expFilterEPS = doc.Export(epsPath, cdrEPS, cdrSelection, Nothing)
‘ EPS特有のオプション設定が必要な場合はここでFilterオブジェクトを操作可能
expFilterEPS.Finish
successCount = successCount + 1
End If
‘ — 【PDF形式でのエクスポート】 —
If doPDF Then
Dim pdfPath As String
pdfPath = savePath & baseName & “.pdf”
‘ PDFはプリセットを指定してパブリッシュするのがモダン
Dim pubParams As StructPublishToPDFParams
Set pubParams = New StructPublishToPDFParams
‘ 必要に応じてPDF設定を調整可能(デフォルト設定を使用)
doc.PublishToPDF pdfPath, , pubParams
successCount = successCount + 1
End If
‘ — 【SVG形式でのエクスポート】 —
If doSVG Then
Dim svgPath As String
svgPath = savePath & baseName & “.svg”
Dim expFilterSVG As ExportFilter
Set expFilterSVG = doc.Export(svgPath, cdrSVG, cdrSelection, Nothing)
expFilterSVG.Finish
successCount = successCount + 1
End If
‘ 描画・最適化の復元
CorelDRAW.Optimization = False
EventsEnabled = True
‘ 完了通知
MsgBox “一括エクスポートが完了しました!” & vbCrLf & _
“出力先: ” & savePath & vbCrLf & _
“成功フォーマット数: ” & successCount & “件”, vbInformation, “処理成功”
Exit Sub
ErrorHandler:
‘ エラー発生時でも必ず描画ロックとイベント無効化を解除すること(これがないとCorelDRAWがフリーズします)
CorelDRAW.Optimization = False
EventsEnabled = True
MsgBox “エラーが発生しました。” & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “実行時エラー”
End Sub
‘ 拡張子を除いたファイル名を取得するヘルパー関数
Private Function GetBaseFileName(ByVal fileName As String) As String
Dim pos As Long
pos = InStrRev(fileName, “.”)
If pos > 1 Then
GetBaseFileName = Left(fileName, pos – 1)
Else
GetBaseFileName = fileName
End If
End Function
—
チーフアーキテクトが教える!実務で絶対に外せない3つの極意
今回のコードには、プロのエンジニアならではの「現場の知見」が散りばめられています。特に重要なポイントを解説します。
1. `CorelDRAW.Optimization = True` による爆速化
大量のベクターオブジェクトを含むドキュメントを連続して別形式でエクスポートする際、CorelDRAWはデフォルトだと「画面の再描画(画面更新)」を毎回挟もうとします。これが処理を劇的に重くする原因です。
処理の冒頭で `Optimization = True` にし、終了時に必ず `False` に戻すことで、処理速度を数倍〜十数倍に跳ね上げることができます。
2. エラー時の「クリーンアップ処理」の鉄則
もし書き出しの途中で何らかのエラー(例:保存先フォルダのアクセス権限がない、ディスク容量が足りないなど)が発生した場合、`Optimization = True` や `EventsEnabled = False` のままプログラムが中断すると、CorelDRAWの画面が固まったり、操作を受け付けなくなったりします。
そのため、`On Error GoTo ErrorHandler` を必ず記述し、エラー発生時でも確実に環境を元に戻すコード(セーフティネット)を組み込むのがプロの流儀です。
3. `ExportFilter` オブジェクトのライフサイクル
CorelDRAW VBAでEPSやSVGなどの外部フォーマットに書き出す際、`doc.Export` メソッドは `ExportFilter` オブジェクトを返します。
このフィルターに対して `.Finish` メソッドを明示的に呼び出すことで、内部的なファイルストリームが完全に閉じられ、メモリリークや「ファイルがロックされて開けない」といったトラブルを防ぐことができます。
—
まとめ:ここをクリアすれば、基本はバッチリ!
お疲れ様でした!
今回は、UserFormを使ったGUIの設計から、複数フォーマットの一括エクスポート、そして実務で必須となるパフォーマンス最適化やエラーハンドリングまでを網羅的に解説しました。
- UIでユーザーのミスを防ぐ
- 最適化フラグで処理スピードを最大化する
- 安全なエラーハンドリングでシステムの堅牢性を担保する
この3つのポイントをマスターしていれば、CorelDRAW VBAの基本は完全にバッチリです。
日々の退屈なルーティンワークはマクロにすべて任せて、あなたにしかできないクリエイティブなデザインワークに時間を使い倒してください。それでは、次の自動化の旅でお会いしましょう!
