【入門編】【初心者向け】アクティブドキュメントの全ページを順番に参照して各ページの用紙サイズ(幅と高さ)をログ出力する – CorelDRAW VBA解析バイブル

スポンサーリンク
スポンサーリンク

【脱・マクロ記録】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)の挙動に注意すること

これらをクリアすれば、次は「特定のサイズのページだけを削除する」や「全ページの背景色を一括変更する」といった、より高度な操作も自由自在です。

焦る必要はありません。一つずつ、コードの「意味」を噛み締めながら進んでいきましょう。応援していますよ!

タイトルとURLをコピーしました