数百ページのカタログも怖くない。特定のパーツを瞬時に見つけ出す「ページ検索自動化」への招待
こんにちは。今日も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!
