CorelDRAWの「グループ地獄」を再帰関数で完全解体せよ:自動化エンジニアの極意
こんにちは。CorelDRAWの自動化の世界へようこそ。
現場で他ソフトから持ち込まれたデータを開いたとき、「グループの中にグループがあり、さらにその中にグループが……」という、いわゆる「グループ地獄」に遭遇して絶望したことはありませんか? 編集しようにも、階層が深すぎて目的のオブジェクトにたどり着けない。そんなストレスを抱えるのは今日で終わりにしましょう。
今回は、CorelDRAW VBAの真髄である「再帰関数(Recursive)」を使い、どんなに深くネストされた構造も一瞬でフラット化する、実用的なアーキテクチャを伝授します。
—
1. なぜ「再帰関数」が必要なのか?
初心者が陥りがちなのが、「`For Each` ループを回してグループを解除する」というアプローチです。しかし、グループを解除するとオブジェクトの順番が変わったり、ループのインデックスがズレて予期せぬエラー(あるいは無限ループ)を引き起こしたりします。
再帰関数は、「自分自身を呼び出す関数」です。
「グループを見つけたら、その中身を処理する関数をもう一度呼び出す」というロジックを組むことで、階層がどれだけ深くても、コンピュータが自動的に深部まで潜り込んで整理してくれます。
—
2. 実装コード:グループ構造の完全解体機
このコードを標準モジュールに貼り付けて実行してください。選択したオブジェクト内にあるすべてのグループを、再帰的に「バラバラ(フラット)」にします。
‘ 選択したオブジェクト内の全グループを再帰的に解除するメインプロシージャ
Public Sub FlattenGroupStructure()
Dim sr As ShapeRange
Set sr = ActiveSelectionRange
If sr.Count = 0 Then
MsgBox “対象となるオブジェクトを選択してください。”
Exit Sub
End If
‘ 再帰処理を開始
ProcessShapes sr
MsgBox “グループの解体とフラット化が完了しました。”
End Sub
‘ 再帰処理を行う核となる関数
Private Sub ProcessShapes(shapes As ShapeRange)
Dim s As Shape
Dim i As Long
‘ ループは「後ろから」回すのが鉄則
‘ グループ解除によってオブジェクトのインデックスが変わるのを防ぐため
For i = shapes.Count To 1 Step -1
Set s = shapes(i)
‘ もしシェイプがグループなら
If s.Type = cdrGroupShape Then
‘ 1. まず再帰:グループの中身をさらにチェック
ProcessShapes s.UngroupEx.Shapes
End If
Next i
End Sub
このコードの「プロのこだわり」
- `Step -1` の魔術: グループを解除すると、元のグループオブジェクトが消滅し、その中のシェイプがリストに追加されます。前から順に処理するとインデックスが狂いますが、後ろから処理することで、常に安定して全オブジェクトを走査できます。
- `UngroupEx` の採用: `Ungroup` メソッドよりも `UngroupEx` の方がメモリ管理や戻り値の扱いで安定しており、現代のCorelDRAW VBA開発におけるベストプラクティスです。
—
3. 初学者が陥りやすい罠と対策
① 「オブジェクトが消えた!」と焦る
再帰処理は強力です。実行前に必ずバックアップを取るか、`ActiveDocument.BeginCommandGroup “Flatten”` を使って、「元に戻す(Ctrl+Z)」で一発で戻れるようにしておくのが、プロのたしなみです。
② 無限ループの恐怖
もし「グループの中にグループが入っている」構造で、コードの書き方を間違えると、プログラムが永遠に終了しないことがあります。今回は「後ろから処理」することでこれを回避していますが、非常に複雑な連結図形などを扱う場合は、`DoEvents` を入れておくと、最悪の事態(ソフトのフリーズ)の際に手動で割り込めます。
—
4. この先へ進むために:さらなる自動化のヒント
ここをクリアしたあなたは、もう「マクロの記録」に頼る初心者ではありません。次に目指すべきは以下のステップです。
1. 属性の抽出: フラットにしたあと、特定の色や線幅を持つオブジェクトだけを自動選択して「別レイヤーへ移動」させる。
2. 命名規則の統一: グループ解除後、自動的に各シェイプに「名前(Nameプロパティ)」を付与し、後の管理を楽にする。
CorelDRAWのVBAは、単なる自動化ツールではありません。「デザインの構造をハックする魔法の杖」です。
複雑なものを分解し、再構築する。このエンジニアリングの喜びを、ぜひあなたの現場で体感してください。もしコードの挙動で詰まったら、いつでも戻ってきてくださいね。あなたの挑戦を応援しています。
