【入門編】【中級者向け】複数に分散しているテキストフレームを読順(左から右、上から下)の座標アルゴリズムに従って自動結合・再構築するスクリプト – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAの「迷宮」を解く:バラバラのテキストを論理的に再構築する極意

こんにちは。CorelDRAWの自動化の世界へようこそ。
日々、CADからのインポートやPDF変換で「テキストがバラバラに分断されていて、修正に日が暮れる……」という絶望を味わっていませんか?

マクロの記録ボタンを押すだけの「初心者」を卒業し、オブジェクトの座標を自在に操る「エンジニア」へと進化する時が来ました。今日は、分散したテキストフレームを、人間が読む順序(左から右、上から下)で美しく結合するアルゴリズムを伝授します。

—

1. なぜ「手作業」から卒業すべきなのか

CorelDRAW上でバラバラになったテキストを一つずつ繋ぎ直すのは、デジタルな拷問です。私たちが目指すのは、「コンピュータに空間認識能力を持たせる」こと。

CorelDRAWのオブジェクトは、作成された順序(Zオーダー)で内部管理されています。しかし、人間が読みたいのは「視覚的な配置順」です。この「論理的な並び」と「データの並び」のギャップを埋めるのが、今回のアルゴリズムの核心です。

—

2. 座標アルゴリズムの設計図

テキストフレームを整列させるための「読順判定」は、以下のルールで行います。

1. 「上から下」を優先(Y座標の比較)
2. 「左から右」を次点(X座標の比較)
3. しきい値(Tolerance)の導入:完全にY座標が一致していなくても、少しのズレなら「同じ行」とみなす許容範囲。これが実務で使えるかどうかの分かれ道です。

—

3. 実践:テキスト結合スクリプト

このコードを標準モジュールに貼り付けてみてください。オブジェクトのバウンディングボックス(境界ボックス)を基準に、論理的順序を再構築します。

Sub RebuildTextFrames()
Dim s As Shape, sr As ShapeRange
Dim i As Long, j As Long
Dim tempShape As Shape

‘ 選択中のオブジェクトを取得
Set sr = ActiveSelectionRange
If sr.Count < 2 Then MsgBox "結合したいテキストフレームを複数選択してください。" Exit Sub End If ' 【重要】バブルソートで座標順に並び替え ' Y座標が高い(上にある)ものを優先し、同じならX座標が小さい(左にある)ものを優先 Dim tolerance As Double tolerance = 0.5 ' 0.5mm程度のズレは「同じ行」とみなす誤差範囲 For i = 1 To sr.Count - 1 For j = i + 1 To sr.Count Dim s1 As Shape, s2 As Shape Set s1 = sr(i) Set s2 = sr(j) ' 判定ロジック:Y座標の差がtolerance以内ならXで比較、そうでなければYで比較 If Abs(s1.TopY - s2.TopY) > tolerance Then
If s1.TopY < s2.TopY Then SwapShapes sr, i, j Else If s1.LeftX > s2.LeftX Then SwapShapes sr, i, j
End If
Next j
Next i

‘ 結合処理(最初のシェイプに統合していく)
For i = 2 To sr.Count
sr(1).Text.Story.AppendText vbCr & sr(i).Text.Story.Text
sr(i).Delete
Next i

MsgBox “テキストの再構築が完了しました!”
End Sub

‘ シェイプの入れ替え用ヘルパー関数
Private Sub SwapShapes(sr As ShapeRange, i As Long, j As Long)
Dim temp As Shape
Set temp = sr(i)
sr(i) = sr(j)
sr(j) = temp
End Sub

—

4. ここがプロのこだわり:知っておくべき「落とし穴」

コードを書いていて、あるいは実行していて「あれ?」と思った方へ。エンジニアとしてこれだけは覚えておいてください。

その1:`ShapeRange`の性質

VBAの`ShapeRange`は、操作するたびにインデックスが変わる可能性があります。今回は`SwapShapes`という独自関数で並び替えを制御していますが、非常に大規模な処理を行う場合は、一度配列(Array)に座標情報を格納してからソートし、その順序に従って処理する方が安全です。

その2:しきい値(Tolerance)の魔法

CADデータは完璧ではありません。1ピクセル単位でY座標がズレていることは日常茶飯事です。`tolerance`変数(許容誤差)を設けることで、この「データ上のノイズ」を無効化しています。これがあるかないかで、スクリプトの「現場適応能力」が劇的に変わります。

その3:エラーハンドリングの欠如

今回はシンプルさを優先しましたが、実務では「テキストではないオブジェクトが選択されていたらどうするか?」といったエラーチェックが必須です。`If s.Type <> cdrTextShape Then` という判定を入れるだけで、スクリプトの堅牢性は一気に高まります。

—

最後に:自動化は「思考の整理」

テキストを繋ぐという作業は、単なる手抜きではありません。データの構造を正しく整えることは、後続のレイアウト変更や修正を劇的に速くするための「投資」です。

今日からあなたは、ただツールを操作する人ではなく、「ワークフローを設計するエンジニア」です。このスクリプトをベースに、自分好みのカスタマイズを加えてみてください。

何か詰まったら、またいつでもここへ来てください。あなたの自動化の旅を、これからも応援しています。

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