CorelDRAW VBAの深淵:リンク画像を掌握する「アセット・コレクター」の設計思想
CorelDRAWで大規模なプロジェクトを扱う際、最も頻発する悲劇は「入稿データを開いたらリンク画像が見つからない」という初歩的な、しかし致命的なエラーだ。
手作業で一つずつパスを追い、コピーする? そんな非生産的な時間は今すぐ捨てろ。CorelDRAW VBAを「単なる自動化ツール」としてではなく、「データ整合性を担保するエンジン」として再定義する時が来た。
本稿では、ドキュメント内の全外部参照(Bitmap)を解析し、安全かつ堅牢に一括収集するプロフェッショナルな設計術を伝授する。
—
1. なぜ「単純なループ」では失敗するのか
初心者が陥る罠は、`ActivePage.FindShapes`をただ回してパスを取得するだけのコードだ。実務では以下の3つの壁に直面する。
1. リンクの断絶: 埋め込み画像(Embedded)とリンク画像(Linked)を区別していない。
2. パスの衝突: 同名ファイルが異なるフォルダに存在する場合、単純コピーでは上書きされる。
3. メモリリーク: 大量のオブジェクトを巡回する際、適切に参照を解放しないとCorelDRAW自体が不安定になる。
真のエンジニアは、「オブジェクトのプロパティを読み取る前に、その生存環境を定義する」。
—
2. プロダクション・コード:アセット・コレクター
以下のコードは、エラーハンドリングとパスの重複回避を実装した実務レベルのテンプレートだ。
‘ 必要な参照設定: Microsoft Scripting Runtime (FileSystemObjectのため)
Option Explicit
Public Sub CollectLinkedImages()
Dim doc As Document
Dim shp As Shape
Dim fso As Object
Dim sourcePath As String, destPath As String, fileName As String
Dim targetFolder As String
Set doc = ActiveDocument
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 出力先の定義(実務ではダイアログで指定させるのがベスト)
targetFolder = “C:\Backup\LinkedAssets\”
If Not fso.FolderExists(targetFolder) Then fso.CreateFolder (targetFolder)
‘ 全てのBitmapオブジェクトを走査
For Each shp In doc.ActivePage.FindShapes(Type:=cdrBitmapShape)
‘ リンクされているか確認
If shp.Bitmap.Linked Then
sourcePath = shp.Bitmap.FileName
‘ ファイル名を取得してコピー
fileName = fso.GetFileName(sourcePath)
destPath = targetFolder & fileName
‘ 重複チェック(別ソースからの同名ファイル対策)
If Not fso.FileExists(destPath) Then
fso.CopyFile sourcePath, destPath
Debug.Print “Success: ” & fileName
Else
Debug.Print “Skipped (Already exists): ” & fileName
End If
End If
Next shp
MsgBox “アセットの収集が完了しました。”, vbInformation
End Sub
—
3. コードを「保守可能な資産」にするための3つの鉄則
① 参照の抽象化(FSOの活用)
VBA標準の`FileCopy`ではなく、`Scripting.FileSystemObject`を使え。パスの結合や存在確認、拡張子の取得が圧倒的に安全かつ高速だ。特にWindows環境特有のパス区切り文字の扱いに悩む必要がなくなる。
② エラーハンドリングのレイヤー化
プロダクション環境では、リンク先のファイルが既に移動・削除されているケースが多々ある。
`On Error Resume Next`で放置するのではなく、`If fso.FileExists(sourcePath)`で事前の生存確認を行うこと。これが堅牢性を担保する「防衛線」だ。
③ インタフェースの分離
今回はメインの処理を単一プロシージャに書いたが、本番環境では「パス収集ロジック」と「ファイルコピーロジック」を関数として分離せよ。そうすることで、後日「収集したパスリストをExcelに出力したい」といった要求にも即座に対応できる。
—
4. アーキテクトからの助言:次はどこを目指すべきか
このコードを手にしたら、次は以下の拡張を検討せよ。
- ログ出力: コピーできなかった画像(リンク切れ)をリスト化し、テキストファイルで書き出す機能。
- パスの再リンク: 収集したフォルダを「新しい参照先」として、CDRファイル内のパスを一括更新する機能(`shp.Bitmap.Link` プロパティの書き換え)。
CorelDRAWの自動化において重要なのは、「ツールを作ること」ではない。「運用プロセスそのものを自動化する設計」を行うことだ。このスクリプトをベースに、君の現場に最適化された「究極のパイプライン」を構築してほしい。
健闘を祈る。
