CorelDRAW VBAを掌握する極限の知見
【実務直結】複数オブジェクトを一括EPS書き出し!ダイアログを駆使する素人コードを卒業せよ
デザイン制作の現場において、印刷入稿や他アプリケーション(IllustratorやPhotoshopなど)との連携で避けられないのが「EPSフォーマットへの書き出し」だ。
もしあなたが、画面上のオブジェクトを一つずつ選択し、`Ctrl + E`(またはファイルメニューからのエクスポート)を押し、ダイアログでファイル名を入力し、設定を確認して「保存」をクリック――という作業を繰り返しているなら、今すぐその手を止めてほしい。
プロの業務自動化エンジニアの視点から言わせてもらえば、「GUIのダイアログを介するバッチ処理」は、バグの温床であり、時間泥棒でしかない。
CorelDRAW VBAの本質を理解すれば、数秒で、かつエラーの一切ない堅牢な一括エクスポートシステムを構築できる。
今回は、初心者から一歩抜け出し、実務で即戦力となる「複数オブジェクトの無人一括EPS書き出しマクロ」の設計思想とプロダクションコードを授けよう。
—
1. なぜ「手動エクスポート」や「素人VBA」は崩壊するのか?
実務でマクロを組む際、多くの初学者が陥る罠がある。
- 選択状態(Selection)に依存したコードを書く
`ActiveSelection` を頼りにコードを書くと、ユーザーが意図しないオブジェクトを選択していたり、選択順序(Zオーダー)が狂っていたりするだけで、出力結果が崩壊する。
- ダイアログ(`Dialogs`)を信用する
`Application.DlgFileExport` などのダイアログをVBAから無理やり操作しようとするアプローチは、パフォーマンスが著しく悪化し、環境依存のエラーを引き起こす最大の原因となる。
プロが満たすべき設計要件
1. 完全無人化(Silent Mode): ダイアログを一切出さず、バックグラウンドで高速処理する。
2. 名前の自動解決: オブジェクトのレイヤー名や形状インデックスから、一意で意味のあるファイル名を自動生成する。
3. 安全なパス管理: Windowsのファイルパス制限(禁則文字)を考慮し、予期せぬクラッシュを防ぐ。
—
2. プロダクションコード:一括EPSエクスポート・エンジン
以下のコードは、アクティブページ上の特定の条件を満たす(あるいは全)シェイプを走査し、それぞれ独立したEPSファイルとして一瞬で書き出す実務仕様のVBAマクロだ。
コピペするだけで、あなたのCorelDRAWは強力なバッチコンバーターへと変貌する。
Sub ExportSelectedObjectsToEPS_Pro()
‘ =========================================================================
‘ 著作権・設計思想: CorelDRAW VBA 業務自動化アーキテクチャ
‘ テーマ: 複数オブジェクトの無人EPS一括書き出し(プロダクション品質)
‘ =========================================================================
‘ エラーハンドリングの要:予期せぬクラッシュを防ぐ
On Error GoTo ErrorHandler
‘ 1. 選択チェック(選択されていない場合は処理を中断)
If ActiveSelection.Shapes.Count = 0 Then
MsgBox “書き出すオブジェクトが選択されていません。” & vbCrLf & _
“対象のオブジェクトを選択してから実行してください。”, vbExclamation, “一括書き出しエラー”
Exit Sub
End If
‘ 2. 保存先フォルダの指定(今回はデスクトップの専用フォルダを自動生成)
Dim exportPath As String
exportPath = CreateExportFolder(“CorelDRAW_EPS_Output”)
If exportPath = “” Then Exit Sub ‘ ユーザーキャンセル等の安全装置
‘ 3. パフォーマンス最適化の極意:画面描画とイベントを完全停止
‘ ※これを怠ると、オブジェクト数に比例して処理速度が何十倍も遅くなります。
Application.Optimization = True
EventsEnabled = False
ActiveDocument.BeginCommandGroup “EPS Batch Export”
Dim sh As Shape
Dim exportFileName As String
Dim counter As Long
Dim filterObj As StructFileExportOptions
counter = 1
‘ 4. 選択されたオブジェクトを個別にループ処理
For Each sh In ActiveSelection.Shapes
‘ ファイル名の動的生成(連番 + オブジェクトタイプ)
‘ 例: 001_Rectangle.eps, 002_Curve.eps
exportFileName = exportPath & “\” & Format(counter, “000”) & “_” & CleanFileName(sh.Type) & “.eps”
‘ EPSフィルタ設定のインスタンス化
‘ ※PostScriptレベルやカラーマネジメントは業務要件に合わせて変更してください
Set filterObj = ActiveDocument.Exporters.Create(exportFileName, cdrEPS)
‘ 個別エクスポートの実行(ダイアログなし=Silent Export)
‘ 注意: 一時的に単体シェイプを別ドキュメントに複製するか、
‘ EPSフィルタのバウンディングボックスオプションを制御します。
‘ ここでは最も堅牢な「一時ドキュメントへの退避方式」を採用します。
Call ExportShapeSafely(sh, exportFileName)
counter = counter + 1
Next sh
‘ 5. 終了処理と環境の復元
ActiveDocument.EndCommandGroup
EventsEnabled = True
Application.Optimization = False
ActiveWindow.Refresh
‘ 完了通知
MsgBox “すべてのエクスポートが完了しました。” & vbCrLf & _
“保存先: ” & exportPath, vbInformation, “処理完了”
Exit Sub
ErrorHandler:
‘ 異常終了時の安全保障:必ず環境を復元する
EventsEnabled = True
Application.Optimization = False
ActiveWindow.Refresh
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
‘ =========================================================================
‘ 補助関数:安全なファイル名を生成するためのサニタイズ処理
‘ =========================================================================
Private Function CleanFileName(ByVal shapeType As Long) As String
Select Case shapeType
Case cdrRectangleShape: CleanFileName = “Rectangle”
Case cdrEllipseShape: CleanFileName = “Ellipse”
Case cdrCurveShape: CleanFileName = “Curve”
Case cdrTextShape: CleanFileName = “Text”
Case Else: CleanFileName = “Object”
End Select
End Function
‘ =========================================================================
‘ 補助関数:出力先フォルダの自動生成
‘ =========================================================================
Private Function CreateExportFolder(ByVal folderName As String) As String
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ デスクトップパスを取得
Dim deskPath As String
deskPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”)
Dim targetPath As String
targetPath = deskPath & “\” & folderName
If Not fso.FolderExists(targetPath) Then
fso.CreateFolder targetPath
End If
CreateExportFolder = targetPath
End Function
‘ =========================================================================
‘ 補助関数:オブジェクトを安全に単体EPS化するキモの処理
‘ =========================================================================
Private Sub ExportShapeSafely(ByVal targetShape As Shape, ByVal filePath As String)
‘ 選択されたオブジェクト単体を正確なバウンディングボックスで書き出すため、
‘ 一時的にドキュメントを複製してクロップするアプローチが最も確実です。
Dim docTemp As Document
‘ 現在のドキュメントのサイズを引き継いで新規作成
Set docTemp = Application.CreateDocument()
‘ 元のシェイプをコピーして一時ドキュメントへペースト
targetShape.Copy
docTemp.ActiveLayer.Paste
‘ ページサイズをオブジェクトのサイズに自動合わせ込み(余白なしEPSの鉄則)
Dim sTemp As Shape
Set sTemp = docTemp.ActiveLayer.Shapes.First
docTemp.Pages.Item(1).SetSize sTemp.SizeWidth, sTemp.SizeHeight
‘ オブジェクトをページ原点(0,0)に移動
sTemp.PositionX = 0
sTemp.PositionY = 0
‘ EPSエクスポート実行
Dim expFilter As ExportFilter
Set expFilter = docTemp.Export(filePath, cdrEPS, cdrSelection, Nothing)
‘ 一時ドキュメントを保存せずに閉じる(メモリリーク防止の極意)
docTemp.Close
End Sub
—
3. チーフアーキテクトが教える、コードの急所とパフォーマンスの哲学
上記のコードには、現場で泥を食ってきた者だけが知る「業務自動化の鉄則」が凝縮されている。
① `Application.Optimization = True` の絶対性
CorelDRAWは、オブジェクトが1つ生成されたり移動したりするたびに、画面の再描画(画面の書き換え)を行おうとする。これを有効にしたまま数千のオブジェクトを処理させると、CPUが悲鳴を上げ、処理速度が極端に低下する。
必ず処理の冒頭で `True` にし、終了時に `False` に戻すこと。これがプロとアマの決定的な違いだ。
② メモリリークを許さない「一時ドキュメント方式」
オブジェクトをそのままEPS出力すると、ページ全体の余白が含まれてしまう。さらに、元ドキュメントを汚さずに正確なバウンディングボックスで切り出すためには、「一時的に別ドキュメントへコピーし、ページサイズをオブジェクトにフィットさせてからエクスポートする」というアプローチが極めて有効だ。
そして、使い終わった `docTemp` は必ず `docTemp.Close` でメモリから解放する。これを怠ると、CorelDRAWがフリーズする原因になる。
③ エラーハンドリング(`On Error GoTo`)の網
バッチ処理の途中で、ディスクの書き込み権限エラーや、不正な形状データによってコードが止まってしまうと、`Optimization = True` のまま画面がロックされてユーザーが絶望する。
必ず `ErrorHandler` を用意し、異常終了時でも確実にアプリケーションの状態(画面描画やイベント)を復元させる実装にすること。
—
まとめ:自動化の先にある「クリエイティブな時間」へ
CorelDRAW VBAにおけるファイル書き出し自動化は、単なる「手作業の置き換え」ではない。それは、ヒューマンエラーをゼロにし、デザイナーを退屈なルーティンワークから解放するための「戦略的システム構築」である。
今回提供したコードをベースに、命名規則を社内ルールに合わせたり、EPSの出力オプション(PostScriptのバージョンやフォントの曲線化など)を微調整して、あなただけの最強の業務効率化ツールに育て上げてほしい。
妥協のないコードは、必ずあなたの開発者としての価値を何倍にも高めてくれるはずだ。
