CorelDRAW VBAを掌握せよ:外部アセットの「完全追跡・一括収集」でパス切れを撲滅する
CorelDRAWでの制作現場において、最も神経をすり減らすのが「リンク画像のパス切れ」だ。数GBに及ぶデータを入稿・アーカイブする際、手作業で画像をコピーし、リンクを張り直す……そんな前時代的なワークフローは、今すぐ自動化して捨て去るべきだ。
今日は、CorelDRAWの内部オブジェクト構造を理解し、外部アセットを強固に管理するための「資産保護アーキテクチャ」を伝授する。
—
なぜ「手作業」では破綻するのか?
多くの開発者が陥る罠は、`ActivePage`をループして`ShapeRange`を走査するだけの浅い実装だ。しかし、CorelDRAWの内部構造において、画像は単なる `cdrBitmapShape` ではない。
- 埋め込み(Embedded)なのか、リンク(Linked)なのか。
- リンクが切れている場合、`Bitmap.FileName`は空を返すのか、古いキャッシュパスを返すのか。
- `Layer`のロック状態や、`MasterPage`内のアセットを無視していないか。
これらをロジカルに解決し、ファイルシステム上の整合性を保証するコードを実装する。
—
実装の核:堅牢なアセットコレクター
このスクリプトは、ドキュメント内の全画像オブジェクトを走査し、リンク情報を取得。存在確認を行った上で、指定のバックアップフォルダへコピーする。
‘ CorelDRAW Asset Harvester
‘ 依存関係を物理的に切り離し、安全なパッケージングを実現する
Option Explicit
Sub ExportAllLinkedImages()
Dim doc As Document
Dim shp As Shape
Dim bmp As Bitmap
Dim targetDir As String
Dim fso As Object
Dim fileName As String
Set doc = ActiveDocument
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ バックアップ先をドキュメントと同じ階層の “Assets_Backup” に設定
targetDir = doc.FilePath & “Assets_Backup\”
If Not fso.FolderExists(targetDir) Then fso.CreateFolder (targetDir)
‘ 全レイヤーを走査するため、ActivePageに限定せずドキュメント全体のShapeを走査
For Each shp In doc.ActivePage.Shapes.FindShapes(Type:=cdrBitmapShape)
Set bmp = shp.Bitmap
‘ リンクされている画像のみを対象とする
If bmp.IsLinked Then
fileName = GetFileNameFromPath(bmp.FileName)
‘ パス切れを考慮し、ファイル存在チェック
If fso.FileExists(bmp.FileName) Then
fso.CopyFile bmp.FileName, targetDir & fileName, True
Debug.Print “Success: ” & fileName
Else
‘ リンクが切れている場合は警告ログを残す(ここをログ出力に変えるのがプロの流儀)
MsgBox “警告: パス切れを検知しました – ” & bmp.FileName, vbCritical
End If
End If
Next shp
MsgBox “アセットの収集が完了しました。”, vbInformation
End Sub
‘ パスからファイル名のみを抽出するヘルパー
Private Function GetFileNameFromPath(path As String) As String
Dim parts() As String
parts = Split(path, “\”)
GetFileNameFromPath = parts(UBound(parts))
End Function
—
アーキテクトの視点:このコードを「プロダクション」で使うための心得
コードを動かすだけで満足してはいけない。現場で「壊れない」ツールにするために、以下の3点を意識せよ。
1. パスと文字コードの罠
`bmp.FileName`は、日本語環境や長すぎるパスにおいて予期せぬ挙動をすることがある。特にサーバー上の共有フォルダを参照している場合、UNCパス(`\\server\share\…`)へのアクセス権限不足でスクリプトが停止しないよう、`On Error Resume Next`を適切に活用し、エラーハンドリングを実装すべきだ。
2. オブジェクトのライフサイクル
`shp.Bitmap` を取得する際、その形状が`PowerClip`の中に埋め込まれていないかを確認する必要がある。`FindShapes`メソッドは非常に強力だが、複雑なネスト構造では再帰的に探索する設計(Recursive search)が必要になるケースが多い。
3. パフォーマンスの最適化
もしドキュメントが数千個のオブジェクトを持つ場合、`For Each`ループは重くなる。その場合は、`ShapeRange`のフィルタリングをさらに厳密に行い、`Optimization = True`を宣言して再描画を抑制することで、処理速度を劇的に向上させることが可能だ。
—
次なるステップへ
このコードは、自動化の「第一歩」に過ぎない。
次に目指すべきは、「収集したアセットとドキュメントの相対パスを書き換える機能」だ。これにより、プロジェクトフォルダをどこに移動しても、リンク切れが二度と発生しない「自己完結型パッケージ」が完成する。
CorelDRAW VBAは、単なるマクロ言語ではない。適切に設計すれば、デザイン業務そのものを「コードで制御可能なシステム」へと昇華できる。君の業務効率化は、ここから始まる。
さあ、コードを書いて、退屈な作業を過去のものにしよう。
