CorelDRAW VBAを掌握せよ:リンク画像を「一撃」で収集するプロの自動化術
こんにちは。CorelDRAWの自動化の世界へようこそ。
「マクロの記録」ボタンを押して生成された、冗長で脆いコードに頼るのは今日で終わりにしましょう。
CorelDRAW VBAは、正しく扱えば強力な武器になります。今回は、デザイナーの頭痛の種である「リンク切れ」を撲滅する、実用的な画像収集スクリプトを構築します。このコードを書く過程で、あなたはCorelDRAWのオブジェクトモデルの深淵を覗くことになります。
—
なぜ「リンク」はトラブルの元なのか?
CorelDRAWで配置された画像(ビットマップ)には、大きく分けて2つの状態があります。
1. 埋め込み(Embedded): ファイルの一部として保存される。
2. リンク(Linked): 外部ファイルを参照している。
入稿データを作るとき、リンク先が移動していたり、サーバー上のパスが切れていたりすると、印刷所で悲劇が起こります。このスクリプトは、ドキュメント内の全外部参照を特定し、指定したフォルダへ「安全なコピー」を作成する、まさに現場の救世主です。
—
プロの設計図:コードの全体像
まずは、コードを読み解くための「心構え」です。CorelDRAWの`Layer`や`Shape`を辿り、その中から「ビットマップ」かつ「外部リンク」であるオブジェクトを抽出します。
‘ ———————————————————
‘ リンク画像一括収集スクリプト
‘ ———————————————————
Sub CollectLinkedImages()
Dim doc As Document
Dim shp As Shape
Dim fso As Object
Dim exportFolder As String
Dim sourcePath As String
Dim fileName As String
‘ 1. 現在のアクティブドキュメントを取得
Set doc = ActiveDocument
If doc Is Nothing Then Exit Sub
‘ 2. 収集先フォルダの設定(デスクトップの”CollectedImages”フォルダ)
exportFolder = Environ(“USERPROFILE”) & “\Desktop\CollectedImages\”
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ フォルダがなければ作成
If Not fso.FolderExists(exportFolder) Then fso.CreateFolder (exportFolder)
‘ 3. ドキュメント内の全ページ・全レイヤーを走査
‘ CorelDRAWのオブジェクトモデルは階層構造であるため、
‘ 全てのShapeを再帰的に探す必要があります。
ProcessShapes doc.ActivePage.Shapes, fso, exportFolder
MsgBox “画像の収集が完了しました!”, vbInformation
End Sub
‘ 再帰的にShapeを走査するプロシージャ
Private Sub ProcessShapes(shapes As shapes, fso As Object, targetDir As String)
Dim shp As Shape
For Each shp In shapes
‘ グループ化されている場合、中身を再帰的にチェック
If shp.Type = cdrGroupShape Then
ProcessShapes shp.Shapes, fso, targetDir
‘ ビットマップかつリンクされているか判定
ElseIf shp.Type = cdrBitmapShape Then
If shp.Bitmap.Linked Then
‘ リンク元のパスを取得
Dim sourcePath As String
sourcePath = shp.Bitmap.FileName
‘ ファイルコピーの実行
If fso.FileExists(sourcePath) Then
fso.CopyFile sourcePath, targetDir & fso.GetFileName(sourcePath), True
End If
End If
End If
Next shp
End Sub
—
ここを理解すれば脱・初心者:コードの解説
1. オブジェクトの「再帰的走査」
CorelDRAWのデータ構造は「マトリョーシカ」です。`Page`の中に`Layer`があり、その中に`Shape`があり、さらに`Group`の中にまた`Shape`がある……。
この構造を攻略するには、上のコードのように「自分自身を呼び出す関数(再帰関数)」を使うのがスマートです。これができれば、どんな複雑なデザインデータでも解析可能です。
2. `Shape.Type`によるフィルタリング
全てのオブジェクトを闇雲に処理してはいけません。`cdrBitmapShape`という定数を使って「ビットマップだけを抽出」し、さらに`.Linked`プロパティで「リンクされているか」を確認する。この論理的なフィルタリングが、バグを防ぐ鍵です。
3. `Scripting.FileSystemObject` の活用
CorelDRAWの機能だけで完結させようとせず、Windowsのファイルシステム管理機能(FSO)を呼び出すのが、真のエンジニアの選択です。これにより、ファイルの存在チェックやコピーが驚くほど簡潔になります。
—
よくある落とし穴:初心者がハマるポイント
- パスの文字化け・特殊文字: リンク先のファイル名に日本語が含まれていると、環境によってはパスの解決に失敗することがあります。FSOを使うのは、パス処理の安定性を確保するためでもあります。
- 埋め込み画像との混同: `shp.Bitmap.Linked`をチェックせずにコピーしようとすると、埋め込み画像(リンク元ファイルが存在しない)でエラーになります。必ずチェックを入れましょう。
- 処理の重さ: 数千個のオブジェクトがあるデータでは、処理時間がかかります。まずは小さなファイルでテストし、進捗を表示する工夫(`Application.ProcessMessages`)を検討するのも良いでしょう。
—
さあ、次はあなたの番です
このコードは、そのまま業務で使える「骨組み」です。
例えば、「収集した画像をPDF化する」「リンク切れしていたらログファイルに記録する」といった機能を追加すれば、それはもう立派な社内ツールです。
CorelDRAW VBAは、あなたの「退屈な手作業」を「知的生産」に変えるための最高のエディタです。まずはこのコードをコピーして、手元のデータで実行してみてください。画面の向こうでオブジェクトが動くその瞬間、あなたはもう自動化の入り口に立っています。
分からないことがあれば、またいつでも聞きに来てください。最高のツールを一緒に作り上げましょう。
