【入門編】【初心者向け】ActivePage.CustomNameを使ったページカスタム名の取得と動的変更の基本パターン – CorelDRAW VBA解析バイブル

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

「1番目のページ」は信じるな。CorelDRAW VBAでページ操作を劇的に安定させる『CustomName』活用術

こんにちは。自動化の深淵へようこそ。

CorelDRAWの「マクロの記録」ボタンを押して、生成されたコードを見て「ふむふむ、これで動くんだな」と納得したことはありませんか? もしそうなら、あなたは素晴らしい第一歩を踏み出しました。

しかし、エンジニアとして一歩先へ進むために、今ここで一つ、残酷な真実をお伝えしなければなりません。「マクロの記録」が吐き出すコードの多くは、実務の現場では「壊れやすいコード」なのです。

特に、ページの操作においてです。

今日は、初心者が必ずと言っていいほど陥る「ページ指定の罠」を回避し、プロフェッショナルが実践する`CustomName`(カスタム名)を用いた、堅牢でスマートなページ制御の極意を伝授しましょう。ここをクリアすれば、あなたのマクロは「たまたま動くもの」から「確実に動く道具」へと進化します。

1. なぜ `Pages(1)` ではいけないのか? 「インデックスの罠」

多くの初心者が書くコードは、おそらくこのような形をしています。

' ⚠️ 初心者が陥りがちな、壊れやすいコードの例
ActiveDocument.Pages(1).Activate
' 1番目のページに対して何か処理をする...

一見、何も問題はないように見えます。しかし、想像してみてください。
ユーザーが作業中に、ページの順番をドラッグ&ドロップで入れ替えたらどうなるでしょうか?

あなたが「ロゴのデザイン」を描こうと思って `Pages(1)` を指定したのに、ユーザーが「表紙」を一番前に持ってきた瞬間、あなたのマクロは「表紙」に対してロゴの処理を始めてしまうのです。

これを私たちは「インデックスの脆弱性」と呼びます。
「何番目か」という情報は、常に変動する不安定なものです。プロのエンジニアは、番号(Index)ではなく、「名前(Identity)」でオブジェクトを特定します。

2. `CustomName` という「唯一の識別子」

そこで登場するのが、`CustomName` プロパティです。
CorelDRAWの各ページには、ユーザーが自由に変更できる「カスタム名」が付与されています。これを使えば、ページがどこに移動しようとも、名前さえ合っていれば確実にそのページを捕まえることができます。

基本の「取得」と「変更」

まずは、基本中の基本。現在のページのカスタム名を取得し、新しい名前に書き換えるコードを見てみましょう。

Sub BasicPageNaming()
    Dim targetPage As Page
    
    ' 現在アクティブなページを変数に格納(これがオブジェクト操作の基本です)
    Set targetPage = ActivePage
    
    ' 1. 現在のカスタム名を取得してメッセージボックスで表示
    MsgBox "現在のページのカスタム名は 「" & targetPage.CustomName & "」 です。"
    
    ' 2. カスタム名を新しい名前に変更する
    ' ここでは例として「作業用ページ」という名前にします
    targetPage.CustomName = "作業用ページ"
    
    MsgBox "ページ名を 「" & targetPage.CustomName & "」 に変更しました。"
End Sub

【ここがポイント!】
`ActivePage.CustomName = “名前”` と直接書くこともできますが、上記のように一度 `Page` 型の変数(`targetPage`)に格納する癖をつけてください。これが「オブジェクトのライフサイクル」を意識した、美しいコードへの第一歩です。

3. 実践:特定の名前を持つページを自動で見つけ出す

さて、ここからが本番です。実務では「ページが何番目にあるか」なんて知りません。「『出力用』という名前のページを探して、そこに描画せよ」という命令が欲しいはずです。

そのための「プロのパターン」をコードにしました。

''' <summary>
''' 指定したカスタム名を持つページを検索し、見つかった場合はそのページをアクティブにする
''' </summary>
''' <param name="targetName">探したいページの名前</param>
''' <returns>見つかったページオブジェクト。見つからない場合は Nothing</returns>
Function FindPageByName(targetName As String) As Page
    Dim pg As Page
    
    ' ドキュメント内の全ページをループで確認していく
    ' インデックス(i)ではなく、For Eachを使うのがオブジェクト指向の流儀です
    For Each pg In ActiveDocument.Pages
        ' 名前が一致するか判定(大文字小文字を区別しない場合は UCase 等を併用)
        If pg.CustomName = targetName Then
            Set FindPageByName = pg
            Exit Function ' 見つかった瞬間に処理を抜ける(効率化!)
        End If
    Next pg
    
    ' 見つからなかった場合は Nothing を返す
    Set FindPageByName = Nothing
End Function

''' <summary>
''' 上記の関数を使ったメイン処理の例
''' </summary>
Sub MainProcess()
    Dim targetPg As Page
    Dim searchName As String
    
    searchName = "出力用" ' ← ここを探したい名前に変えるだけ!
    
    ' 関数を呼び出してページを探す
    Set targetPg = FindPageByName(searchName)
    
    ' エラーハンドリング:ページが見つからなかった場合の処理を必ず書く
    If targetPg Is Nothing Then
        MsgBox "エラー: 「" & searchName & "」 という名前のページが見つかりません。" & vbCrLf & _
               "ページの名前を確認するか、作成してください。", vbCritical
        Exit Sub
    End If
    
    ' ページが見つかった場合の処理
    targetPg.Activate
    MsgBox searchName & " ページを見つけました。ここに処理を開始します。"
    
    ' ここに実際の描画処理などを記述していく
End Sub

なぜこの書き方が「強い」のか?

1. `For Each` を使っている: `For i = 1 To Pages.Count` と書くよりも、オブジェクトそのものを直接扱うため、読みやすく、ミスが減ります。
2. 関数化(Function)している: 「ページを探す」という機能を独立させることで、他のマクロでも使い回せます(再利用性)。
3. `Nothing` チェックをしている: ここが最も重要です。もしページが見つからなかった時に、無理やり処理を続行しようとすると、VBAは「実行時エラー 91」でクラッシュします。「見つからなかったらどうするか」をあらかじめ設計しておくこと。 これが、ユーザーを迷わせないプロの仕事です。

4. 陥りやすい落とし穴:エンジニアの視点

最後に、私が現場で何度も見てきた「失敗パターン」を共有しておきます。

  • 名前の重複: CorelDRAWでは、実は同じ `CustomName` を持つページを複数作れてしまいます。もし同じ名前のページが2つあると、上記のコードでは「最初に見つかった方」しか処理しません。運用ルールとして「名前は必ずユニーク(唯一)にする」という鉄則をチーム内で共有しましょう。
  • 空の名前(空白): `CustomName` が空のページに対して検索をかけると、意図しない挙動になることがあります。マクロの冒頭で、必要なページに名前を付ける工程を自動化してしまうのも一つの手です。
  • 全角・半角の罠: `”Page1″` と `”Page1”` は別物です。文字列比較を行う際は、ユーザーが入力する可能性があるなら、全角半角の揺らぎを考慮する必要があります。

まとめ:次の一歩へ

いかがでしたか?

「何番目か」で制御するのではなく、「何という名前か」で制御する。
この視点を持つだけで、あなたの作る自動化ツールは、驚くほどタフで、信頼できるものに変わります。

マクロの記録から卒業し、オブジェクトの性質を理解し、構造化されたコードを書く。そのプロセスは少し大変かもしれませんが、その先には「自分が作った道具が、どんな環境でも完璧に動く」という、エンジニアにしか味わえない最高の快感が待っています。

さあ、次のコードを書きに行きましょう。応援していますよ!

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