—
CorelDRAW VBAを掌握する:多重フォーマット一括エクスポートツールの構築とアーキテクチャ
プロフェッショナルの現場において、「手作業で一つずつ別名保存する」という行為は、単なる時間の浪費ではなく「品質の不均一」を招くリスクであると認識すべきです。
デザイナーがクリエイティブに集中し、出力という定型業務を機械に委ねる。これを実現するには、単なる記録マクロでは不十分です。本稿では、CorelDRAW VBAを使い、EPS、PDF、SVG、そしてCDRのバックアップを一撃で生成する、堅牢かつ実戦的なUIツールの構築手法を伝授します。
—
1. 設計思想:なぜ「動的なエクスポート」が必要なのか
多くの初心者は、`ActiveDocument.Export` メソッドを引数なしで呼び出し、標準のダイアログに頼ります。しかし、業務自動化の真髄は「ユーザーに余計な選択をさせないこと」にあります。
非効率な設計の末路
- 設定のブレ: 担当者によってPDFのプリセットが変わってしまう。
- パスの入力ミス: 保存先を手入力させることで、ファイルが迷子になる。
- 拡張性の欠如: 新しいフォーマットを追加するたびに、コードを数百行書き換える。
我々が目指すべきは、「出力設定を抽象化し、UIとロジックを完全に分離した疎結合なアーキテクチャ」です。
—
2. UI(UserForm)の設計指針
UserFormは単なる見た目ではありません。「バリデーション(入力チェック)の最前線」です。
推奨されるコントロール配置
1. CheckBoxes: `chkEPS`, `chkPDF`, `chkSVG`, `chkCDR`(出力要否の選択)
2. TextBox: `txtExportPath`(出力先ディレクトリ)
3. CommandButton: `btnExecute`(実行)
> Architect’s Tip: 保存先パスは必ず `BrowseForFolder` API、もしくは `FileDialog` を利用して取得させなさい。手入力はバグの温床です。
—
3. プロダクション・コード:多重出力エンジン
以下に、実務に耐えうる堅牢なコードを示します。このコードの肝は、各形式ごとの「エクスポート・フィルタ」の適切な制御にあります。
標準モジュール:メインエントリ
Option Explicit
‘ —————————————————————————
‘ 目的: エクスポートフォームを起動する
‘ —————————————————————————
Public Sub ShowExportManager()
‘ ドキュメントが開いているかチェック
If Documents.Count = 0 Then
MsgBox “対象となるドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If
‘ フォームの表示
frmExportManager.Show vbModeless
End Sub
UserForm(frmExportManager)内ロジック
Option Explicit
‘ 実行ボタン押下時のメインロジック
Private Sub btnExecute_Click()
Dim exportPath As String
Dim fileName As String
Dim doc As Document
Set doc = ActiveDocument
exportPath = txtExportPath.Text
‘ 1. バリデーション
If Right(exportPath, 1) <> “\” Then exportPath = exportPath & “\”
If Dir(exportPath, vbDirectory) = “” Then
MsgBox “指定されたフォルダが存在しません。”, vbCritical
Exit Sub
End If
‘ 拡張子を除いたファイル名を取得
fileName = Left(doc.FileName, InStrRev(doc.FileName, “.”) – 1)
If fileName = “” Then fileName = “Untitled”
‘ パフォーマンス最適化:描画停止
On Error GoTo ErrorHandler
Optimization = True
EventsEnabled = False
‘ 2. 各フォーマットへの振り分け
If chkCDR.Value Then Call ExportAsCDR(doc, exportPath & fileName & “.cdr”)
If chkPDF.Value Then Call ExportAsPDF(doc, exportPath & fileName & “.pdf”)
If chkEPS.Value Then Call ExportAsEPS(doc, exportPath & fileName & “.eps”)
If chkSVG.Value Then Call ExportAsSVG(doc, exportPath & fileName & “.svg”)
MsgBox “一括出力が完了しました。”, vbInformation, “Success”
CleanUp:
Optimization = False
EventsEnabled = True
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub
‘ — 各エクスポート・サブ関数 —
Private Sub ExportAsCDR(doc As Document, fullPath As String)
‘ CDRは保存処理。バージョンを指定することで互換性を担保。
Dim opt As New StructSaveAsOptions
opt.Version = cdrCurrentVersion
doc.SaveAs fullPath, opt
End Sub
Private Sub ExportAsPDF(doc As Document, fullPath As String)
‘ PDFエンジンは詳細設定が可能。ここではプリセットを利用。
With doc.PDFSettings
.Reset
.PublishRange = pdfWholeDocument
.PdfVersion = pdfVersion17
.ColorMode = pdfCMYK
‘ テキストを曲線に変換してトラブルを防止
.ConvertObjectsToCurves = True
End With
doc.PublishToPDF fullPath
End Sub
Private Sub ExportAsEPS(doc As Document, fullPath As String)
Dim expFilter As ExportFilter
Dim expOptions As New StructExportOptions
‘ EPS特有の設定
expOptions.UseColorProfile = True
Set expFilter = doc.ExportEx(fullPath, cdrEPS, cdrCurrentPage, expOptions)
‘ フィルタダイアログを表示させずに実行するための重要設定
With expFilter
‘ ここでEPSの詳細パラメータをセット(PostScriptレベル等)
‘ .Finish メソッドを呼ぶことで確定
.Finish
End With
End Sub
Private Sub ExportAsSVG(doc As Document, fullPath As String)
Dim expFilter As ExportFilter
Dim expOptions As New StructExportOptions
Set expFilter = doc.ExportEx(fullPath, cdrSVG, cdrCurrentPage, expOptions)
‘ SVGフィルタの制御
With expFilter
‘ 必要に応じてフォントの埋め込み設定などを追加
.Finish
End With
End Sub
—
4. 現場のチーフアーキテクトが教える「プロの鉄則」
① `ExportEx` と `Finish` の関係を理解せよ
CorelDRAW VBAにおいて、`Export` メソッドと `ExportEx` メソッドは似て非なるものです。
`ExportEx` は ExportFilterオブジェクト を返します。このオブジェクトのプロパティを操作した後に `.Finish` を呼ぶことで、ユーザーに設定ダイアログを見せることなく(=完全に自動で)出力を完了させることができます。これを怠ると、大量出力中に何度もダイアログをクリックさせられる「自動化の皮を被った手作業」に成り下がります。
② パフォーマンスの重み:`Optimization`
コード内で `Optimization = True` を設定しています。これは画面更新をフリーズさせる命令です。
数ページのドキュメントなら微々たる差ですが、複雑なベクターデータや数百個のファイルを回す場合、これがあるかないかで実行速度が3倍から10倍変わります。
③ ファイルシステムとの連携
実務では、ネットワークドライブ(NAS)への保存が頻発します。
`FileSystemObject` (FSO) を利用して、出力前にディレクトリの書き込み権限があるか、同名のファイルが「読み取り専用」でロックされていないかをチェックするルーチンを組み込むのが、真に「堅牢」なコードです。
—
5. 終わりに:ツールを育てるということ
今回紹介したコードは、あくまで「エンジン」の最小構成です。
ここから、
- データベース連携: 出力履歴をSQL ServerやCSVに記録する。
- Slack/Teams通知: 出力完了をチームに自動通知する。
- 自動プリフライト: 出力前に「ヘアライン(極細線)」がないかスキャンする。
といった機能を肉付けしていくことで、あなたの作成するツールは単なる「マクロ」から、組織の「インフラ」へと昇華します。
コードを書くことは手段であり、目的は「人間を単純作業から解放すること」にある。この視点を忘れずに、CorelDRAWの広大なAPIの海を航海してください。
