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に全投げしてしまいましょう!
何か詰まったら、いつでも戻ってきてくださいね。応援しています。
