こんにちは。CorelDRAWの自動化の世界へようこそ。
マクロの記録ボタンを押して生成されるコードは、いわば「初心者の足跡」です。あれは便利ですが、実務で使うには少しばかり「無防備」すぎます。特に、レイヤーの状態(表示・非表示、ロック)を無視して全オブジェクトを走査するコードは、意図しない破壊を引き起こす爆弾のようなものです。
今日は、CorelDRAWのオブジェクトモデルを支配し、「触るべきものだけを、最速で選別する」ための、現場で磨き上げられた極意を伝授します。
—
1. なぜ「全走査」が危険なのか?
CorelDRAW VBAでよく見かけるのが、`ActivePage.Shapes.All` を使ったループです。しかし、これには重大な罠があります。
- ロックされたレイヤー: 編集しようとするとエラーが発生し、処理が停止する。
- 非表示レイヤー: ユーザーが見ていない場所を書き換えてしまい、後から修正が不可能になる。
これらを防ぐには、`If`文で条件分岐させる前に、「レイヤーというコンテナの特性」を理解する必要があります。
—
2. 賢いエンジニアのフィルタリング技法
CorelDRAWのオブジェクトモデルにおいて、`Layer`オブジェクトは`Visible`(表示状態)と`Locked`(編集可否)というフラグを持っています。これをチェックし、ループの冒頭で「門前払い」するのが鉄則です。
実践的なコード例:安全かつ高速な走査
以下のコードは、ドキュメント内のすべてのレイヤーを巡回し、編集可能なものだけを抽出するテンプレートです。
Sub ProcessEditableShapes()
Dim doc As Document
Dim lyr As Layer
Dim shp As Shape
Set doc = ActiveDocument
‘ ドキュメント内の全ページ・全レイヤーを走査
For Each lyr In doc.ActivePage.Layers
‘ 【極意1】レイヤーの属性をチェックしてスキップする
‘ 非表示、またはロックされているレイヤーは無視する
If lyr.Visible = False Or lyr.Locked = True Then
GoTo NextLayer ‘ 次のレイヤーへジャンプ
End If
‘ 【極意2】そのレイヤー内のシェイプを走査
For Each shp In lyr.Shapes
‘ ここで処理を行う
‘ 例: オブジェクトのサイズを調整する、色を変える等
Debug.Print “処理対象: ” & shp.Name
Next shp
NextLayer:
Next lyr
MsgBox “処理が完了しました。”
End Sub
—
3. なぜこの書き方が「最強」なのか?
このコードには、伝説的な自動化エンジニアが好む3つのポイントが隠されています。
① `GoTo` を使った早期リターン(ガード節)
`If`文で深くネスト(入れ子)にするのではなく、条件に合致しない場合は即座に `NextLayer` ラベルへ飛ばす。これにより、コードのインデントが浅く保たれ、可読性が格段に上がります。
② 不必要なオブジェクト生成を避ける
`ActivePage.Shapes.All` を使うと、メモリ上に一時的なシェイプの集合体が生成されます。一方、`lyr.Shapes` を直接参照するこの手法は、メモリ消費が少なく、非常に高速です。
③ 「安全圏」の明確化
このコードを使えば、「ロックされているレイヤーを誤って編集してエラーで落ちる」という事故を100%防げます。自動化の目的は「速くすること」以上に「壊さないこと」にあります。
—
4. 陥りやすいエラーと対策
初学者がよくやるミスに、「処理中にシェイプを削除・作成してループが壊れる」というものがあります。
- エラーの正体: ループしている途中でオブジェクトの数が変わると、次に進むべきメモリの場所がずれてしまい、CorelDRAWがクラッシュします。
- 解決策: オブジェクトを削除・作成する場合は、`For Each` ではなく、後ろから前へ走査する `For i = count To 1 Step -1` の形式を使ってください。
—
最後に:自動化は「対話」である
CorelDRAWのAPIは、あなたの意図を忠実に実行します。しかし、あなたがレイヤーの状態を無視すれば、APIもまた無慈悲にレイヤーを破壊します。
「非表示レイヤーは触らない」「ロックレイヤーは守る」。この当たり前の礼儀を通すだけで、あなたのマクロはただの「記録」から、現場で信頼される「ツール」へと昇華します。
ここをクリアしたあなたなら、もうマクロの記録ボタンに頼る必要はありません。自信を持って、次の自動化のステップへ進んでください。応援しています!
