こんにちは!CorelDRAWの自動化の世界へようこそ。
マクロの記録ボタンを押して操作を覚えさせる段階から、「自分の手でコードを書き、業務を劇的に効率化したい」と一歩踏み出したあなたへ。
今回は、実務で本当によくある「納品データ作成時のポカミス撲滅」をテーマにお話しします。
印刷入稿やクライアントへのデータ納品直前、「あれ?非表示にしておいた下描きレイヤーが残っていた!」「触られたくないからロックしたはずのゴミシェイプがデータに含まれていた!」なんて焦った経験はありませんか?
今回は、そんなアートボードの裏側に潜む「不要な非表示レイヤー」や「ロックされたシェイプ」を、VBAの力で一網打尽に検出・削除する基本ツールの作り方を解説します。
ここをクリアすれば、CorelDRAW VBAのオブジェクト操作の基本はバッチリですよ。一緒にマスターしていきましょう!
—
なぜ「ゴミ掃除マクロ」が必要なのか?
CorelDRAWでデザインを作っていると、レイヤーが増え、色々なオブジェクトが重なり合っていきます。
作業中には便利だった「非表示レイヤー」や「ロックされたガイドライン・パス」も、最終的な納品データにとっては不要どころか、印刷トラブルの原因になりかねない「ゴミ」です。
これを人間の目だけで確認しようとすると、何ページもあるドキュメントや複雑な階層構造の中で見落としが発生します。
だからこそ、「ドキュメントの構造をVBAにスキャンさせ、一瞬で掃除させる」という自動化の仕組みが、プロの現場では重宝されるのです。
—
CorelDRAW VBAにおける「レイヤーとシェイプ」の基本思想
コードを書く前に、CorelDRAWのオブジェクトモデル(DOM)の基本を頭に入れておきましょう。
- Document(ドキュメント):今開いているファイルそのもの。
- Layer(レイヤー):ドキュメントの中にある透明なシートの束。
- Shape(シェイプ):レイヤーの上に描かれた実際の図形や文字(パス、テキスト、ビットマップなど)。
これらはすべて「階層構造(ツリー構造)」を成しています。
つまり、VBAで掃除をするためには、「すべてのレイヤーを見て、非表示なら消す」「すべてのレイヤーの中にあるシェイプを見て、ロックされていたら解除して消す」という巡回(ループ)処理を行えばよいのです。
—
実装コード:一網打尽お掃除ツール
それでは、実際のVBAコードを見てみましょう。
CorelDRAWの「VBAエディタ(Alt + F11)」を開き、標準モジュールに以下のコードを貼り付けてください。
プログラミング初学者でも迷わないよう、一つひとつの動きをコメントで丁寧に解説しています。
Sub CleanUpDocument()
‘ —————————————————————-
‘ 目的: アクティブドキュメント内の非表示レイヤーとロックされたシェイプを削除する
‘ —————————————————————-
‘ エラーハンドリングの準備
On Error GoTo ErrorHandler
Dim doc As Document
Set doc = ActiveDocument
‘ ドキュメントが開かれていない場合は処理を中断
If doc Is Nothing Then
MsgBox “処理対象のドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If
Dim lyr As Layer
Dim sh As Shape
Dim deletedLayersCount As Integer
Dim unlockedShapesCount As Integer
deletedLayersCount = 0
unlockedShapesCount = 0
‘ 処理の高速化と画面チラつき防止
doc.BeginCommandGroup
ActiveWindow.Refresh = False
‘ —————————————————————-
‘ 1. 非表示レイヤーの削除処理
‘ —————————————————————-
‘ レイヤーは下から上に向かって削除するとインデックスのズレによるバグを防げます
Dim i As Long
For i = doc.Layers.Count To 1 Step -1
Set lyr = doc.Layers(i)
‘ デフォルトレイヤー(「レイヤー 1」や「ガイド」など)は削除対象外にする配慮
If Not lyr.IsLocked And lyr.Name <> “Layer 1” And lyr.Name <> “ガイド” Then
‘ 非表示(Visible = False)の場合、または特定の条件を満たす場合
If lyr.Visible = False Then
lyr.Delete
deletedLayersCount = deletedLayersCount + 1
End If
End If
Next i
‘ —————————————————————-
‘ 2. ロックされたシェイプの検出・削除処理
‘ —————————————————————-
‘ すべてのレイヤーを巡回
For Each lyr in doc.Layers
‘ レイヤー自体がロックされていない場合のみ内部のシェイプを走査
If Not lyr.IsLocked Then
Dim j As Long
For j = lyr.Shapes.Count To 1 Step -1
Set sh = lyr.Shapes(j)
‘ シェイプがロックされている場合
If sh.Static = True Or sh.Locked = True Then
‘ 必要に応じてロックを解除して削除
sh.Locked = False
sh.Delete
unlockedShapesCount = unlockedShapesCount + 1
End If
Next j
End If
Next lyr
‘ 画面描画の再開
ActiveWindow.Refresh = True
doc.EndCommandGroup
‘ 完了メッセージ
MsgBox “クリーンアップが完了しました!” & vbCrLf & _
“・削除した非表示レイヤー: ” & deletedLayersCount & “件” & vbCrLf & _
“・削除したロックシェイプ: ” & unlockedShapesCount & “件”, vbInformation, “掃除完了”
Exit Sub
ErrorHandler:
‘ 万が一エラーが起きた場合の安全装置
ActiveWindow.Refresh = True
doc.EndCommandGroup
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
—
初心者がハマりやすい「3つの罠」と対策
CorelDRAW VBAを書き始めると、多くの人が次のような壁にぶつかります。今回のコードでは、これらの罠をあらかじめクリアするように設計しています。
1. コレクションを上から順に消して「インデックスズレ」を起こす罠
VBAで複数のアイテム(レイヤーやシェイプなど)をループで削除するとき、上から順(`1 To Count`)に消していくと、リストの番号(インデックス)がズレてしまい、思わぬエラーや「消し残し」が発生します。
- 対策: 今回のコードのように、「後ろから前へ(`Count To 1 Step -1`)」ループを回すのが、CorelDRAW VBAにおける鉄則です。
2. 「ドキュメントに絶対必要なレイヤー」まで消してしまう罠
すべての非表示レイヤーを機械的に消すと、CorelDRAWが初期生成する「レイヤー 1」や「ガイド」といった、システム上消してはいけないレイヤーまで巻き込んでエラーになることがあります。
- 対策: コード内で `lyr.Name <> “Layer 1″` のように、保護すべき重要なレイヤー名を除外する条件を挟むことで、安全性を高めています。
3. 画面のチラつきと処理の重さ
数千個のシェイプがある複雑なデザインでマクロを走らせると、画面がピカピカと点滅し、処理完了までに時間がかかります。
- 対策: 処理の最初に `ActiveWindow.Refresh = False` で画面の描き直しをストップし、最後に `True` に戻すことで、爆発的な高速化を実現しています。
—
まとめ
今回は、CorelDRAW VBAを使って、不要な非表示レイヤーやロックされたシェイプを一網打尽にするお掃除ツールをご紹介しました。
- 「後ろから前へ」ループを回すこと
- システムに必要な基本レイヤーは保護すること
- 画面描画を制御してパフォーマンスを最適化すること
この3つは、今後あなたがより高度なCorelDRAW自動化ツールを開発する時にも必ず役立つ、強力な基礎知識です。
手作業での確認作業から解放され、クリエイティブで楽しい時間に集中するための一歩として、ぜひご自身の環境でも試してみてくださいね。それでは、次回の応用編でお会いしましょう!
