こんにちは。CorelDRAWの自動化の世界へようこそ。
「マクロの記録」ボタンを押して生成されたコードを眺め、その冗長さに絶望したことはありませんか?あるいは、一括処理を走らせたら、触るべきではないガイドレイヤーまで変形させてしまい、慌てて「元に戻す(Ctrl+Z)」を連打した経験は?
CorelDRAW VBAにおいて、「操作対象を正しく選別すること」は、単なる機能ではなく、プロとしての必須スキルです。今日は、あなたのスクリプトを「おもちゃ」から「堅牢なツール」へと進化させる、フィルタリングの極意を伝授しましょう。
—
なぜ「全レイヤー操作」は危険なのか?
CorelDRAWのドキュメントは、多層構造のミルフィーユのようなものです。
しかし、VBAの `ActiveDocument.Pages(1).Layers` で全レイヤーをループさせると、以下の存在があなたの行く手を阻みます。
1. 非表示レイヤー: `Visible = False` なのに処理を加えてしまい、最後に表示させた瞬間に崩れたデータが現れる。
2. ロックレイヤー: 編集不可のはずなのに、VBAは強引にオブジェクトを操作しようとして「実行時エラー 1022(オブジェクトはロックされています)」を吐く。
3. ガイドレイヤー: 印刷されないはずのガイドが、一括処理によって移動・変形させられ、デザインの基準が狂う。
これらを「何も考えずに回す」のは、目隠しをして高速道路を走るようなものです。
—
現場で即戦力となる「除外フィルタ」の実装
では、どうすればいいのか。答えはシンプルです。ループの中に「ガード節」を置くことです。
以下は、ドキュメント内の全レイヤーを走査し、「表示かつロックされていない」レイヤーだけを処理するためのテンプレートコードです。
Sub SafeLayerProcessing()
Dim doc As Document
Dim lyr As Layer
Set doc = ActiveDocument
‘ 各ページ、各レイヤーを走査
For Each lyr In doc.ActivePage.Layers
‘ 【ここが重要:フィルタリングのガード節】
‘ 非表示、またはロックされているレイヤーは即座にスキップ
If lyr.Visible = False Or lyr.Locked = True Then
Debug.Print “スキップしました: ” & lyr.Name
GoTo NextLayer
End If
‘ ここから先は「触っても安全なレイヤー」だけが到達できる
‘ 例:レイヤー内の全オブジェクトの塗り色を赤にするなど
lyr.Shapes.All.Fill.UniformColor.RGBAssign 255, 0, 0
Debug.Print “処理完了: ” & lyr.Name
NextLayer:
Next lyr
MsgBox “安全なレイヤーのみの処理が完了しました。”, vbInformation
End Sub
コードの解説
- `If lyr.Visible = False Or lyr.Locked = True Then`: これが「門番」です。この条件に合致した瞬間に `GoTo NextLayer` でループの次のステップへ強制的に飛ばします。
- `GoTo` 文の是非: 通常、プログラミングにおいて `GoTo` は嫌われがちですが、CorelDRAW VBAのような深いネストになりやすい環境では、コードの可読性を保つための「脱出用ハッチ」として非常に有効です。
- `Debug.Print`: イミディエイトウィンドウに結果を出力します。画面を汚さずに処理状況を確認する、エンジニアの嗜みです。
—
初学者が陥りやすい「罠」
このフィルタリングをマスターしても、以下の2点には注意が必要です。
1. マスタレイヤーの存在
CorelDRAWには「マスタレイヤー」という特殊な層があります。`ActivePage.Layers` だけでは、全ページ共通のマスタレイヤーまで制御できない場合があります。より厳密に行うなら、`doc.MasterPage.Layers` も別途走査対象にする必要があります。
2. オブジェクトがグループ化されている場合
レイヤーは「表示かつロック解除」でも、その中の「特定のグループ」がロックされている場合があります。レイヤーレベルでのフィルタリングは基本ですが、複雑なドキュメントの場合は、個々のシェイプに対しても `If s.Locked = True Then …` というガード節を設ける慎重さが求められます。
—
最後に:プロフェッショナルへの道
「とりあえず動くコード」と「現場で信頼されるコード」の差は、こうした「異常系をどれだけ想定できているか」にあります。
- 「もし非表示レイヤーがあったら?」
- 「もしロックレイヤーがあったら?」
- 「もし空っぽのレイヤーだったら?」
これらを一つずつ条件分岐で塗りつぶしていく作業こそが、自動化エンジニアの醍醐味です。
さあ、あなたの書いたマクロにこの「門番」を組み込んでみてください。これまでエラーで止まっていたスクリプトが、まるでプロが書いたかのように静かに、そして確実に仕事をこなすようになるはずです。
ここをクリアすれば、あなたはもう脱・初心者です。次なるステージで、またお会いしましょう。
