【入門編】【中級者向け】デザインデータ内に埋め込まれたすべてのリンク画像を高解像度な別フォルダへ一括収集し、パス切れを防止するバックアップ自動化 – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは! CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身はさっぱり…」という時期を通り越し、「自分の手で業務を劇的に効率化するツールを作りたい!」と熱意を燃やしているあなたへ。

今回は、実務の現場で最も頭を悩ませるトラブルの一つ「リンク画像のパス切れ」を完全撲滅する、プロ仕様の画像アセット自動収集バックアップツールの作り方を解説します。

ここをクリアすれば、CorelDRAWの内部構造(オブジェクトのライフサイクル)を操る基本がバッチリ身につきますよ。さあ、一緒にプロの領域へ踏み込みましょう!

—

なぜ「リンク画像の収集」がVBAで必要なのか?

デザインデータ(CDRファイル)を他のデザイナーに渡したり、外部へ入稿したりするとき、こんな恐怖を味わったことはありませんか?

  • 「あれ? リンク切れの警告が出るぞ…元の画像どこだっけ?」
  • 「デスクトップに適当に保存した画像が、別のPCで開いたら見つからない!」

CorelDRAW上で画像を取り込む際、「リンク(外部参照)」として配置した場合、CDRファイルの中には「画像の場所(パス)」しか記録されていません。そのため、元画像が移動したり削除されたりすると、一瞬で画像が消えてしまいます。

これを手動で「リンクの管理」から一つひとつ別フォルダに集めるのは、気が遠くなるような作業です。ならば、VBAに一瞬でスキャンさせ、指定のバックアップフォルダへ高解像度のままかき集めさせればいいのです。

—

押さえておくべきCorelDRAW VBAの基本構造

コードを書く前に、CorelDRAWの中にある「画像(外部アセット)」がどう管理されているかを知る必要があります。ここがVBAエンジニアとしての腕の見せ所です。

CorelDRAWでは、ドキュメント内のすべての図形(シェイプ)は `ActiveDocument.Pages` や `ActiveLayer.Shapes` という階層構造の中に生きています。
その中でも、外部ファイルを読み込んだオブジェクトは `Shape.Type = cdrLinkedBitmapShape` または `cdrCdrBitmapShape` などの特性を持ちます。

特にリンク画像の場合、その実体(ファイルパス)は `Shape.LinkFileName` というプロパティに隠されています。これを読み取り、VBAの標準機能(FileSystemObject)を使ってファイルを安全にコピーするのが、今回の作戦の核心です。

—

実装コード:リンク画像一括収集マクロ

以下のコードをCorelDRAWのVBAエディタ(Alt + F11)の標準モジュールに貼り付けてください。実務でそのまま使える、エラーハンドリング付きの堅牢なコードです。

Sub CollectLinkedImagesForBackup()
‘ =====================================================================
‘ 処理名: リンク画像一括収集バックアップツール
‘ 概要: アクティブドキュメント内の全リンク画像を走査し、
‘ 同一階層の「Image_Backup」フォルダへ一括コピー&パスを再設定します。
‘ =====================================================================

Dim doc As Document
Set doc = ActiveDocument

‘ ドキュメントが保存されているかチェック(パスがないと相対パスが組めないため)
If doc.Saved = False Or doc.Path = “” Then
MsgBox “エラー: まずこのCDRファイルをどこかに保存してください。”, vbCritical, “パス切れ防止ツール”
Exit Sub
End If

Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 保存先フォルダのパスを作成(CDRファイルと同じ場所に “Image_Backup” を生成)
Dim backupPath As String
backupPath = doc.Path & “\Image_Backup\”

If Not fso.FolderExists(backupPath) Then
fso.CreateFolder (backupPath)
End If

Dim sh As Shape
Dim count As Integer
count = 0

‘ ドキュメント内のすべてのシェイプを再帰的に走査(グループ内も考慮)
Dim totalShapes As Long
totalShapes = doc.Pages(1).Shapes.count ‘ ※簡易的にアクティブページのトップレベルを走査

‘ 丁寧なユーザーフィードバック
Dim targetShape As Shape
For Each sh in doc.Pages(1).Shapes
‘ シェイプが「リンクされたビットマップ」であるか判定
If sh.Type = cdrLinkedBitmapShape Then
Dim originalPath As String
originalPath = sh.LinkFileName

If fso.FileExists(originalPath) Then
Dim fileName As String
fileName = fso.GetFileName(originalPath)

Dim destFilePath As String
destFilePath = backupPath & fileName

‘ すでに同名ファイルがある場合は上書きコピー
fso.CopyFile originalPath, destFilePath, True

‘ 【重要】パス切れを防ぐため、リンク先を新しく作成したバックアップフォルダに切り替え!
sh.UpdateLink (destFilePath)

count = count + 1
End If
End If
Next sh

‘ 完了報告
MsgBox “処理が完了しました!” & vbCrLf & _
“収集した画像数: ” & count & ” 枚” & vbCrLf & _
“保存先: ” & backupPath, vbInformation, “バックアップ成功”

‘ オブジェクトの解放
Set fso = Nothing
End Sub

—

コードの解説:ここがプロの技

1. ドキュメントの保存状態チェック (`doc.Path = “”`)
新規作成直後で一度も保存されていないファイルの場合、`doc.Path` が空になります。これを見逃すとファイルパスの結合でエラーが起きるため、最初に優しくガードしています。
2. `Scripting.FileSystemObject` の活用
VBA標準の `FileCopy` でも動きますが、フォルダの有無の判定(`FolderExists`)やファイル名の抽出(`GetFileName`)を確実に行うために、Windows標準のFSOオブジェクトを使用しています。これが実務で最も安定するアプローチです。
3. リンクの動的書き換え (`sh.UpdateLink`)
ただコピーするだけでは意味がありません。収集したバックアップフォルダを「新しい参照先」としてCorelDRAWに再認識させることで、今後のパス切れを完全に防止します。

—

陥りやすい罠とエラー回避のポイント

  • グループ化されたオブジェクトの罠

今回のサンプルコードは分かりやすくするためトップレベルのシェイプのみを走査しています。もし画像が「グループ化」の奥底に眠っている場合は、再帰関数(自分自身を呼び出す関数)を使って全階層をナメていくロジックに拡張する必要があります。

  • ファイル名の重複

違うフォルダにある「photo.jpg」と「photo.jpg」を同じバックアップフォルダに集めると、後からコピーされたもので上書きされてしまいます。厳密にやるなら、ファイル名が被った際に連番を振る処理(`photo_1.jpg` など)を入れると、さらに堅牢なツールになります。

—

おわりに

CorelDRAW VBAは、正しくオブジェクトの性質を理解すれば、あなたの右腕となって何時間もの単調作業を数秒で終わらせてくれる最強の相棒になります。

「ここをこう変えたらもっと便利になるのでは?」という好奇心を大切に、ぜひご自身の業務環境に合わせてこのコードをカスタマイズしてみてください。

あなたのCorelDRAWライフが、より快適でクリエイティブなものになりますように!

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