こんにちは!CorelDRAW VBAの世界へようこそ。
私はチーフアーキテクトとして、日夜たくさんのデザインデータを自動化の魔法で救ってきたエンジニアです。
デザインの現場で最も恐ろしい事故、それは何だと思いますか?
そう、「画面上では綺麗に見えていたのに、印刷したらジャギジャギの粗い画像になってしまった(解像度不足)」という悲劇です。
ページ数が多くなるカタログやパンフレットの制作では、配置されたすべてのビットマップ画像の解像度を目視でチェックするのは不可能に近いですよね。見落としによる刷り直しは、時間もコストも大きな痛手になります。
そこで今回は、「ドキュメント内にある全ビットマップ画像の解像度を秒速でスキャンし、基準値未満のものをリストアップして警告する『印刷事故防止チェッカー』」の作り方を、優しく徹底解説します。
ここをクリアすれば、CorelDRAW VBAの基本オブジェクトの扱い方はバッチリです。さあ、一緒にプロの第一歩を踏み出しましょう!
—
なぜマクロの記録だけでは不十分なのか?
CorelDRAWには便利な「マクロの記録」機能があります。しかし、オブジェクトを一つひとつ選択してプロパティウィンドウを覗くような動作を記録しても、ドキュメント内の「すべての画像」をスマートに処理することはできません。
なぜなら、実際のデザインデータには、
- ベクターシェイプ(角丸四角形や文字など)
- グループ化された複雑なパーツ
- ページの外(ペーストボード)に置かれた素材
などが混在しているからです。これらを網羅し、プログラムで「画像(Bitmap)だけを正確に見つけて、その解像度を調べる」には、オブジェクトの階層構造(ツリー構造)を正しく巡回するコードの知恵が必要になります。
—
攻略の鍵:ShapeオブジェクトとBitmapオブジェクト
CorelDRAW VBAでベクターや画像を扱うとき、絶対に覚えておかなければならない大原則があります。
1. `ActivePage.Shapes`:アクティブなページにあるすべてのパーツ(シェイプ)の集まり。
2. `Shape.Type`:そのパーツが「文字」なのか「長方形」なのか「ビットマップ画像」なのかを見分ける種類番号。
3. `Shape.Bitmap`:もしそのパーツがビットマップ画像なら、その中身にアクセスするためのプロパティ。
これらを組み合わせることで、「ページ上のすべてのパーツを順番に見ていき、画像だったら解像度をチェックする」という仕組みが作れます。
—
実装コード:印刷事故防止チェッカー
それでは、実際に動かせる完全なコードを公開します。
CorelDRAWのVBAエディタ(`Alt + F11`)を開き、標準モジュールに貼り付けて実行してみてください。
Sub CheckBitmapResolution()
‘ — 設定エリア —
Const TARGET_DPI As Double = 300 # ‘ 許容する最低解像度(これ未満なら警告)
Dim sh As Shape
Dim lowResCount As Long
Dim msg As String
lowResCount = 0
msg = “【解像度不足の画像リスト】” & vbCrLf & vbCrLf
‘ アクティブドキュメントが開かれているかチェック
If ActiveDocument Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If
‘ ページ上のすべてのシェイプを走査する(最重要の基本パターン!)
For Each sh in ActivePage.Shapes
‘ シェイプの種類が「ビットマップ画像」であるかを判定
If sh.Type = cdrBitmapShape Then
Dim resX As Double
Dim resY As Double
‘ 画像の解像度(DPI)を取得
‘ ※ CorelDRAWのBitmapプロパティからピクセル解像度を取得します
resX = sh.Bitmap.ResolutionX
resY = sh.Bitmap.ResolutionY
‘ 縦または横の解像度が基準値未満かチェック
If resX < TARGET_DPI Or resY < TARGET_DPI Then
lowResCount = lowResCount + 1
' リストに情報を追加(オブジェクトIDと解像度)
msg = msg & "・画像 ID: " & sh.StaticID & _
" (解像度: " & Format(resX, "0.0") & " x " & _
Format(resY, "0.0") & " dpi)" & vbCrLf
End If
End If
Next sh
' --- 結果の判定と通知 ---
If lowResCount > 0 Then
msg = msg & vbCrLf & “合計 ” & lowResCount & ” 件の解像度不足が見つかりました!” & vbCrLf & “印刷前に差替えを検討してください。”
MsgBox msg, vbExclamation, “【警告】印刷事故防止チェッカー”
Else
MsgBox “すばらしい!配置されたすべての画像が基準値(” & TARGET_DPI & ” dpi)を満たしています。”, vbInformation, “チェック完了”
End If
End Sub
—
コードの注目ポイント・初心者がつまずきやすい罠
このコードには、プロのエンジニアが現場で使う「安全に動かすためのエッセンス」が詰まっています。いくつか大切なポイントを解説しましょう。
1. `For Each sh In ActivePage.Shapes` の魔法
これはCorelDRAW VBAにおける最も基本的かつ強力なループ構文です。ページ上にあるオブジェクトを先頭から順に変数 `sh` に代入して処理してくれます。難しいインデックス(番号)の管理を気にせず書けるため、まずはこの書き方をマスターしましょう。
2. `sh.Type = cdrBitmapShape` でのフィルタリング
CorelDRAWの画面上にあるものは、すべて「Shape(シェイプ)」という共通の箱に入れられています。そのため、文字や四角形に対して `.Bitmap` プロパティを呼び出すと、「オブジェクトはこのプロパティをサポートしていません」というエラー(実行時エラー)でマクロが止まってしまいます。
必ず `cdrBitmapShape` かどうかを事前にチェック(型ガード)するのが、安定稼働させるための極意です。
3. `ActiveDocument Is Nothing` による安全装置
ドキュメントが開いていない状態でマクロを実行すると、容赦なくエラーが発生します。実務で使うツールであれば、最初に「そもそも編集中のファイルがあるか?」をチェックする優しさが不可欠です。
—
さらなる高みを目指すあなたへ(チーフアーキテクトからのアドバイス)
今回は「アクティブページ」の「直下にある画像」をチェックする基本形を紹介しました。実務ではさらに、
- グループ化された中にある画像も探し出す(再帰処理)
- すべてのページ(複数ページ)を一括スキャンする
- リストアップされた警告の画像を、自動的に画面上で赤く選択状態にする
といった発展形に拡張していくことができます。ここをクリアできれば、あなたのCorelDRAWスキルは間違いなく中級者以上の領域に達しています。
日々の退屈なチェック作業はマクロに任せて、あなたしか生み出せないクリエイティブなデザインの時間をもっと増やしていきましょう。
それでは、次回の極限の知見でお会いしましょう!
