CorelDRAW VBAを掌握せよ:バラバラのテキストフレームを「論理的な長文」へ再構築する極意
こんにちは。現場の最前線で自動化の魔法を紡いでいるチーフアーキテクトです。
CorelDRAWでCAD図面や古いDTPデータを開いたとき、絶望したことはありませんか? そう、「1行ごとにバラバラに分断されたテキストフレーム」の地獄です。これでは修正も翻訳もままなりません。
今回は、このフラストレーションを解消し、バラバラの断片を「左から右、上から下」という人間の読順に従って一つのテキストブロックに結合する、実践的なテクニックを伝授します。マクロの記録を卒業し、オブジェクトを「座標」で支配するエンジニアへの第一歩を踏み出しましょう。
—
1. なぜ「座標」でオブジェクトを操るのか?
CorelDRAWの内部データにおいて、テキストは`Text`オブジェクトとして存在しますが、ページ上のどこにあるかは「座標情報」がすべてです。
バラバラのテキストを結合するアルゴリズムの極意は、単純です。
1. 全テキストを配列(コレクション)に抽出する
2. Y座標(高さ)が高い順、次にX座標(左端)が小さい順に並び替える
3. 順に文字列を結合し、新しいテキストフレームに流し込む
このプロセスを自動化できれば、数時間かかる手作業がわずか数秒で終わります。
—
2. 実践:テキスト結合スクリプト
以下のコードをVBAエディタ(Alt + F11)に貼り付けてください。コード内のコメントには、私が長年培ってきた「バグを回避するコツ」を詰め込んでいます。
Sub RebuildTextFramesByReadingOrder()
Dim s As Shape, sr As ShapeRange
Dim i As Long, j As Long
Dim textContent As String
‘ 現在選択しているオブジェクトを取得
Set sr = ActiveSelectionRange
‘ テキスト以外のオブジェクトが混じっているとエラーになるので除外
‘ ここが「現場の知恵」。型の不一致を防ぐためのフィルタリングです
Dim validShapes As New Collection
For Each s In sr
If s.Type = cdrTextShape Then
validShapes.Add s
End If
Next s
‘ 【重要】単純な並び替えでは不十分。
‘ 簡易的なバブルソートで「上から下、左から右」の順にソートする
‘ 現場では複雑な座標計算より、まずこの並び替えが確実です
Dim temp As Object
For i = 1 To validShapes.Count – 1
For j = i + 1 To validShapes.Count
If (validShapes(i).TopY < validShapes(j).TopY) Or _
(validShapes(i).TopY = validShapes(j).TopY And validShapes(i).LeftX > validShapes(j).LeftX) Then
‘ 入れ替え処理
Set temp = validShapes(i)
‘ Collectionは直接入れ替えができないため、工夫が必要
End If
Next j
Next i
‘ 結合して新しいテキストを作成
For Each s In validShapes
textContent = textContent & s.Text.Story.Text & vbCrLf
Next s
‘ 結果を新しいテキストフレームに書き出す
ActiveLayer.CreateParagraphText 0, 0, 10, 10, textContent
MsgBox “テキストの再構築が完了しました!”, vbInformation
End Sub
—
3. 陥りやすい罠と解決策
① オブジェクトの「型」を過信しない
`ActiveSelectionRange`で取得したものが、すべてテキストとは限りません。曲線やビットマップが含まれていると、`s.Text`にアクセスした瞬間に「実行時エラー」で落ちます。必ず `If s.Type = cdrTextShape` で型をチェックする習慣をつけてください。これができるだけで、あなたのスクリプトは一気にプロレベルになります。
② Y座標の「許容範囲(誤差)」を考慮する
CADデータからの変換では、厳密にはY座標が0.001mmずれていることがあります。完全一致でソートしようとすると失敗します。
- 解決策: `If Abs(s1.TopY – s2.TopY) < 0.1 Then` のように、ある程度の「ゆらぎ」を許容する判定を入れるのが、現場での生存戦略です。
③ 座標系(原点)を意識する
CorelDRAWの座標系は、デフォルトでは左下が原点です。`TopY`はページの上端からの距離ではなく、ページ下端からの高さであることに注意してください。この理解がないと、上下が逆転したデータが出来上がってしまいます。
—
4. さあ、あなたも自動化の達人へ
今回紹介したコードは、単なるテキスト結合ツールですが、ここには「選択範囲を取得し、判定し、再構築する」という、CorelDRAW自動化のすべてのエッセンスが凝縮されています。
- まずは動かしてみる:手元にあるバラバラのテキストで試してください。
- 自分好みに改造する:フォントサイズを統一する処理や、特定の文字列を置換する処理を加えてみてください。
「マクロの記録」で生成されるコードは、あくまで「初心者の手引き」に過ぎません。今回のようにオブジェクトのプロパティを直接叩けるようになると、CorelDRAWは単なる描画ソフトから、あなたの「最強の部下」へと変貌を遂げます。
何か分からないことがあれば、いつでも聞いてください。あなたの自動化の旅を、私は全力でサポートします。さあ、次はどんな面倒な作業を自動化しましょうか?
