【実務効率化】「消したはずなのに重い」を卒業する。非表示レイヤーの残存オブジェクトを根こそぎ一掃する極限のクリーンアップ術
「ファイル容量がなぜか異常に重い……」
「PDFに書き出したとき、意図しない場所にゴミが混じる……」
CorelDRAWで制作業務に携わる皆さんは、一度はこのような「見えない敵」に遭遇したことがあるのではないでしょうか。
実は、CorelDRAWの画面上では見えていなくても、「非表示(Hidden)設定にされたレイヤー」の中には、膨大な描画データが生き続けていることがあります。 マクロの記録機能(レコーディング)を使っているだけでは、この「見えないレイヤー」に触れることはできません。なぜなら、レコーディングは「今、目に見えている操作」しか記録しないからです。
今日は、マクロの記録から一歩踏み出し、CorelDRAWの内部構造(オブジェクトの階層)を理解することで、ファイル内の「隠れたゴミ」を自動で一掃する、プロフェッショナルなクリーンアップVBAをマスターしましょう。
ここをクリアすれば、CorelDRAW VBAの基本はバッチリですよ。
1. 思考の準備:CorelDRAWの「階層構造」を理解する
コードを書く前に、最も重要な「地図」を手に入れましょう。CorelDRAWのデータは、マトリョーシカのような入れ子構造(階層構造)になっています。
1. Application(CorelDRAW本体)
2. ┗ Document(開いているファイル)
3. ┗ Page(ページ)
4. ┗ Layer(レイヤー)
5. ┗ Shape(図形・オブジェクト)
私たちが今回行いたいのは、「すべてのPageを巡回し、その中のすべてのLayerを確認し、もしそのLayerが『非表示』だったら、中にあるすべてのShapeを削除する」というミッションです。
この「階層を一段ずつ降りていく」という考え方が、自動化エンジニアにとっての基礎中の基礎となります。
2. 実践:非表示レイヤー一掃スクリプト
それでは、実際のコードを見ていきましょう。初心者の方でも迷わないよう、丁寧にコメントを添えています。
Option Explicit
''' <summary>
''' 全ページをスキャンし、非表示レイヤー内のオブジェクトを完全に削除する
''' </summary>
Sub DeepCleanupHiddenLayers()
Dim pg As Page ' ページ用変数
Dim lyr As Layer ' レイヤー用変数
Dim sh As Shape ' 図形用変数
Dim i As Long ' ループ用カウンタ
Dim j As Long ' ループ用カウンタ
Dim deletedCount As Long ' 削除したオブジェクト数カウント
' --- プロのテクニック 1: 高速化設定 ---
' 画面の描画更新を一時停止することで、処理速度を劇的に向上させます。
' これを忘れると、処理中に画面がチカチカして非常に遅くなります。
Optimization = True
EventsEnabled = False ' イベント発生を抑制
deletedCount = 0
On Error GoTo ErrorHandler ' エラーが起きた時のための保険
' 1. すべてのページを順番に見ていく
For Each pg In ActiveDocument.Pages
' 2. そのページ内のすべてのレイヤーを順番に見ていく
' 【重要】削除を行う場合は、後ろの番号から数える(Step -1)のが鉄則です!
For i = pg.Layers.Count To 1 Step -1
Set lyr = pg.Layers(i)
' 3. もしレイヤーが「非表示」だったら
If lyr.Visible = False Then
' 4. そのレイヤー内のオブジェクトをすべて削除する
' ここでも、後ろからループさせることで「インデックスのズレ」を防ぎます。
For j = lyr.Shapes.Count To 1 Step -1
Set sh = lyr.Shapes(j)
sh.Delete
deletedCount = deletedCount + 1
Next j
End If
Next i
Next pg
' --- プロのテクニック 2: 設定の復元 ---
' 処理が終わったら、必ず設定を元に戻します。
Optimization = False
EventsEnabled = True
Application.Refresh ' 画面を再描画
MsgBox "クリーンアップ完了!" & vbCrLf & _
"削除したオブジェクト数: " & deletedCount & " 個", vbInformation, "完了"
Exit Sub
ErrorHandler:
' エラーが起きた場合も、設定を元に戻してからメッセージを出す
Optimization = False
EventsEnabled = True
MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "エラー"
End Sub
3. ここが分かれ道!エンジニアが陥る「2つの罠」
このコードには、初学者が必ずと言っていいほど躓く「極限の知見」が2つ隠されています。
罠その1:ループの方向(Step -1 の重要性)
ここが、プロとアマチュアの最大の境界線です。
通常、リストを処理するときは `1 To Count`(前から順番)と書きたくなります。しかし、「要素を削除する」とき、前から処理してはいけません。
- なぜか?
例えば、3つのオブジェクト(A, B, C)があるとします。
1. `i = 1` のとき、Aを削除します。
2. すると、残ったのは B と C ですが、Bが自動的に「1番目」に繰り上がります。
3. 次のループ `i = 2` に進むと、プログラムは「2番目」を見に行きます。しかし、今の2番目はCです。
4. 結果として、Bがスキップされてしまうのです。
これを防ぐために、`For i = Count To 1 Step -1` と書き、「後ろから順番に消していく」のが、オブジェクトのライフサイクルを制御する上での鉄則です。
罠その2:Optimization(最適化)の魔法
コードの冒頭にある `Optimization = True`。これは単なる「おまじない」ではありません。
CorelDRAWは、VBAで何か操作をするたびに、「画面を書き換える」「再計算する」という膨大なコストを支払っています。非表示レイヤーの掃除のように、大量の削除を行う場合、この「画面更新」がボトルネックになります。
`Optimization = True` にすることで、メモリ内での計算だけに集中させ、最後にドカンと一気に画面を更新させる。これだけで、処理時間は数倍、時には数十倍変わります。
4. まとめ:次なるステップへ
今回のコードをマスターすれば、あなたはもう「見えないゴミ」に怯える必要はありません。
1. 階層構造(Page > Layer > Shape)を意識する
2. 削除のときは「後ろからループ(Step -1)」させる
3. 高速化のために「Optimization」を活用する
この3点は、CorelDRAW VBAに限らず、あらゆるオブジェクト操作の自動化において共通する「黄金律」です。
「マクロの記録」は、あくまで「操作の書き出し」に過ぎません。そこから一歩踏み出し、今回のように「構造を理解して、ロジックを組み立てる」。これができるようになれば、あなたの業務効率化は異次元のレベルへと到達します。
さあ、次はガイド線の自動配置や、複雑なレイヤー管理に挑戦してみましょう。応援していますよ!
