【入門編】【初心者向け】配置されたすべてのビットマップ画像に対して、リンク状態か埋め込み状態かを一発判定してログ化するツール – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
私はこれまで数々の現場で自動化システムを構築してきたチーフアーキテクトです。

「印刷所から『画像がリンク切れを起こしています』と言われて冷や汗をかいた…」
「他人が作った巨大な入稿データ、埋め込み画像とリンク画像が混ざっていて状態が把握できない…」

そんな絶望的な状況、CorelDRAWを扱う現場なら誰もが一度は経験しますよね。
マクロの記録ボタンを押すだけでは絶対にたどり着けない、「ドキュメントの深層をコードでスキャンする技術」。ここをクリアすれば、あなたのCorelDRAW VBAのスキルは一気にプロの領域へと引き上げられます。

今回は、ドキュメントに配置されたすべてのビットマップ画像を巡回し、それが「外部へのリンク(Link)」なのか、それとも「ドキュメント内への埋め込み(Embed)」なのかを瞬時に判定してログに出力する、実用的なツールを一緒に作っていきましょう。

—

なぜ「画像のステータス判定」がVBAの登竜門なのか?

CorelDRAWでベクターやテキストを操作するのは簡単ですが、画像(Bitmapオブジェクト)は少し特殊なライフサイクルを持っています。画像はドキュメントの中に「実体」として存在する場合もあれば、PC内の別の場所を「指し示している(リンク)」だけの場合もあります。

これを手作業で1つずつプロパティウィンドウを開いて確認していたら、何時間かかるかわかりません。
VBAを使えば、わずかコンマ数秒ですべてを丸裸にできます。

今回のツールでCorelDRAW VBAの最も重要な3つの概念をマスターできます。
1. アクティブドキュメントの安全な取得
2. ページやレイヤーを越えた全シェイプの再帰的(または網羅的)な走査
3. オブジェクトの「型」と「プロパティ」の判定

—

実装コード:一発判定スキャンマクロ

以下のコードを、CorelDRAWのVBAエディタ(`Alt + F11` で起動)の標準モジュールにそのまま貼り付けてください。実務でそのまま使えるよう、細かくコメントを入れています。

Sub CheckBitmapStatus()
‘ ==============================================================================
‘ 【ツール名】Bitmaps Status Inspector
‘ 【概要】アクティブドキュメント内の全ビットマップのリンク/埋め込み状態をイミディエイトWindowにログ出力する
‘ ==============================================================================

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

Dim sr As ShapeRange
Dim sh As Shape
Dim bmpCount As Long
Dim linkCount As Long
Dim embedCount As Long

‘ 初期化
bmpCount = 0
linkCount = 0
embedCount = 0

‘ デバッグエリア(イミディエイトウィンドウ)のヘッダー出力
Debug.Print “====================================================”
Debug.Print ” 画像アセット ステータススキャン開始: ” & ActiveDocument.FileName
Debug.Print “====================================================”

‘ ドキュメント全体(すべてのページ)から「ビットマップ」のシェイプを効率的に一括取得
‘ CorelDRAW VBAの強力な機能である ActiveDocument.Pages を巡回します
Dim p As Page
For Each p In ActiveDocument.Pages
p.Activate

‘ ページ上のすべてのシェイプから、Bitmapタイプのものだけを抽出
Set sr = p.Shapes.FindShapes(Query:=”@type = ‘bitmap'”)

For Each sh In sr
bmpCount = bmpCount + 1

‘ 核心部分:Bitmap.IsLinked プロパティでリンク状態を判定
If sh.Bitmap.IsLinked Then
linkCount = linkCount + 1
Debug.Print ” [リンク] ページ: ” & p.Index & ” | 名前: ” & sh.Name & ” | パス: ” & sh.Bitmap.FileName
Else
embedCount = embedCount + 1
Debug.Print ” [埋込] ページ: ” & p.Index & ” | 名前: ” & sh.Name
End If

Next sh
Next p

‘ スキャン結果サマリーの出力
Debug.Print “====================================================”
Debug.Print ” 【スキャン完了】”
Debug.Print ” – 検出されたビットマップ総数 : ” & bmpCount
Debug.Print ” – 外部リンク画像 : ” & linkCount
Debug.Print ” – 内部埋め込み画像 : ” & embedCount
Debug.Print “====================================================”

‘ ユーザーへの完了通知
MsgBox “スキャンが完了しました!” & vbCrLf & _
“結果をイミディエイトウィンドウ(Ctrl + G)で確認してください。”, vbInformation, “完了”

End Sub

—

コードの核心を解説:ここがVBAの本質だ!

初心者の方が「おっ」と思うポイント、そしてつまずきやすいポイントをエンジニア視点で解説します。

1. `FindShapes(Query:=”@type = ‘bitmap'”)` の魔法

すべてのシェイプを `For Each` で力技(総当たり)でループさせると、グループ化された中にあるオブジェクトや、レイヤーの構造に阻まれてコードが複雑化し、パフォーマンスも落ちます。
CorelDRAW VBAには「クエリ(条件検索)」機能が備わっています。`@type = ‘bitmap’` と指定するだけで、CorelDRAWの内部エンジンが一瞬で画像だけを拾い上げてくれます。これがプロの書く効率的なコードです。

2. `sh.Bitmap.IsLinked` という真実

ビットマップシェイプ(`Shape` オブジェクト)の中には、`Bitmap` という専用のプロパティが内包されています。
その中にある `IsLinked` という真偽値(Boolean)こそが、今回の主役です。

  • `True` ならば:元画像ファイルがPCのどこかに存在し、パスで繋がっている(リンク)
  • `False` ならば:ファイルデータがCorelDRAWファイル内部に抱え込まれている(埋め込み)

このプロパティを知っているだけで、画像管理マクロの大部分が自作できるようになります。

3. ログの出力先「イミディエイトウィンドウ」

今回のコードでは、結果をポップアップではなく `Debug.Print` を使ってイミディエイトウィンドウに出力しています。

  • 確認方法: VBAエディタを開いた状態で `Ctrl + G` を押すと、画面下部に現れるエリアです。

大量のファイル名やパスを扱う場合、メッセージボックスよりもログとして流し込む方が圧倒的に実用的です。

—

陥りやすいエラーと回避の知見

実務でこのコードを運用する際、以下の罠にハマることがあります。先輩からのアドバイスとして覚えておいてください。

  • 罠1: レイヤーがロックされている、または非表示の場合

今回のコードは `p.Shapes.FindShapes` を使っているため、基本的にレイヤーの状態に関わらず検索にかかります。しかし、もし通常のループ処理(`For i = 1 To p.Shapes.Count`)を書いてしまった場合、ロックされたレイヤーやマスターレイヤーの扱いでエラーが出たり、スキャン漏れが起きます。クエリ検索を使うことでこのリスクを回避しています。

  • 罠2: リンク切れの画像ファイルがある場合

`sh.Bitmap.IsLinked = True` であっても、元の画像ファイルが削除されたり移動されていたりすると、`sh.Bitmap.FileName` を参照する際にCorelDRAWが悲鳴を上げることがあります。厳密な本番環境のコードでは、ファイルが存在するかどうかのチェック(`Dir()`関数の利用など)を組み合わせると完璧です。

—

おわりに

お疲れ様でした!
たったこれだけの行数で、ドキュメントの奥深くにある画像のアセット状態を完全に見通すことができるようになりました。

ここをクリアしたあなたなら、次は「すべてのリンク画像を強制的に埋め込む(あるいはその逆の)一括変換スクリプト」へとステップアップできるはずです。CorelDRAW VBAの可能性は無限大です。日々の面倒な手作業をコードで駆逐し、よりクリエイティブな時間に注力していきましょう。

それでは、次の現場でお会いしましょう!

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