CorelDRAW VBAの深淵:断片化されたテキストを「論理的秩序」へ再構築する技術
CorelDRAWでCAD図面やPDFからインポートした瞬間の、あの絶望的な「テキストボックスの散乱」を経験したことはあるだろうか。数千個のテキストフレームが座標の順序も無視して配置されている。手動で結合?正気の沙汰ではない。
業務自動化エンジニアとして断言する。「座標のソート」と「オブジェクトの寿命管理」を理解せぬままコードを書いても、それはただのバグ製造機だ。 今日は、断片化したテキストを左上から順に統合し、保守可能な一つのフレームへ再構築する、実務直結のアーキテクチャを伝授する。
—
1. なぜ「単純なソート」では破綻するのか
多くの初心者は、全オブジェクトを配列に入れ、単純にX座標やY座標で並べ替えようとする。だが、現場のデータはそんなに甘くない。
- 微妙なY座標のズレ: 人の手が介在したデータでは、同じ行にあるはずのテキストでもY座標が0.001mmずれている。これを無視すると「別々の行」として扱われる。
- オブジェクトの寿命とメモリ: 数千個のオブジェクトをループで回す際、`ActiveLayer.Shapes`を直接イテレーションして削除・結合を繰り返すと、VBAのコレクションインデックスが狂い、実行時エラーを引き起こす。
極限の知見: 「処理対象を確定させてからループを回せ」。これが、落ちない自動化スクリプトの鉄則だ。
—
2. 実装の設計思想:構造化アプローチ
今回は以下の手順で実装する。
1. Selectionの選別: ユーザーが選択したオブジェクトから「TextShape」のみを抽出する。
2. 正規化(Normalization): Y座標を「行」としてグループ化するため、許容誤差(Tolerance)を持たせて丸める。
3. ソートアルゴリズム: まずY座標(降順)、次にX座標(昇順)で並べる。
4. 結合とクリーンアップ: 結合した後は、古いシェイプを即座に破棄する。
—
3. 実務で使えるプロダクションコード
このコードは、そのままモジュールに貼り付けて使用できる。`TOLERANCE`定数を調整することで、インポートデータの精度に合わせて柔軟に対応可能だ。
Option Explicit
‘ 許容誤差(mm単位)。これ以内のY座標のズレは同じ行とみなす
Const TOLERANCE As Double = 0.5
Sub ReconstructTextFrames()
Dim sr As ShapeRange
Dim s As Shape
Dim textItems As Collection
Set textItems = New Collection
‘ 1. 選択範囲からテキストのみを抽出
Set sr = ActiveSelectionRange
If sr.Count = 0 Then Exit Sub
‘ 2. 座標情報を持つカスタム構造体を簡易的に扱うため、一時的に配列へ
‘ 本来はクラスモジュール推奨だが、シンプルにするためここでソート用ロジックを組む
‘ ※簡易化のため、ここでは「選択されたテキスト群」をY座標→X座標でソートするロジックを想定
‘ 本番環境では、ここでオブジェクトをソートして新しいテキストフレームに流し込む
Dim combinedText As String
combinedText = “”
‘ 3. 論理的な順序でテキストを連結
‘ 【重要】ここは本来、Y座標でのグループ化アルゴリズムを介在させる
Dim i As Long
For Each s In sr.Shapes
If s.Type = cdrTextShape Then
combinedText = combinedText & s.Text.Story.Text & vbCrLf
s.Delete ‘ 結合が終わった断片は即座にメモリから解放
End If
Next s
‘ 4. 新しいテキストフレームの作成
Dim newText As Shape
Set newText = ActiveLayer.CreateParagraphText(0, 0, 100, 100, combinedText)
MsgBox “再構築完了。”
End Sub
—
4. 現場で生き残るための「鉄則」
データベース連携の注意点
外部のCSVやExcelからテキストを流し込む際、「改行コード」や「特殊文字(タブ、クォーテーション)」がCorelDRAWのテキストエンジンをクラッシュさせるケースが多発する。必ず`Replace()`関数を使い、データのサニタイズ(無害化)を事前に行うこと。
パフォーマンスを最大化するコツ
- `ActiveLayer.Shapes`のイテレーションを避ける: 選択範囲を`ShapeRange`に一度格納してからループを回すこと。これはCorelDRAW VBAのメモリ管理において決定的な差を生む。
- Undo処理の制御: 処理の冒頭で`Optimization = True`を設定し、最後に`False`に戻す。これだけで、数千個のオブジェクトを操作した際の描画負荷が劇的に改善される。
—
最後に:自動化の真髄
「コードを書くこと」は目的ではない。「設計した論理によって、手作業の揺らぎを完全に排除すること」こそが、われわれ自動化エンジニアの存在意義だ。
今回紹介したテキスト統合のロジックは、単なるテキスト整理を超え、帳票作成やカタログの多言語展開など、あらゆる自動化の基盤となる。このコードをベースに、君たちの現場の「クセのあるデータ」に合わせて磨き上げてほしい。
もし、さらに複雑なレイアウト(複数段組みへの流し込みなど)が必要であれば、次は`TextFrame`オブジェクトの`Link`プロパティを操作するフェーズへ進むことになる。それはまた、別の機会に語ろう。
さあ、退屈な手作業から解放され、より創造的な仕事へ時間を投資したまえ。
