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

スポンサーリンク

CorelDRAW VBA道場:細切れテキストを「完全統合」する極意

こんにちは。CorelDRAWの自動化の世界へようこそ。
日々、CADデータや他形式からインポートした図面と格闘していませんか? 気がつけば、一つの文章がバラバラのテキストフレームに砕け散り、修正するたびに絶望的な気分になる……そんな経験があるはずです。

今日は、そんな地獄を終わらせる「テキスト統合自動化スクリプト」を伝授します。単にコードを渡すだけでなく、「なぜそう書くのか」という設計思想まで深掘りしていきましょう。

—

なぜ「テキスト結合」が難しいのか?

CorelDRAWにとって、テキストフレームは独立したオブジェクトです。それらを読み順(左→右、上→下)に並び替えて結合するには、以下の壁を突破する必要があります。

1. 座標の取得: 各オブジェクトの`.LeftX`と`.TopY`をどう解釈するか。
2. ソートアルゴリズム: 二次元平面上の散らばったデータを、どうやって「読順」に整列させるか。
3. オブジェクトの破棄: 統合後に古い残骸をどう処理するか。

これらを解決できれば、あなたの自動化スキルは間違いなく一段階上のステージへ到達します。

—

開発の現場で使える「テキスト統合スクリプト」

以下のコードは、選択した複数のテキストフレームを「上から下、左から右」の優先順位でソートし、一つの巨大なフレームに結合する実務コードです。

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

‘ 選択範囲がない場合は即終了
If ActiveSelectionRange.Count < 2 Then MsgBox "結合したいテキストフレームを2つ以上選択してください。" Exit Sub End If ' 選択したオブジェクトを配列に格納 Set sr = ActiveSelectionRange ReDim textArr(1 To sr.Count) For i = 1 To sr.Count Set textArr(i) = sr(i) Next i ' 【重要】座標によるバブルソート(上から下、次に左から右) ' 実務ではこの比較ロジックが命です For i = 1 To UBound(textArr) - 1 For j = i + 1 To UBound(textArr) If (textArr(i).TopY < textArr(j).TopY) Or _ (textArr(i).TopY = textArr(j).TopY And textArr(i).LeftX > textArr(j).LeftX) Then
Set tempShape = textArr(i)
Set textArr(i) = textArr(j)
Set textArr(j) = tempShape
End If
Next j
Next i

‘ テキストの抽出と結合
Dim finalString As String
For i = 1 To UBound(textArr)
finalString = finalString & textArr(i).Text.Story.Text & vbCrLf
Next i

‘ 新規テキストフレームの作成と配置
Dim mergedShape As Shape
Set mergedShape = ActiveLayer.CreateParagraphText( _
textArr(1).LeftX, textArr(1).TopY, _
textArr(1).LeftX + 5, textArr(1).TopY – 5, _
finalString)

‘ 統合元のオブジェクトを削除(安全のため最後に実行)
sr.Delete

MsgBox “結合が完了しました。”
End Sub

—

極限の知見:成功のための3つのポイント

1. 二次元ソートの考え方

コード内の `If` 文に注目してください。
`textArr(i).TopY < textArr(j).TopY` で行(高さ)を優先し、同じ高さなら `LeftX > LeftX` で左側を優先しています。これが「人間が読む順序」を再現する最短ルートです。

2. オブジェクトライフサイクルの管理

VBAでやってしまいがちなミスが、処理中に元のオブジェクトを消してしまうこと。必ず「データを抽出してから」最後に `sr.Delete` で消去してください。メモリ上でオブジェクトが参照を失うと、CorelDRAWが予期せぬクラッシュを起こす原因になります。

3. エラーハンドリングの意識

今回のスクリプトはシンプルにしていますが、実務では `If textArr(i).Type <> cdrTextShape Then` のように、テキスト以外のオブジェクトが混じっていないかをチェックする「型チェック」を冒頭に入れるのが、伝説級エンジニアの嗜みです。

—

さあ、次のステップへ

このコードをそのまま使っても良いですが、さらに進化させるなら「フォント情報の引き継ぎ」に挑戦してみてください。現在のスクリプトはテキスト内容のみを抽出していますが、`.Text.Story.Font` プロパティを操作することで、書式を保ったままの結合も可能です。

「マクロの記録」はあくまでも手始め。
VBAの真の力は、今回のように「対象の性質を理解し、数学的に制御すること」にあります。

ここをクリアしたあなたなら、もう自動化の基礎は完璧です。ぜひ、自分の業務に合わせてカスタマイズし、退屈な作業をCorelDRAWに全投げしてしまいましょう!

何か詰まったら、いつでも戻ってきてくださいね。応援しています。

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