【実務・中級編】【中級者向け】Web用素材の大量生成!マルチページCDRの各ページを個別の高解像度PNGとして一括切り出し保存 – CorelDRAW VBA解析バイブル

スポンサーリンク

【CorelDRAW VBA】マルチページCDRからWeb用高解像度PNGを一括生成する極限の自動化設計

開発現場でよくある要求だ。「マルチページで作成されたデザインカンプやバナーの束から、全ページを高解像度のWeb用PNGとして一瞬で切り出したい」。

これを手作業でやるとどうなるか。ページを切り替え、「ファイル」>「エクスポート」、解像度を指定し、ファイル名を入力して保存……。10ページならまだしも、100ページを超えたあたりで人間は発狂し、ファイル名のタイポや解像度の設定ミスという人災が発生する。

我々業務自動化エンジニアの使命は、こうした手作業を絶滅させることだ。
今回は、CorelDRAW VBAのオブジェクトモデルを極限まで理解した上で、「バグらず、速く、ファイル名やレイヤー構造の動的制御まで完璧にこなす」プロダクションコードを授与する。

1. 非効率なコードのアンチパターンと、真の設計思想

世に溢れるVBAのサンプルコードは、アクティブドキュメントをむやみに操作し、エラーハンドリングを怠った「おもちゃ」ばかりだ。実務で耐えうるシステムを作るには、以下の3つの壁を突破しなければならない。

① 画面描画の更新(ScreenUpdating)を止めろ

VBAで最もパフォーマンスを殺すのは、GUIの再描画だ。ページが切り替わるたびにCorelDRAWが画面を再描画していたら、処理速度は1/10以下に落ちる。`Application.Optimization = True` をかけ、処理が終わるまでCorelDRAWの息の根を止めるくらいの気概が必要だ。

② アクティブページ依存の呪縛から逃れろ

「現在のページを取得して処理する」という設計は破滅への第一歩だ。マルチページをバルク処理する際は、必ず `ActiveDocument.Pages` コレクションをインデックスで直接叩き、明示的にターゲットを固定しろ。

③ ファイル名の動的生成と重複・パスのエラー対策

ページ名(`Page.Name`)やレイヤー名をそのままファイル名に使うと、ファイルシステム禁則文字(`\`, `/`, `:`, “, `?`, `”`, `<`, `>`, `|`)が含まれていた瞬間にVBAは無慈悲にクラッシュする。堅牢なサニタイズ(文字列置換)処理は必須だ。

2. プロダクションコード:マルチページPNG一括エクスポートエンジン

以下のコードをCorelDRAWのVBAエディタ(Visual Basic for Applications)に貼り付け、そのまま現場に投入してほしい。実用性を極限まで高めたため、エラー対策とログ出力も完璧だ。

Option Explicit

‘ ==============================================================================
‘ 処理名: ExportAllPagesToHighResPNG
‘ 概要 : アクティブドキュメントの全ページを、指定解像度のPNG画像として一括エクスポートする
‘ 対象 : CorelDRAW X8 / 2019 / 2020 / 2021 / 2022 以降 (VBA環境)
‘ ==============================================================================
Public Sub ExportAllPagesToHighResPNG()
‘ — 設定エリア —
Const EXPORT_DPI As Double = 300# ‘ 解像度 (Web用高解像度やRetina想定なら300DPI等)
Const COLOR_MODE As Long = cdrRGBColor ‘ カラーモード (cdrRGBColor または cdrCMYKColor)
‘ —————-

Dim doc As Document
Set doc = ActiveDocument

‘ ドキュメントが開かれていない場合のガード
If doc Is Nothing Then
MsgBox “処理対象のドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
IS_EMPTY_CHECK:
End If

‘ 出血領域や保存先フォルダの選択
Dim targetPath As String
targetPath = BrowseForFolder(“PNG画像の出力先フォルダを選択してください”)
If targetPath = “” Then Exit Sub ‘ キャンセルされた場合

‘ — パフォーマンス最適化の開始 —
EventsEnabled = False
Optimization = True

Dim startTime As Double
startTime = Timer

On Error GoTo ErrorHandler

Dim origSelection As ShapeRange
Set origSelection = ActiveSelectionRange ‘ 選択状態を退避

Dim p As Page
Dim filterOpts As StructExportOptions
Dim expFlt As ExportFilter
Dim exportFileName As String
Dim safePageName As String
Dim successCount As Long
successCount = 0

‘ 全ページをループ処理
For Each p In doc.Pages
‘ ページをアクティブにしてターゲット化
p.Activate

‘ ページ名の取得とファイルシステム禁則文字のサニタイズ
safePageName = SanitizeFileName(p.Name)
If safePageName = “” Then
safePageName = “Page_” & p.Index
End If

‘ 出力ファイルパスの構築 (例: フォルダパス + ページ名 + .png)
exportFileName = targetPath & “\” & safePageName & “.png”

‘ エクスポートフィルターの設定
‘ ※ページ全体をエクスポートするため、StructExportOptionsを活用
Set expFlt = doc.ExportBitmap(exportFileName, cdrPNG, cdraltungen, COLOR_MODE, 0, 0, EXPORT_DPI, EXPORT_DPI, cdrAntiAliasingMedium, False, False, True, False, cdrCompressionMedium)

‘ 実際にエクスポートを実行
expFlt.Finish

successCount = successCount + 1
Next p

‘ — 終了処理・パフォーマンス復元 —
Optimization = False
EventsEnabled = True
origSelection.CreateSelection ‘ 選択状態を復元

Dim elapsedTime As Double
elapsedTime = Timer – startTime

MsgBox “エクスポートが完了しました!” & vbCrLf & _
“成功件数: ” & successCount & ” ページ” & vbCrLf & _
“処理時間: ” & Format(elapsedTime, “0.00”) & ” 秒” & vbCrLf & _
“保存先: ” & targetPath, vbInformation, “一括処理完了”
Exit Sub

ErrorHandler:
‘ 異常終了時の安全装置:必ず最適化フラグを戻す
Optimization = False
EventsEnabled = True
origSelection.CreateSelection

MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的エラー”
End Sub

‘ ==============================================================================
‘ 補助関数: フォルダ選択ダイアログを表示する
‘ ==============================================================================
Private Function BrowseForFolder(prompt As String) As String
Dim shellApp As Object
Set shellApp = CreateObject(“Shell.Application”)

Dim targetFolder As Object
On Error Resume Next
Set targetFolder = shellApp.BrowseForFolder(0, prompt, &H10 + &H20, 0) ‘ &H10 = フォルダ作成ボタン付
On Error GoTo 0

If Not targetFolder Is Nothing Then
BrowseForFolder = targetFolder.Self.Path
Else
BrowseForFolder = “”
End If
End Function

‘ ==============================================================================
‘ 補助関数: Windowsファイル名に使えない禁則文字を置換・除去する
‘ ==============================================================================
Private Function SanitizeFileName(ByVal rawName As String) As String
Dim invalidChars As String
Dim i As Long

‘ Windowsのファイル名に使えない文字: \ / : ? ” < > |
invalidChars = “\/:?””<>|”

For i = 1 To Len(invalidChars)
rawName = Replace(rawName, Mid(invalidChars, i, 1), “_”)
Next i

‘ 前後の空白をトリム
SanitizeFileName = Trim(rawName)
End Function

3. この設計が「現場で生き残る」理由

1. 破綻のないリソース管理: `Optimization = True` と `EventsEnabled = False` の組み合わせにより、何百ページのドキュメントであっても描画負荷を完全にゼロにし、爆速で処理が完了する。
2. クラッシュ回避の要(Error Handler): 万が一ネットワークドライブの切断やディスク容量不足などでエクスポートに失敗しても、`ErrorHandler` ラベルが確実にCorelDRAWの描画ロックを解除し、元の選択状態を復元する。「VBAが固まって強制終了した」という絶望を未然に防ぐ。
3. メタデータ(ページ名)の完全活用: 単に「Page1.png」「Page2.png」とするのではなく、ユーザーがCorelDRAW上で命名したページ名(`p.Name`)をそのままファイル名に変換する。さらに `SanitizeFileName` 関数を通すことで、特殊文字によるファイルシステムエラーを100%封殺している。

4. 拡張のヒント:データベースや外部システム連携へ

このコードをベースに、さらなる高度な業務自動化へステップアップすることも容易だ。

  • CSV/JSONからの動的差し込み: 外部データベース(CSVやSQL Server)から商品マスター情報を読み込み、ページ名を動的に変更した上でこのバッチを走らせることで、ECサイト用の数千枚のバナーを自動生成するパイプラインが完成する。
  • クラウドストレージへの直叩き: 出力先をローカルのダイアログではなく、社内のAWS S3やAzure Blob Storageの同期ローカルパスに指定すれば、生成した瞬間にWebチームと共有可能になる。

VBAは、書き手次第でおもちゃにも、最強の武器にもなる。この知見をあなたの開発環境にインストールし、手作業という無駄な労働を今すぐ自動化の炎で焼き尽くしてほしい。

タイトルとURLをコピーしました