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

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身がさっぱりわからない……」という段階を卒業し、いよいよ自分の手で実務を劇的に効率化するツールを作りたい中級者のあなたへ。

今回は、実務の現場で頭を悩ませがちな「リンク切れ画像の自動スキャンと修復を行う監査ツール」の作り方を、プロのアーキテクトの視点から徹底解説します。

ここをクリアすれば、CorelDRAWドキュメントの内部構造(オブジェクトのライフサイクル)を自在に操る基本がバッチリ身につきますよ。さあ、一緒に扉を開けましょう!

—

なぜ「画像のリンク切れ」は実務で恐ろしいのか?

印刷業界やデザインの現場では、CDRファイル容量の肥大化を防ぐために、高解像度の画像は「リンク(外部参照)」として配置するのが定石です。

しかし、プロジェクトの途中でフォルダー構成を変えたり、NASのパスが変わったりすると……。

  • 「あれ?リンク画像が真っ白(または低解像度のプレビュー)になっている!」
  • 「入稿直前に気づいてパニックに……」

こんなヒヤリハットを、VBAの力で完全に自動化して撲滅するのが今回のミッションです。

—

CorelDRAW VBAにおける「外部画像リンク」の本質

まず、CorelDRAWの内部構造を少しだけ覗いてみましょう。
CorelDRAWのページ上にある画像(Bitmap)は、`Shape`(シェイプ)というオブジェクトとして存在しています。その中にリンク情報を持っている場合、`ExternalFile` プロパティなどを通じて、元の画像ファイル(パス)にアクセスできます。

ここで重要なのは、「VBAでファイルを検索・置換するロジック」と「CorelDRAWのオブジェクト操作」を組み合わせるという点です。

—

実装コード:リンク切れ監査&修復ツール

以下のコードを、CorelDRAWのVBAエディタ(Alt + F11)の標準モジュールに貼り付けてください。
実務でそのままコピペして使えるよう、ファイル存在確認(`Dir`関数)や代替パスへの自動置換ロジックを組み込んでいます。

Sub AuditAndRepairImageLinks()
‘ =========================================================================
‘ ツール名: リンク画像監査・修復自動化スクリプト
‘ 概要: アクティブなCDR文書内の全リンク画像をスキャンし、リンク切れを検知・修復
‘ =========================================================================

Dim sh As Shape
Dim sr As ShapeRange
Dim missingCount As Long
Dim repairedCount As Long
Dim originalPath As String
Dim newPath As String
Dim searchFolder As String

‘ 【設定】もし画像が見つからない場合に探しに行く「代替フォルダーのベースパス」
‘ ※環境に合わせて書き換えてください(例: ネットワークドライブや別階層など)
searchFolder = “C:\NewImageFolder\”

missingCount = 0
repairedCount = 0

‘ アクティブドキュメントの存在チェック
If ActiveDocument Is Nothing Then
MsgBox “処理対象となるドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If

‘ 文書内のすべてのビットマップ(リンク画像含む)を効率的に取得
‘ FindShapes メソッドを使うことで、ページ全体のシェイプからBitmapタイプを高速抽出します
Set sr = ActivePage.FindShapes(Type:=cdrBitmapShape)

If sr.Count = 0 Then
MsgBox “このページにはビットマップオブジェクトが存在しません。”, vbInformation, “通知”
Exit Sub
End If

‘ スキャン開始
For Each sh In sr
‘ シェイプが外部ファイルにリンクしているか判定
If sh.Bitmap.IsLinked Then
originalPath = sh.Bitmap.FileName

‘ リンク先のファイルが実際に存在するか? (Dir関数による高速チェック)
If Dir(originalPath) = “” Then
missingCount = missingCount + 1

‘ 代替パスの推測(ファイル名だけを抽出し、新しいフォルダーと結合)
newPath = searchFolder & GetFileName(originalPath)

‘ 代替先にはファイルが存在するか確認
If Dir(newPath) <> “” Then
‘ リンクの再設定(パスの更新)
sh.Bitmap.UpdateLink newPath
repairedCount = repairedCount + 1
Debug.Print “【修復成功】: ” & originalPath & ” -> ” & newPath
Else
Debug.Print “【リンク切れ継続】: ” & originalPath & ” (代替先にも見つかりません)”
End If
End If
End If
Next sh

‘ 監査結果のレポート
Dim msg As String
msg = “画像リンクの監査が完了しました。” & vbCrLf & _
“・検出されたリンク切れ: ” & missingCount & ” 件” & vbCrLf & _
“・自動修復された画像: ” & repairedCount & ” 件”

If missingCount > repairedCount Then
msg = msg & vbCrLf & vbCrLf & “※一部、代替フォルダーでも見つからない画像があります。イミディエイトウインドウを確認してください。”
MsgBox msg, vbExclamation, “監査完了(要確認)”
Else
MsgBox msg, vbInformation, “監査完了”
End If

End Sub

‘ ————————————————————————-
‘ 補助関数: フルパスからファイル名のみを取り出すヘルパー
‘ ————————————————————————-
Private Function GetFileName(ByVal fullPath As String) As String
Dim pos As Long
pos = InStrRev(fullPath, “\”)
If pos > 0 Then
GetFileName = Mid(fullPath, pos + 1)
Else
GetFileName = fullPath
End If
End Function

—

コードの注目ポイントと知見

ここでおさえておくべき、CorelDRAW VBA特有の重要なポイントを解説します。

1. `ActivePage.FindShapes(Type:=cdrBitmapShape)` の圧倒的なパフォーマンス
文書内の全シェイプを一つひとつ `For Each` で舐めていくのは、オブジェクトの数が多いドキュメントにおいて致命的なパフォーマンス低下を招きます。`FindShapes` メソッドのフィルター機能を活用することで、必要なオブジェクトだけを瞬時にメモリ上に取得(`ShapeRange`化)できます。これが大規模データを扱うプロの技です。
2. `sh.Bitmap.IsLinked` と `Dir` 関数の合わせ技
CorelDRAW内部で「リンクされている」と判定されていても、実ファイルがネットワークの切断などで消えている場合があります。VBA標準の `Dir()` 関数を組み合わせることで、OSレベルでのファイルの存在有無を確実にフックできます。
3. `UpdateLink` によるスマートな修復
わざわざ画像を削除して配置し直す(インポートし直す)必要はありません。リンクオブジェクトに対して `UpdateLink` メソッドを叩くだけで、位置やサイズ、変形プロパティを完全に出し分けたまま、参照先だけを安全に差し替えることができます。

—

陥りやすいエラーと回避のコツ

  • エラー:「オブジェクトは、このプロパティまたはメソッドをサポートしていません」
  • 原因: 選択したシェイプがリンク画像(外部参照)ではなく、ドキュメントに「埋め込まれた(Embedded)」画像である場合に発生します。
  • 対策: サンプルコードのように `sh.Bitmap.IsLinked` で事前に条件分岐を挟むことで、埋め込み画像を誤って操作してエラーになるのを防げます。

—

おわりに

いかがでしたでしょうか?
今回紹介したツールをベースに、「修復できなかった画像をダイアログで手動選択させる」「処理結果をExcelに出力してログを残す」といった拡張を加えれば、あなただけの最強のプリフライト(事前確認)システムが完成します。

CorelDRAW VBAは、一見とっつきにくくても、オブジェクトのライフサイクルと適切なメソッドを理解すれば、あなたの右腕となって何時間もの手作業を数秒で終わらせてくれます。

ここをクリアしたあなたなら、もう初学者ではありません。ぜひ現場のワークフローに組み込んで、周囲をあっと言わせる自動化を実現してくださいね!

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