【入門編】【実務効率化】ページ数が増えたドキュメントで特定テキストやオブジェクトを含むページを全自動検索 – CorelDRAW VBA解析バイブル

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

数百ページのカタログも怖くない。特定のパーツを瞬時に見つけ出す「ページ検索自動化」への招待

こんにちは。今日もCorelDRAWの海を、コードという羅針盤で航海していますか?

「マクロの記録」ボタンを押して、録画されたコードを眺める。そこから一歩踏み出し、「自分でロジックを組み立てたい」と思うようになったあなた。おめでとうございます。あなたは今、単なる「操作の自動化」から、真の「業務プロセス設計」へと足を踏み入れました。

今日扱うテーマは、実務で最も「痒いところに手が届く」機能の一つです。
「数百ページあるカタログの中から、特定の型番やパーツ名が含まれるページを自動で探し出し、そのページへ瞬時にジャンプする」

分厚いドキュメントをスクロールして、目視で探す……そんな時間は今日で終わりにしましょう。

1. 基礎知識:CorelDRAWの「階層構造」を理解する

コードを書く前に、まずはCorelDRAWが世界をどう見ているか(オブジェクトモデル)を理解しましょう。ここを曖昧にすると、必ずエラーの迷宮に迷い込みます。

CorelDRAWの構造は、よく「マンション」に例えられます。

1. Application(マンション全体)
2. Document(一棟の建物)
3. Page(各部屋)
4. Layer(部屋の中の棚)
5. Shape(棚に置かれた個々の荷物:テキスト、図形、画像など)

私たちがやりたいことは、「マンションの全部屋(Page)を巡回し、各部屋の荷物(Shape)の中に、特定のラベル(Text)が付いたものがないか調べる」というミッションです。

2. 実践:ターゲットを射抜く検索マクロ

それでは、実際に動くコードを見ていきましょう。プログラミング初学者の方でも読みやすいよう、細部まで丁寧にコメントを添えました。

このコードは、「指定した文字列が含まれるテキストを持つオブジェクト」を探し、見つかったらそのページを表示します。

Option Explicit

' ============================================================
' プログラム名: SearchTextAndJump
' 概要: ドキュメント内を検索し、特定のテキストを含むページへ移動する
' ============================================================
Sub SearchTextAndJump()
    Dim targetText As String
    Dim pg As Page
    Dim s As Shape
    Dim foundCount As Integer
    Dim foundPages As String
    
    ' --- 1. 検索したいキーワードを設定 ---
    ' 本来はInputBoxなどでユーザーに入力させますが、今回は固定にします
    targetText = InputBox("検索したいテキストを入力してください", "クイック検索")
    
    ' キャンセルされた場合は終了
    If targetText = "" Then Exit Sub
    
    ' 高速化のための魔法:画面更新を一時停止
    ' これをしないと、検索中に画面がチカチカして非常に重くなります
    Optimization = True
    
    foundCount = 0
    foundPages = ""
    
    ' --- 2. 全ページをループで巡回 ---
    For Each pg In ActiveDocument.Pages
        
        ' 各ページ内のすべてのシェイプ(オブジェクト)をチェック
        ' ※階層が深い場合は、さらにレイヤーを辿る必要がありますが、
        ' 基本的な構造なら ShapeRange で一括取得できます
        For Each s In pg.Shapes
            
            ' 【重要】そのオブジェクトが「テキスト」を持っているか判定
            ' テキスト以外のオブジェクト(ただの四角形など)に
            ' Textプロパティを触ろうとするとエラーで止まってしまいます
            If s.Type = cdrTextShape Then
                
                ' テキストの内容に、検索キーワードが含まれているか(大文字小文字を区別しない)
                If InStr(1, s.Text.Story.Text, targetText, vbTextCompare) > 0 Then
                    
                    ' 見つかった場合
                    foundCount = foundCount + 1
                    foundPages = foundPages & pg.Index & "ページ, "
                    
                    ' 見つかった瞬間にそのページへジャンプ!
                    ActiveWindow.ActivePage = pg
                    
                    ' 見つかったオブジェクトを少し強調(選択状態にする)
                    s.CreateSelection
                    
                    ' 検索結果を一度表示して、次の検索へ進むか確認させる
                    ' (一気に最後まで探したい場合は、このMsgBoxの部分を調整します)
                    MsgBox pg.Index & "ページで見つかりました!" & vbCrLf & _
                           "次のページも探しますか?", vbYesNo, "発見"
                    
                    If MsgBox("次の検索を続けますか?", vbYesNo) = vbNo Then
                        GoTo CleanUp
                    Else
                        ' 見つかったらそのページのループを抜けて、次のページへ
                        Exit For 
                    End If
                    
                End If
            End If
        Next s
    Next pg

    ' --- 3. 結果の報告 ---
    If foundCount = 0 Then
        MsgBox "指定されたテキストは見つかりませんでした。", vbInformation
    Else
        MsgBox "検索完了!" & vbCrLf & "見つかったページ: " & foundPages, vbInformation
    End If

CleanUp:
    ' 画面更新を元に戻す(これをお忘れなく!)
    Optimization = False
    ActiveWindow.Refresh
End Sub

3. ここがプロの視点!陥りやすい罠と回避術

コードをただコピーするだけでなく、なぜこう書いているのかを理解することが「脱・初心者」への近道です。

① `Optimization = True` の重み

大規模なドキュメントでループ処理を行う際、CorelDRAWは「描画」をしようとします。ページを切り替えるたびに画面を描き直すと、処理速度は劇的に低下します。`Optimization` を使うことで、「裏側で黙々と計算だけして、最後に結果だけ見せる」という動きが可能になります。これは、プロの自動化エンジニアが必ず使うテクニックです。

② 「型」をチェックしないとクラッシュする

初心者が最も陥りやすいエラーがこれです。
`s.Text.Story.Text` という命令は、「そのオブジェクトがテキストであること」を前提としています。もし、ただの「円」に対してこの命令を投げると、VBAは「円にテキストなんて無いよ!」と怒って停止してしまいます。
`If s.Type = cdrTextShape Then` という一文は、いわば「安全確認」です。

③ `InStr` 関数の賢い使い方

`s.Text.Story.Text = targetText` と書いてしまうと、「完全に一致する場合」しか見つかりません。「型番ABC」を探している時に、オブジェクトに「型番ABC-2023」と書いてあったら無視されてしまいます。
`InStr` 関数を使うことで、「部分一致」での検索が可能になります。

4. 次のステップへ:さらに高度な自動化を目指すなら

このマクロをマスターしたら、次はこんな改造に挑戦してみてください。

  • 「名前」で検索する: テキストの内容ではなく、オブジェクトに設定した「名前(Nameプロパティ)」で検索するように変えてみる。
  • 結果をリスト化する: 見つかったページ番号を、新しいドキュメントに一覧表として書き出す。
  • 色で検索する: 「特定の色のパーツが含まれるページ」を抽出する。

おわりに

CorelDRAW VBAの世界は、一度その仕組み(オブジェクトモデル)を理解してしまえば、あなたの強力な武器になります。手作業で1時間かかっていた作業を、1秒のコードに変える快感。それを味わうたびに、あなたのエンジニアとしての視座は高まっていくはずです。

「ここが上手くいかない」「もっとこうしたい」という疑問があれば、いつでも聞いてください。
さあ、コードを書いて、退屈な作業を自動化の魔法に変えていきましょう!

Happy Coding!

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