CorelDRAW VBAで「パス切れ」を撲滅せよ!外部アセット一括収集・パッケージング術
こんにちは。CorelDRAWの自動化の世界へようこそ。
「マクロの記録」ボタンを押して生成されたコードを眺める段階は卒業しましたか?もしそうなら、あなたは今、CorelDRAWのポテンシャルを解放する入り口に立っています。
現場で最も恐ろしいのは、数ヶ月後に開いたファイルで「画像リンクが切れている」という警告が出ることです。これではプロの仕事とは言えません。今回は、CorelDRAW内に散らばった外部画像(ビットマップ)を、プログラムの力で一つのフォルダへ安全に集約する「アセット・パッケージャー」を構築しましょう。
—
1. なぜ「外部参照」は危険なのか?
CorelDRAWのファイル(.cdr)は、実は巨大な「入れ物」です。外部画像を配置する際、リンク状態のままにしておくと、CorelDRAWは画像そのものではなく「画像への地図(パス)」だけを保持します。
- PCを買い替えた
- サーバーの構成が変わった
- フォルダ名を変更した
これだけで「パス切れ」は発生します。真のプロは、データとアセットを切り離さず、必ず「物理的なバックアップ」を自動化します。
—
2. ロジックの解剖:どうやって画像を見つけるか?
CorelDRAW VBAにおいて、画像オブジェクトは `ImportedBitmap` という型で管理されています。私たちは以下の手順でアセットを追跡します。
1. 全ページを走査する: ドキュメント内のすべてのページを巡回します。
2. Bitmapオブジェクトを特定する: `Shape` 型の中から、画像データを持つものを選別します。
3. パスを抽出する: `Bitmap.FileName` プロパティでリンク元を取得します。
4. ファイルをコピーする: `FileSystemObject` を使い、指定フォルダへ移動させます。
—
3. 実装:アセット収集自動化スクリプト
以下のコードをVBAエディタ(Alt + F11)に貼り付けてください。
‘ 必要なライブラリ: Microsoft Scripting Runtime (参照設定で追加してください)
Sub ExportAllLinkedImages()
Dim doc As Document
Dim shp As Shape
Dim fso As FileSystemObject
Dim targetFolder As String
Dim sourcePath As String
Dim fileName As String
Set doc = ActiveDocument
Set fso = New FileSystemObject
‘ 保存先のフォルダを指定
targetFolder = “C:\Backup\Assets_” & Format(Now, “yyyyMMdd_HHmmss”) & “\”
If Not fso.FolderExists(targetFolder) Then fso.CreateFolder (targetFolder)
‘ 全ページを巡回
Dim p As Page
For Each p In doc.Pages
p.Activate
‘ 各ページ内の全シェイプをスキャン
For Each shp In p.FindShapes(Type:=cdrBitmapShape)
‘ リンクされた画像のみを対象にする
If shp.Bitmap.Linked Then
sourcePath = shp.Bitmap.FileName
fileName = fso.GetFileName(sourcePath)
‘ ファイルのコピーを実行
If fso.FileExists(sourcePath) Then
fso.CopyFile sourcePath, targetFolder & fileName
Debug.Print “収集完了: ” & fileName
Else
MsgBox “警告: パス切れを確認しました -> ” & sourcePath
End If
End If
Next shp
Next p
MsgBox “アセットの収集が完了しました!保存先: ” & targetFolder
End Sub
—
4. 知っておくべき「落とし穴」と対策
このコードを書いていく中で、初心者が必ず直面する壁がいくつかあります。
- 「埋め込み」と「リンク」の違い:
`shp.Bitmap.Linked` プロパティを確認してください。これが `False` の場合、その画像はすでにドキュメント内に埋め込まれており、外部パスを持たないためコピーできません。今回の要件は「リンク」の保全ですので、ここを判定することが重要です。
- 参照設定(Reference):
コード内の `FileSystemObject` は強力ですが、標準では使えません。VBAエディタのメニューから「ツール」→「参照設定」を選び、「Microsoft Scripting Runtime」にチェックを入れてください。これだけで、ファイル操作の自由度が飛躍的に高まります。
- グループ化されたオブジェクト:
`p.FindShapes` は非常に便利ですが、グループ化された中にある画像は見逃すことがあります。本格的なプロダクション環境では、再帰関数(関数の中で自分自身を呼び出す仕組み)を使って、グループ階層を深く潜る設計にするのがベストです。
—
最後に:自動化は「保険」である
今回作成したツールは、単なる効率化ツールではありません。「いつでもどこでも作業環境を再現できる」という、エンジニアとしての責任を果たすための保険です。
まずはこのコードを動かし、自分のデザインデータの依存関係がどうなっているか可視化してみてください。そこからが、あなたの自動化エンジニアとしての本当のスタートです。
何か詰まったら、いつでも聞いてください。CorelDRAWの内部構造の深淵まで、一緒に潜っていきましょう。
