【脱・マクロ記録】CorelDRAW VBAの「階層構造」を理解して、全ページのサイズを瞬時に把握する方法
こんにちは。CorelDRAW VBAの世界へようこそ。
「マクロの記録」ボタンを押して、自分の操作がコードに変換されるのを見て「おぉ、魔法みたいだ!」と感動したことはありませんか? 実は、そこが自動化エンジニアへの第一歩です。
しかし、マクロの記録には限界があります。記録されたコードは「特定の操作」をなぞるだけの、いわば「ビデオの再生」のようなもの。一方で、プログラミングとは「状況に応じて動きを変える、知的な命令」です。
今日、あなたが最初に取り組むミッションは、「ドキュメント内のすべてのページを巡回し、それぞれの用紙サイズをログに書き出す」というものです。
これができれば、あなたは「記録されたコードを修正する人」から、「ドキュメントの構造を支配する人」へと進化します。さあ、一緒にその扉を開けましょう。
1. 核心となる概念:CorelDRAWの「階層構造」を知る
コードを書く前に、もっとも重要な「地図」を頭に叩き込んでください。CorelDRAW VBAを扱う上で、このオブジェクトの階層(ヒエラルキー)を理解していないと、必ず迷子になります。
CorelDRAWの世界は、以下のような入れ子構造になっています。
1. Application(CorelDRAWというアプリケーション全体)
2. └ Document(今開いているファイル)
3. └ Pages(そのファイルに含まれる「ページたちの集合体」)
4. └ Page(個別の「1ページ」)
5. └ SizeWidth / SizeHeight(ページの幅と高さ)
「すべてのページを順番に見る」ということは、「Documentの中にあるPagesというリストを、一つずつPageとして取り出していく」という作業を意味します。
2. 実践:全ページのサイズをログ出力するコード
それでは、実際に動くコードを見てみましょう。以下のコードをVBAエディタに貼り付けて実行してみてください。
Option Explicit
''' <summary>
''' アクティブなドキュメント内の全ページを巡回し、
''' 各ページの幅と高さをイミディエイトウィンドウに表示する
''' </summary>
Sub LogAllPageSizes()
' --- 1. 変数の宣言(メモリの準備) ---
Dim doc As Document ' 操作対象のドキュメント
Dim pg As Page ' 巡回中の「現在のページ」を格納する変数
Dim pageWidth As Double ' 幅を一時保存
Dim pageHeight As Double ' 高さを一時保存
' --- 2. 対象の確定 ---
' 現在アクティブなドキュメントを変数にセットします
Set doc = ActiveDocument
' ドキュメントが開かれていない場合の安全策
If doc Is Nothing Then
MsgBox "ドキュメントが開かれていません。", vbExclamation
Exit Sub
End If
' ログの開始を知らせる
Debug.Print "--- ページサイズ取得開始 ---"
Debug.Print "対象ドキュメント: " & doc.FileName
' --- 3. ループ処理(ここがエンジニアの腕の見せ所) ---
' doc.Pages(ページの集合体)の中にある各要素を、一つずつ pg という名前で取り出します
For Each pg In doc.Pages
' ページのサイズを取得(単位はドキュメントの設定に依存します)
pageWidth = pg.SizeWidth
pageHeight = pg.SizeHeight
' --- 4. 結果の出力 ---
' イミディエイトウィンドウ(Ctrl + G で表示)に結果を出力します
' Format関数を使って、小数点第2位まで綺麗に表示しましょう
Debug.Print "Page " & pg.Index & ": " & _
Format(pageWidth, "0.00") & " x " & _
Format(pageHeight, "0.00")
Next pg ' 次のページへ移動
Debug.Print "--- 取得完了 ---"
' ユーザーへの完了通知(任意)
MsgBox "全ページのサイズ取得が完了しました。イミディエイトウィンドウを確認してください。", vbInformation
End Sub
3. コードの解剖:なぜこう書くのか?
このコードには、プロフェッショナルが必ず意識するポイントが詰まっています。
`For Each pg In doc.Pages` の魔法
ここが今回のハイライトです。`For i = 1 To 10` のような数字を使ったループ(Countベース)でも書けますが、`For Each` は「コレクション(集合体)の中身を、端から順番に全部処理する」という、VBAにおいて最もエレガントで安全な書き方です。ページの数がいくつあっても、この一行で全てを網羅できます。
`Debug.Print` という「目」
プログラムが裏側で何をしているか見えないと、不安になりますよね。`Debug.Print` は、プログラムの思考プロセスを「イミディエイトウィンドウ」という場所に書き出す命令です。開発中のエンジニアにとって、これは「プログラムの視界」そのものです。
4. 【重要】初心者が必ず陥る「単位の罠」
ここで、ベテランから一つアドバイスです。
上記のコードを実行したとき、出力された数値を見て「あれ? 思っていた数値と違うぞ?」と思ったことはありませんか?
実は、`pg.SizeWidth` が返す値は、「そのドキュメントの現在の表示単位(Document Unit)」に依存します。
- ドキュメントが「ミリメートル」設定なら、結果は `210.00`
- ドキュメントが「インチ」設定なら、結果は `8.27`
もし、ドキュメントの設定に関わらず、強制的に「ミリメートル」で取得したい場合は、以下のようにコードを書き換えるのがプロの仕事です。
' 単位を強制的にミリメートル(cdrMillimeter)に指定して取得するテクニック
pageWidth = pg.SizeWidth ' この値をそのまま使うのではなく、
' もしくは、取得前にドキュメントの単位を一時的に変更する手法もあります
もっとスマートな方法は、取得する際に「単位を指定して計算する」のではなく、「一時的にドキュメントの単位をミリメートルに固定してから取得する」ことです。
' 単位を一時的にミリメートルに設定
Dim originalUnit As cdrUnit
originalUnit = doc.Unit ' 元の単位を保存しておく(後で戻すため)
doc.Unit = cdrMillimeter ' 単位をミリに切り替え
' --- ここでループ処理を行う ---
doc.Unit = originalUnit ' 最後に元の単位に必ず戻す(これが紳士の嗜みです)
5. まとめ:次の一歩へ
おめでとうございます! あなたは今、単なる「記録されたマクロの利用者」から、「ドキュメントの構造をループで制御できる初級エンジニア」へとステップアップしました。
今回学んだことは、自動化の基礎中の基礎ですが、これこそが全ての巨大なシステムの土台となります。
- 階層構造を意識すること
- `For Each` で集合体を使いこなすこと
- 単位(Unit)の挙動に注意すること
これらをクリアすれば、次は「特定のサイズのページだけを削除する」や「全ページの背景色を一括変更する」といった、より高度な操作も自由自在です。
焦る必要はありません。一つずつ、コードの「意味」を噛み締めながら進んでいきましょう。応援していますよ!
