【入門編】【初心者向け】複数ある選択シェイプの重なり順(Zオーダー)をVBAで一発整理する自動整列テクニック – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して動かしてみたものの、「なんだかコードが長すぎる」「狙った通りにオブジェクトを操作できない」とモヤモヤしていませんか?

今回は、ベクターデザインの現場で最も頻繁に行う作業の一つ「重なり順(Zオーダー)の整理」をテーマに、CorelDRAW VBAの核心に迫ります。ここをクリアすれば、あなたのVBAスキルはマクロの記録レベルを完全に卒業し、現場で頼られる自動化の第一歩を踏み出せますよ。

なぜ、Zオーダーの制御でつまずくのか?

CorelDRAWの画面上でオブジェクトを見ていると、なんとなく「上下関係」が直感的に分かりますよね。でも、VBAの世界(プログラムの裏側)では、オブジェクトは「リスト(配列のようなもの)」として管理されています。

  • 最背面(インデックスの最初 / 1番目)
  • 最前面(インデックスの最後 / アクティブなドキュメントの数)

この「並び順(Zオーダー)」をプログラムから自由自在に操れるようになると、バラバラに散らばったパーツの重なり順をコンマ数秒で一発整理できるようになります。

現場で使える!基本のZオーダー操作メソッド

CorelDRAW VBAには、選択したシェイプの重なり順を変更するための強力なメソッドが用意されています。まずは、よく使う代表的なものを押さえましょう。

1. `shp.OrderToFront()` :選択したシェイプを最前面へ移動
2. `shp.OrderToBack()` :選択したシェイプを最背面へ移動
3. `shp.OrderForwardOf(OtherShp)` :特定のシェイプの1つ前面へ移動
4. `shp.OrderBackwardOf(OtherShp)` :特定のシェイプの1つ背面へ移動

これらを組み合わせることで、複雑なレイヤー構造も思い通りにコントロールできます。

【実践】選択中のシェイプの重なり順を綺麗に整列するマクロ

それでは、実務でそのまま使えるコードを見ていきましょう。
今回は、「画面上で複数のシェイプを選択した状態で実行すると、選択した順(または左から順など)に綺麗に重なり順を再構築する」という便利なマクロを作成します。

以下のコードをCorelDRAWのVBAエディタ(`Alt + F11`)に貼り付けてください。

Sub OrganizeSelectedShapesZOrder()
‘ エラーハンドリングの基本:オブジェクトが選択されていない場合の対策
If ActiveSelection.Shapes.Count = 0 Then
MsgBox “整理したいシェイプを複数選択してください。”, vbExclamation, “CorelDRAW 自動整列”
Exit Sub
End If

‘ 処理の高速化と画面ちらつき防止(プロの基本テクニック)
EventsEnabled = False
ActiveDocument.BeginCommandGroup “Zオーダー一括整理”

On Error GoTo ErrorHandler

Dim shp As Shape
Dim i As Long

‘ デバッグや確認用:現在選択されている数を取得
Dim totalShapes As Long
totalShapes = ActiveSelection.Shapes.Count

‘ 【ロジック】
‘ 選択されたシェイプを一度すべて「最背面」に集め、
‘ 選択された順序(あるいはループの順序)に合わせて「最前面へ移動」を繰り返すことで、
‘ 綺麗に意図した重なり順に再スタックします。

For i = 1 To totalShapes
Set shp = ActiveSelection.Shapes(i)

If i = 1 Then
‘ 1つ目は基準となるため、いったん全体の最背面へ
shp.OrderToBack
Else
‘ 2つ目以降は、直前のシェイプの前面へ配置していく
Dim targetShp As Shape
Set targetShp = ActiveSelection.Shapes(i – 1)
shp.OrderForwardOf targetShp
End If
Next i

‘ 正常終了時の処理
ActiveDocument.EndCommandGroup
EventsEnabled = True

MsgBox totalShapes & “個のシェイプの重なり順を綺麗に整理しました!”, vbInformation, “完了”
Exit Sub

ErrorHandler:
‘ 万が一エラーが起きたときの安全装置
ActiveDocument.EndCommandGroup
EventsEnabled = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub

コードの注目ポイント(プロの知見)

初心者のうちはただコードを動かすだけで精一杯ですが、次のステップに進むために、上記のコードに散りばめられた「プロのこだわり」を解説します。

1. `EventsEnabled = False` とコマンドグループ化

CorelDRAW VBAで大量のオブジェクトを操作すると、画面の再描画(プレビューの更新)が発生して処理が極端に遅くなります。
`EventsEnabled = False` で裏側のイベントを止めて高速化し、さらに `BeginCommandGroup` を使うことで、Ctrl + Z(元に戻す)を1回押すだけで、マクロ実行前の状態に一発で戻せるようになります。これは実務では必須の配慮です。

2. 安全なエラーハンドリング

「何も選択していない状態でマクロを実行した」「途中で予期せぬエラーが出た」という時、画面がフリーズしたり設定がおかしくなったりすると最悪です。`On Error GoTo` を使い、必ず後片付け(イベントの復元やコマンドグループの終了)を行ってから安全に終了する構造にしています。

陥りやすい罠とアドバイス

初心者がよくやってしまうミスとして、「選択範囲(`ActiveSelection`)の順番は、自分がクリックした順番通りとは限らない」という点があります。
CorelDRAWの内部では、オブジェクトが作成された元のZオーダーやIDに基づいて保持されているため、「画面上で左から順に並べ替えたい」といった場合は、一度位置情報(`Left` プロパティなど)でソートするアルゴリズムを挟む必要があります。

まずは今回の「選択された順にきれいにスタックし直す」基本コードを自分の環境で動かし、F8キーを押し下ろしながらステップ実行して、オブジェクトが1つずつ意図した通りに重なっていく様子を観察してみてください。

ここをクリアすれば、CorelDRAW VBAの「オブジェクトのライフサイクルと並びの概念」はもうバッチリです。日々の退屈な手作業をコードで自動化し、クリエイティブな時間をもっと増やしていきましょう!

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