CorelDRAW VBAを掌握せよ:リンク切れビットマップを「自動監査」する極限のスクリプト
こんにちは。CorelDRAWの深い森を探索する皆さんへ。
「マクロの記録」ボタンを押して得られるコードは、いわば「足跡」に過ぎません。真の自動化エンジニアを目指すなら、オブジェクトの心臓部に触れ、そのライフサイクルを制御する力を手に入れる必要があります。
今回は、実務で最も恐れられる「リンク切れ画像」を根こそぎ検知する、監査ツールの核心を伝授します。
—
なぜ「リンク切れ」が現場を破壊するのか?
CorelDRAWで配置されたビットマップは、ファイル内に埋め込まれている場合と、外部パスを参照している(Linked)場合があります。後者はファイル容量を抑えるメリットがありますが、移動やリネームでリンクが切れると、出力時に低解像度で印刷されるという致命的な事故を招きます。
これを手動でチェックするのは地獄です。VBAで「オブジェクトのプロパティ」を直接叩き、その挙動を監視しましょう。
—
実装の核心:Bitmap.LinkState を監視する
CorelDRAWのVBAにおいて、`Bitmap` オブジェクトには `LinkState` というプロパティがあります。これが全ての鍵です。
監査ツールの設計思想
1. ページ内の全オブジェクトを再帰的に走査する。
2. `cdrBitmapShape` 型(ビットマップ)のみをフィルタリング。
3. `LinkState` を取得し、リンク切れならログを出力。
4. 解像度(DPI)が基準値以下なら警告を出す。
実装コード:Bitmap Audit Engine
このコードを標準モジュールに貼り付けてください。
Option Explicit
‘ 監査実行メインプロシージャ
Public Sub RunBitmapAudit()
Dim doc As Document
Dim shp As Shape
Dim logFile As Integer
Dim logPath As String
Set doc = ActiveDocument
logPath = “C:\AuditLogs\BitmapReport.txt” ‘ ログ出力先
logFile = FreeFile
Open logPath For Output As #logFile
Print #logFile, “— Bitmap Audit Report: ” & Now & ” —”
‘ ページ内の全オブジェクトを巡回
ProcessShapes doc.ActivePage.Shapes, logFile
Close #logFile
MsgBox “監査完了。レポートを確認してください。”, vbInformation
End Sub
‘ 再帰的にシェイプを走査する関数
Private Sub ProcessShapes(shapes As shapes, logFile As Integer)
Dim s As Shape
Dim bmp As Bitmap
For Each s In shapes
‘ グループ化されている場合を考慮して再帰処理
If s.Type = cdrGroupShape Then
ProcessShapes s.Shapes, logFile
End If
‘ ビットマップオブジェクトか判定
If s.Type = cdrBitmapShape Then
Set bmp = s.Bitmap
‘ 【重要】リンク状態のチェック
‘ cdrLinkStateLinked = 1, cdrLinkStateMissing = 2
If bmp.LinkState = cdrLinkStateMissing Then
Print #logFile, “【警告】リンク切れ: ” & s.Name & ” (ID: ” & s.StaticID & “)”
End If
‘ 解像度チェック(低解像度排除)
If bmp.ResolutionX < 300 Or bmp.ResolutionY < 300 Then
Print #logFile, "【注意】低解像度: " & s.Name & " (" & bmp.ResolutionX & " dpi)"
End If
End If
Next s
End Sub
---
陥りやすい罠とエンジニアの心得
1. 「グループ化」という迷宮
CorelDRAWのオブジェクトはグループ化されると、親オブジェクトの中に隠れます。上記のコードでは `ProcessShapes` を再帰的に呼び出すことで、階層構造を無視して全ビットマップを洗い出しています。ここが「マクロの記録」だけでは到達できない、アーキテクトの領域です。
2. `StaticID` を活用せよ
オブジェクトを選択しようとすると `ActiveShape` に頼りがちですが、自動化では `StaticID` を使ってください。これはドキュメント内で一意なIDであり、ログに記録しておけば、後から「どのオブジェクトがエラーなのか」を確実に特定できます。
3. 解像度の判定基準を動的に
今回は固定値(300dpi)で判定していますが、実務では「広告用」「Web用」などで基準が異なります。定数として管理し、プロジェクトごとに設定を変更できるようにすると、よりプロフェッショナルなツールになります。
—
次のステップへ
このスクリプトは、単なる「エラーチェック」の枠を超え、あなたの作業時間を数時間分カットする「守護神」となります。
- 初級者の方へ: まずは `s.Type` がどう変化するのか、`Debug.Print` を使ってイミディエイトウィンドウに出力してみてください。
- 中級者の方へ: `bmp.FileName` プロパティを使って、リンク切れ時のパスをログに残すよう改造してみましょう。
CorelDRAW VBAの深淵はまだまだ続きます。何か分からないことがあれば、いつでも聞いてください。皆さんの自動化が、より知的で美しいものになることを願っています。
