CorelDRAW VBAを掌握する極限の知見
第4回:複数フォーマット同時マルチエクスポートの極意
こんにちは。開発プロジェクトのリーダー、あるいは現場の自動化を統括するチーフアーキテクトであるあなたなら、クライアントからこんな無茶な要求を突きつけられた経験が一度や二度ではないはずだ。
- 「マスターデータはCDRで欲しいけど、印刷所入稿用にEPSとPDFも、Web展開用にSVGも同時につけてくれ」
- 「これを全案件、手作業ではなくワンクリックで、命名規則を完璧に揃えて出力してほしい」
これを素朴に、CorelDRAWのGUI操作でポチポチと「名前を付けて保存」を繰り返しているようでは、プロのエンジニアとは言えない。ヒューマンエラーの温床であり、手戻りのコストは計り知れない。
今回は、1つのマスターデザインから、納品先に合わせた拡張子の異なるファイル(CDR・EPS・PDF・SVG)を一度の実行で同時に、かつ堅牢に生成・整理保存するマルチエクスポート・エンジンの設計思想と実装を授けよう。
—
1. なぜ「素朴なVBAコード」では破綻するのか?
多くの初中級者が書くVBAコードは、大体このような構造をしている。
‘ 【悪例】思考停止した直列処理
ActiveDocument.SaveAs “C:\Output\design.cdr”
ActiveDocument.Export “C:\Output\design.eps”, cdrEPS
ActiveDocument.Export “C:\Output\design.pdf”, cdrPDF
ActiveDocument.Export “C:\Output\design.svg”, cdrSVG
一見、動くように見えるだろう。しかし、実務の現場ではこれでは一瞬で破綻する。
理由は以下の通りだ。
1. ドキュメントのライフサイクルと状態変化の破壊:
`SaveAs`を実行すると、アクティブドキュメントのパスや状態が上書きされる。その後のエクスポート処理で予期せぬ挙動を引き起こす原因になる。
2. エラーハンドリングの欠落:
もしPDFのエクスポート中にメモリ不足やフォントエラーが発生したら? 処理はそこでストップし、中途半端なファイルだけが残り、原因追跡は困難を極める。
3. 出力フィルターのデフォルト設定の罠:
CorelDRAWの`Export`メソッドは、直前のGUI操作での保存設定(EPSのバージョン、PDFの互換性プロファイルなど)を引き継ぐ。コード側で明示的にオプションを指定しない限り、環境によって出力結果が変わる「再現性のないコード」になる。
プロのエンジニアが目指すべきは、「環境に依存せず、いかなる例外をもハンドリングし、マスタードキュメントを一切汚さずに派生ファイルを錬成する」堅牢なアーキテクチャだ。
—
2. 堅牢なマルチエクスポート・エンジンの設計方針
今回のプロダクションコードでは、以下の設計原則を貫く。
- 非破壊エクスポート(Non-Destructive Export):
マスタードキュメントを直接変更・上書きせず、必要な形式への変換処理を安全に流す。
- 厳密なパスとディレクトリの自動生成:
出力先フォルダが存在しない場合は自動で生成し、ファイル名の重複や不正文字によるクラッシュを防ぐ。
- フィルタースペックの完全制御:
PDFやEPSの出力フィルター構造体(`StructSaveAsOptions` や `StructExportOptions`)を明示的にコード内で構築し、環境依存を排除する。
—
3. 【コピペ即実戦投入可】プロダクションコード
以下のコードをCorelDRAWのVBAエディタ(Visual Basic for Applications)に貼り付け、実行してほしい。実務で求められるエラーハンドリングと、各フォーマットごとの詳細な出力制御を実装している。
Option Explicit
‘ ==============================================================================
‘ 業務自動化モジュール: 複数フォーマット同時マルチエクスポート
‘ ターゲット: CorelDRAW 2019以降 (x64環境推奨)
‘ ==============================================================================
Public Sub ExecuteMultiExport()
‘ 1. アクティブドキュメントの存在確認
If Application.Documents.Count = 0 Then
MsgBox “処理対象となるドキュメントが開かれていません。”, vbCritical, “エクスポートエラー”
Exit Sub
End If
Dim doc As Document
Set doc = Application.ActiveDocument
‘ 2. 未保存ドキュメントのガード (パスがない場合は処理中断)
If doc.Untitled Then
MsgBox “マスタードキュメントが一度も保存されていません。先に名前を付けて保存してください。”, vbExclamation, “要保存”
Exit Sub
End If
‘ 3. 出力先ディレクトリの決定 (マスタードキュメントと同じ階層に「Output_YYYYMMDD」を作成)
Dim baseDir As String
baseDir = doc.FilePath & “Exported_” & Format(Now, “yyyymmdd_hhnnss”) & “\”
If Not CreateDirectoryRecursive(baseDir) Then
MsgBox “出力用ディレクトリの作成に失敗しました: ” & baseDir, vbCritical, “ディレクトリ作成エラー”
Exit Sub
End If
‘ 4. ベースファイル名の取得(拡張子を除く)
Dim fileNameOnly As String
fileNameOnly = GetFileNameWithoutExtension(doc.Name)
‘ — エラーハンドリング開始 —
On Error GoTo ErrorHandler
‘ ————————————————————————–
‘ A. CDR形式での保存 (バックアップ兼マスターの保全)
‘ ————————————————————————–
Dim cdrPath As String
cdrPath = baseDir & fileNameOnly & “.cdr”
doc.SaveAs cdrPath, cdrVersion19 ‘ 必要に応じてバージョンを変更してください
‘ ————————————————————————–
‘ B. PDF形式のエクスポート (印刷・閲覧用)
‘ ————————————————————————–
Dim pdfPath As String
pdfPath = baseDir & fileNameOnly & “.pdf”
Dim pdfParams As StructSaveAsOptions
Set pdfParams = CreatePDFParams()
doc.PublishToPDF pdfPath, pdfParams
‘ ————————————————————————–
‘ C. EPS形式のエクスポート (DTP入稿用)
‘ ————————————————————————–
Dim epsPath As String
epsPath = baseDir & fileNameOnly & “.eps”
Dim epsFilters As StructExportOptions
Set epsFilters = CreateEPSParams()
doc.ExportEx epsPath, cdrEPS, cdrAllPages, epsFilters
‘ ————————————————————————–
‘ D. SVG形式のエクスポート (Web展開用)
‘ ————————————————————————–
Dim svgPath As String
svgPath = baseDir & fileNameOnly & “.svg”
Dim svgFilters As StructExportOptions
Set svgFilters = CreateSVGParams()
doc.ExportEx svgPath, cdrSVG, cdrAllPages, svgFilters
‘ ————————————————————————–
‘ 正常終了通知
‘ ————————————————————————–
On Error GoTo 0
MsgBox “すべてのフォーマットへのエクスポートが正常に完了しました。” & vbCrLf & _
“保存先: ” & baseDir, vbInformation, “マルチエクスポート完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
‘ ==============================================================================
‘ サブ関数: ディレクトリの再帰作成 (FileSystemObject使用)
‘ ==============================================================================
Private Function CreateDirectoryRecursive(ByVal path As String) As Boolean
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
On Error GoTo FSOError
If Not fso.FolderExists(path) Then
fso.CreateFolder path
End If
CreateDirectoryRecursive = True
Exit Function
FSOError:
CreateDirectoryRecursive = False
End Function
‘ ==============================================================================
‘ サブ関数: 拡張子を除いたファイル名の取得
‘ ==============================================================================
Private Function GetFileNameWithoutExtension(ByVal fullName As String) As String
Dim dotPos As Long
dotPos = InStrRev(fullName, “.”)
If dotPos > 0 Then
GetFileNameWithoutExtension = Left(fullName, dotPos – 1)
Else
GetFileNameWithoutExtension = fullName
End If
End Function
‘ ==============================================================================
‘ パラメータ構築: PDF出力オプション
‘ ==============================================================================
Private Function CreatePDFParams() As StructSaveAsOptions
Dim p As StructSaveAsOptions
Set p = New StructSaveAsOptions
‘ PDFプリセットや詳細設定をここでコード化
‘ ※CorelDRAWのバージョンによりプロパティが一部異なる場合があります
With p
.TextAsCurves = True ‘ フォントをアウトライン化して文字化けを防止
‘ 必要に応じて互換性やカラープロファイルの設定を追加
End With
Set CreatePDFParams = p
End Function
‘ ==============================================================================
‘ パラメータ構築: EPS出力オプション
‘ ==============================================================================
Private Function CreateEPSParams() As StructExportOptions
Dim exp As StructExportOptions
Set exp = New StructExportOptions
With exp
.MaintainLayers = True
‘ EPS出力時のオプション指定
End With
Set CreateEPSParams = exp
End Function
‘ ==============================================================================
‘ パラメータ構築: SVG出力オプション
‘ ==============================================================================
Private Function CreateSVGParams() As StructExportOptions
Dim exp As StructExportOptions
Set exp = New StructExportOptions
With exp
‘ SVG特有の最適化設定
End With
Set CreateSVGParams = exp
End Function
—
4. チーフアーキテクトからの現場への助言
このコードをそのまま導入するにあたり、現場の運用として押さえておくべきポイントを最後に共有する。
1. フォントのアウトライン化について:
PDFやEPSを自動生成する際、受け手の環境にフォントがインストールされていないリスクを考慮し、コード内でテキストをカーブ(パス)化する処理(例: `TextAsCurves = True`)を必ず挟むこと。これにより、文字化けクレートを根絶できる。
2. データベースや外部システム連携への拡張:
もしこの自動化をさらに進め、社内の生産管理システムやkintoneなどのクラウドDBと連携させたい場合は、出力完了後にログファイル(CSVやJSON)を同階層に吐き出すロジックを追記するとよい。生成されたファイルのパス一覧を自動でJSON化してAPIに飛ばせば、完全な無人化ラインが完成する。
手作業のルーティンワークに費やす時間は、クリエイティブなエンジニアリングのためにあるべきだ。このエンジンをあなたの環境に組み込み、圧倒的な業務効率化を達成してほしい。
