【入門編】【上級プロ向け】複雑なネスト構造を持つグループ化ShapeおよびPowerClipの再帰的走査と内部要素の置換処理 – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは。CorelDRAW VBAの世界へようこそ。
普段、マクロの記録機能を使って自動化の第一歩を踏み出している皆さんは、ある時「壁」にぶつかるはずです。

それは、「グループ化された図形の中身」や「PowerClip(パワークリップ)の中にある図形」に手が届かないという壁です。

マクロの記録では、あなたが画面上で行った「クリック」は記録できても、複雑に重なった構造の奥深くまで潜り込み、特定の条件に合う図形だけをスマートに書き換えるような「知的な処理」は苦手なのです。

今日は、その壁を軽々と飛び越え、CorelDRAWのオブジェクトモデルの深淵へと足を踏み入れるための「再帰的走査(さいきてきそうさ)」という魔法を伝授します。ここをマスターすれば、CorelDRAW VBAの基本、そして応用はバッチリですよ。

1. CorelDRAWの構造を「入れ子人形」として理解する

CorelDRAWのデータ構造は、ロシアの「マトリョーシカ(入れ子人形)」に似ています。

  • Application: CorelDRAWそのもの
  • Document: 開いているファイル
  • Page: ページ
  • Layer: レイヤー
  • Shape: 図形(ここが主役!)

しかし、図形(Shape)の中には、さらに図形を詰め込める特殊な箱があります。それが「グループ(Group)」「パワークリップ(PowerClip)」です。

通常の `For Each s In ActivePage.Shapes` というコードでは、一番上の表面に見えている図形しか触れません。箱の中身を見るには、「もし箱だったら、その中を開けてもう一度同じことをする」という処理が必要になります。これがプログラミングで言う「再帰(さいき)」の考え方です。

2. 【実践】深層まで潜るプロフェッショナル・コード

以下のコードは、ドキュメント内の全図形を調べ、それがグループであってもパワークリップであっても、その最深部にある「テキスト」や「色」を書き換えるためのテンプレートです。

このままコピペして、`ProcessIndividualShape` の中身を書き換えるだけで、あなたの業務に合わせた最強の自動化ツールになります。

Option Explicit

‘—————————————————————————————
‘ 処理の入り口:選択している図形、またはページ全体をスキャンする
‘—————————————————————————————
Public Sub StartDeepScan()
Dim s As Shape

‘ 最適化:画面更新を止めて処理速度を劇的に上げる
Optimization = True
EventsEnabled = False
On Error GoTo ErrorHandler

‘ 現在のページにあるすべての図形を一つずつチェック
‘ (ActiveSelection.Shapes に変えれば、選択範囲内だけを処理できます)
For Each s In ActivePage.Shapes
TraverseShape s
Next s

MsgBox “すべての置換処理が完了しました!”, vbInformation

CleanUp:
‘ 最適化を解除(これを忘れると画面が固まって見えます)
EventsEnabled = True
Optimization = False
Application.Refresh
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description
Resume CleanUp
End Sub

‘—————————————————————————————
‘ 再帰関数:図形の構造を解析し、中身があれば自分自身を呼び出す
‘—————————————————————————————
Private Sub TraverseShape(s As Shape)
‘ 1. まず、この図形自体に対して行いたい処理を実行
ProcessIndividualShape s

‘ 2. グループ化されている場合、その中の図形を一つずつ再帰的に走査
If s.Type = cdrGroupShape Then
Dim subShape As Shape
For Each subShape In s.Shapes
TraverseShape subShape ‘ 自分自身を呼び出す(再帰)
Next subShape
End If

‘ 3. パワークリップ(コンテナ)である場合、その内部を走査
‘ CorelDRAW特有の非常に重要なプロパティです
If Not s.PowerClip Is Nothing Then
Dim pcShape As Shape
For Each pcShape In s.PowerClip.Shapes
TraverseShape pcShape ‘ 自分自身を呼び出す(再帰)
Next pcShape
End If
End Sub

‘—————————————————————————————
‘ 個別の図形に対する具体的な処理(ここを自由に書き換えてください)
‘—————————————————————————————
Private Sub ProcessIndividualShape(s As Shape)
‘ 例1:テキストの内容を置換する
If s.Type = cdrTextShape Then
If InStr(s.Text.Contents, “旧会社名”) > 0 Then
s.Text.Contents = Replace(s.Text.Contents, “旧会社名”, “新会社名”)
End If
End If

‘ 例2:特定の色(例えば赤)を青に塗り替える
If s.Fill.Type = cdrFillUniform Then
If s.Fill.UniformColor.IsSame(CreateRGBColor(255, 0, 0)) Then
s.Fill.UniformColor.CopyAssign CreateRGBColor(0, 0, 255)
End If
End If
End Sub

3. このコードの「ここがプロの知恵」

① `Optimization = True` の魔法

CorelDRAW VBAで大量の図形を扱う際、一歩動くたびに画面を描画し直すと、処理時間が数十分かかることもあります。これを `True` にするだけで、一瞬で処理が終わるようになります。いわば「目隠しをして高速で作業を終わらせる」テクニックです。

② なぜ「再帰」が必要なのか?

例えば、「グループA > グループB > パワークリップ > テキスト」 という構造があったとします。
普通のループでは「グループA」を見た時点で終わってしまいます。
このコードは「グループA」を見つけたら「その中の子要素」を見に行き、さらに「グループB」を見つけたら「その中の孫要素」を見に行く……という動きを、構造が尽きるまで自動で繰り返します。

③ PowerClipの特殊性

CorelDRAWにおいて、PowerClipは単なる図形ではなく「コンテナ(容器)」です。`s.PowerClip Is Nothing` かどうかを判定することで、中身が存在するかどうかを安全に確認できます。ここを忘れると、エラーでマクロが止まってしまう原因になります。

4. 陥りやすいエラーと回避策

1. 「オブジェクトがありません」エラー:
図形を削除しながらループを回すと発生します。削除が必要な場合は、後ろから前に向かってループ(`For i = Shapes.Count To 1 Step -1`)するか、一旦削除対象を `ShapeRange` に集めてから一括削除するのが定石です。
2. 無限ループ:
通常、CorelDRAWの構造で無限ループは起きにくいですが、再帰関数の中で図形を新しく作り続けるような処理を書くと止まらなくなります。常に「既存の図形を調べる」ことに徹しましょう。
3. レイヤーのロック:
ロックされたレイヤーや非表示のレイヤーにある図形を編集しようとするとエラーになります。`s.Layer.Editable` や `s.Layer.Visible` をチェックするガード句を入れると、より堅牢なプログラムになります。

最後に

いかがでしたでしょうか?
「再帰処理」は、最初は頭がこんがらがるかもしれません。でも、この `TraverseShape` というテンプレートさえ手元にあれば、どんなに複雑なデザインデータが来ても、あなたは一瞬で中身を書き換えることができるようになります。

マクロの記録を卒業し、CorelDRAWの真の力を引き出すチーフアーキテクトへの第一歩。この「再帰的走査」をマスターすれば、もう怖いものはありません。

ぜひ、お手元のファイルで試してみてくださいね。応援しています!

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