こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押すだけの自動化から一歩抜け出し、自分の手でドキュメントをコントロールしたいと思いませんか?
今回は、プログラミング初学者の方に向けて、実務でめちゃくちゃ役に立つ「アクティブページ内の全パスオブジェクトの頂点数(ノード数)をカウントしてレポートする監査ツール」を一緒に作っていきます。
ここをクリアすれば、CorelDRAW VBAのオブジェクト構造の基本はバッチリです。温かく丁寧に解説していきますので、リラックスしてついてきてくださいね!
—
なぜ「ノード数」を数える必要があるのか?
実務でCorelDRAWを使っていると、こんな壁にぶつかりませんか?
- 「外部からもらったCADデータやSVGが、細かすぎるノードの嵐で、カッティングプロッターが発狂しそうになった…」
- 「印刷用データのパスが複雑すぎて、RIP処理(ラスタライズ)でプリンタがフリーズした…」
これらはすべて、「パスの頂点数(ノード数)」が多すぎることが原因です。
人間の目で画面をズームして一つひとつ数えるのは不可能ですから、ここはVBA(Visual Basic for Applications)の賢い頭脳に一瞬で数えてもらいましょう。
—
開発の前に:CorelDRAW VBAの「世界観」を知ろう
コードを書く前に、CorelDRAWがドキュメントをどう管理しているか、その「階層構造」を頭に入れておきましょう。これさえ分かれば怖くありません。
[CorelDRAW アプリケーション (Application)]
┗ [アクティブドキュメント (ActiveDocument)]
┗ [アクティブページ (ActivePage)]
┗ [レイヤー (Layer)]
┗ [シェイプ (Shape) = パス、テキスト、ビットマップなど]
┗ [サブパス (SubPath) パスの場合]
┗ [ノード (Node) 頂点]
今回のツールでは、「アクティブページの中にあるすべてのシェイプを上から順に覗き見して、もしそれがパス(曲線)だったら、持っているノードの数を数える」という処理を行います。
—
実装コード:ノード数監査ツール
それでは、CorelDRAWのVBAエディタ(`Alt + F11` で開けます)に貼り付けて、そのまま動かせる実用コードを公開します。
標準モジュールに以下のコードを貼り付けてください。
Sub AuditPathNodes()
‘ =========================================================================
‘ ツール名: アクティブページ内パスオブジェクトのノード数監査ツール
‘ 概要: アクティブページ上のすべてのシェイプを走査し、
‘ パスオブジェクトのノード数をイミディエイトウィンドウに出力します。
‘ =========================================================================
‘ エラーハンドリングの基本(安全靴を履くようなものです)
On Error GoTo ErrorHandler
Dim sh As Shape
Dim totalNodes As Long
Dim pathCount As Long
Dim msg As String
‘ 初期化
totalNodes = 0
pathCount = 0
‘ ドキュメントが開かれているかチェック
If ActiveDocument Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbExclamation, “監査ツール”
Exit Sub
End If
‘ イミディエイトウィンドウの古いログをクリアする代わりの見出し
Debug.Print “==================================================”
Debug.Print ” 【ノード数監査レポート】 開始時刻: ” & Now
Debug.Print ” 対象ページ: ” & ActivePage.Name
Debug.Print “————————————————–”
‘ アクティブページ内の全シェイプをループ処理
For Each sh In ActivePage.Shapes
‘ シェイプが「カーブ(パス)」を持っているかチェック
‘ ※CorelDRAWでは、直線や曲線などのパスは “cdrCurveShape” という種類になります
If sh.Type = cdrCurveShape Then
pathCount = pathCount + 1
Dim n As Long
n = 0
‘ パス内のすべてのサブパスとノードをカウント
‘ (CorelDRAWのパスは複数のサブパスに分かれている場合があります)
Dim sp As SubPath
For Each sp In sh.Curve.SubPaths
n = n + sp.Nodes.Count
Next sp
‘ 累計に加算
totalNodes = totalNodes + n
‘ 個別のシェイプ情報をイミディエイトウィンドウに出力
Debug.Print ” ・パス名: ” & sh.Name & ” / ノード数: ” & n
End If
Next sh
‘ 監査結果のまとめを出力
Debug.Print “————————————————–”
Debug.Print ” 監査完了:”
Debug.Print ” 検出されたパスの数: ” & pathCount & ” 個”
Debug.Print ” 総ノード数 : ” & totalNodes & ” 個”
Debug.Print “==================================================”
‘ 完了をユーザーにお知らせ
MsgBox “監査が完了しました!” & vbCrLf & _
“検出パス数: ” & pathCount & “個” & vbCrLf & _
“総ノード数: ” & totalNodes & “個” & vbCrLf & _
“詳細はイミディエイトウィンドウをご確認ください。”, vbInformation, “監査完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
コードのポイント解説(ここが重要!)
初学者のあなたが「おっ」と思うポイントをいくつか解説しますね。
1. `For Each sh In ActivePage.Shapes`
これは「アクティブページにあるすべての図形を、上から順に一つずつ取り出して変数 `sh` に代入する」という、VBAにおける最も強力で美しいループ構文です。マクロの記録では選択している図形しか操作できませんが、これを使えばページ全体の図形を自動でしらみつぶしにチェックできます。
2. `If sh.Type = cdrCurveShape Then`
ここが肝心です。CorelDRAWのページには、文字(Text)、長方形(Rectangle)、ビットマップ(Bitmap)など、さまざまな種類のオブジェクトが存在します。
今回数えたいのは「パス(頂点を持つもの)」なので、オブジェクトの種類が `cdrCurveShape`(曲線・パスシェイプ)であるものだけを `If` 文でフィルタリングしています。これを忘れると、テキストや矩形を処理しようとしてエラーになります。
3. `Debug.Print`
画面にはポップアップを出さず、VBAエディタの下部にある「イミディエイトウィンドウ」に文字を書き出す命令です。処理が高速で、大量のデータをリスト化して確認したいときにエンジニアが好んで使うテクニックです。
(※イミディエイトウィンドウが表示されていないときは、VBAエディタのメニューから `表示` > `イミディエイト ウィンドウ` を選ぶか、`Ctrl + G` を押してください)
—
実際に動かしてみよう!
1. CorelDRAWを開き、適当なベクター線画や、文字を「曲線に変換(Ctrl + Q)」したオブジェクトをページ上にいくつか配置します。
2. `Alt + F11` を押してVBAエディタを開きます。
3. 標準モジュールを追加し、上記のコードを貼り付けます。
4. カーソルを `Sub AuditPathNodes()` の中に置いた状態で、上部の再生ボタン(▶)を押すか、`F5` キーを押します。
5. 処理が終わるとメッセージボックスが表示され、VBAエディタのイミディエイトウィンドウに次のようなレポートが出力されます!
==================================================
【ノード数監査レポート】 開始時刻: 202X/XX/XX 12:34:56
対象ページ: ページ 1
————————————————–
・パス名: カーブ 1 / ノード数: 154
・パス名: カーブ 2 / ノード数: 1280
————————————————–
監査完了:
検出されたパスの数: 2 個
総ノード数 : 1434 個
==================================================
「カーブ 2のノード数が1,280個もあるぞ! ここだけデータを間引こう(パスの単純化をしよう)」といった判断が、一目でできるようになりますね。
—
陥りやすいエラーと先輩からのアドバイス
最後に、初心者がハマりがちなポイントをいくつかシェアしておきます。
- 「グループ化された図形の中まで数えてくれない!」
- 今回のコードはシンプルにするため、ページ直下のシェイプだけを見ています。グループ(Group)の中にあるパスまで掘り下げるには「再帰処理(自分自身を呼び出す関数)」という少し高度なテクニックが必要になります。まずは今回のコードで単体パスの動きを掴んでみてください。
- 「曲線に変換していない文字オブジェクトで止まる?」
- テキストオブジェクトは `cdrTextShape` という別物扱いです。`If sh.Type = cdrCurveShape` で弾いているのでエラーにはなりませんが、「文字もパスとして数えたい!」という場合は、事前にすべて「曲線に変換(`ConvertToCurves`)」する処理を前段に挟む必要があります。
—
おわりに
お疲れ様でした!
今回作成した監査ツールは、一見シンプルですが、「オブジェクトの型を判定する」「プロパティの階層を辿ってデータを集計する」という、CorelDRAW VBAの最も本質的なスキルが詰まっています。
ここをクリアできれば、次は「ノード数が500個以上のパスを自動で赤色に変える」「自動でパスを単純化する」といった、さらなる高度な自動化への扉が開きます。
ぜひ自分の環境で動かしてみて、イミディエイトウィンドウに結果が出たときの感動を味わってください。あなたのCorelDRAWライフが、より快適でクリエイティブなものになりますように!
