CorelDRAW VBAの深淵:断片化されたテキストフレームを「論理構造」へ再構築する技術
CorelDRAWを扱っていると、CADからの変換データや、レガシーなDTPデータに遭遇する。そこにあるのは「デザイン」ではなく「文字の破片」だ。数千のテキストオブジェクトが座標上に散らばり、編集はおろか、翻訳エンジンに投げることすらままならない。
多くのエンジニアはここで手作業という敗北を選択するが、我々にはVBAという武器がある。今回は、この散らばったテキストを座標空間でソートし、読み順に従って結合する「テキスト再構築エンジン」の設計思想を解き明かす。
1. なぜ「単純なループ」では失敗するのか
CorelDRAWのオブジェクトモデルにおける`ActivePage.Shapes`は、作成順(Zオーダー)に格納されている。これをそのまま抽出しても、人間が期待する「左から右、上から下」という読順にはならない。
ここで必要となるのは、空間ハッシュ的なアプローチだ。座標計算のコストを最小化し、CorelDRAWのオブジェクトメモリを浪費させないための「静的なソートエンジン」を構築する必要がある。
2. 読順アルゴリズムの極意:座標の正規化
テキストの結合順序を決めるためのキーは、Y座標(行)を基準としたグループ化と、X座標による順序付けだ。
‘ 読順ソートの核心部
‘ オブジェクトのLeft/Top座標を基準に、Y軸の偏差(行の高さ)を許容してグループ化する
Public Function SortShapesByReadingOrder(ByVal shps As ShapeRange) As Collection
‘ ここでは簡略化のため、Y座標の±5mmを同一行とみなす判定ロジックを用いる
‘ 実際には、フォントサイズの半分を許容値として動的に計算するのが定石である
Dim sorted As New Collection
‘ …(ソートアルゴリズムの実装:クイックソート等を推奨)
End Function
3. 実装の要:メモリマネジメントとオブジェクトの生存期間
VBAで数千のオブジェクトを操作する場合、最も避けるべきは「メモリリーク」と「UIのフリーズ」だ。CorelDRAWのVBAはシングルスレッドであり、重い処理はアプリケーションを停止させる。
パフォーマンスを最適化する鉄則
- `Optimization`プロパティの活用: `Application.Optimization = True`を必ず宣言する。これを行わないと、全ての更新が描画に反映され、処理速度が数百倍遅延する。
- 明示的なオブジェクトの解放: ループ内でのオブジェクト生成(`Set shp = …`)は、ループの終端で必ず`Set shp = Nothing`し、ガベージコレクションの負荷を軽減する。
- APIによるイベント中断: 大規模処理時は`Application.EventsEnabled = False`でイベントハンドラを無効化し、バックグラウンドでの不要なフックを排除する。
4. テキスト再構築スクリプト(実装例)
以下は、選択範囲内のテキストを座標ソートし、一つのフレームに結合するプロトタイプだ。
Sub RebuildTextFrames()
Dim shp As Shape, sr As ShapeRange
Dim targetText As String
‘ 最適化フラグをオン(描画更新を止める)
Application.Optimization = True
Set sr = ActiveSelectionRange
If sr.Count = 0 Then Exit Sub
‘ 座標計算に基づいたソート処理(※ここにソートエンジンを実装)
‘ …
‘ テキストの結合処理
For Each shp In sr
If shp.Type = cdrTextShape Then
targetText = targetText & shp.Text.Story.Text & vbCrLf
shp.Delete ‘ 結合後は元の断片を削除
End If
Next shp
‘ 新規フレームへの流し込み
Dim newShp As Shape
Set newShp = ActiveLayer.CreateParagraphText(0, 0, 100, 100, targetText)
‘ 後始末
Application.Optimization = False
ActiveWindow.Refresh
End Sub
5. シニアエンジニアへの提言:システム間連携を見据えて
このツールを単なる「時短ツール」で終わらせてはならない。
CADから抽出したテキストに、独自のIDを付与する仕組み(`Shape.ObjectData`の活用)を加えれば、翻訳後のテキストを元の位置へ正確に戻す「往復変換(Round-trip)システム」の基盤となる。
CorelDRAWのVBAは、一見するとレガシーで古臭い言語だ。しかし、この環境でメモリ管理を意識し、計算量を最適化するスキルは、他のどの言語でも通用する「本質的なエンジニアリング能力」を鍛えてくれる。
断片化されたデータに秩序を与えること。それこそが、我々自動化エンジニアの誇りであるはずだ。
