【入門編】【中級者向け】大量のビットマップ画像が配置されたCDRファイルに対し、リンク切れの有無を自動スキャンし缺失画像を修復・警告する監査ツール – CorelDRAW VBA解析バイブル

スポンサーリンク

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の深淵はまだまだ続きます。何か分からないことがあれば、いつでも聞いてください。皆さんの自動化が、より知的で美しいものになることを願っています。

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