CorelDRAW VBAを掌握する:断片化されたテキストフレームを「座標アルゴリズム」で論理結合する極意
CorelDRAWでCAD図面やPDFからSVG/DXFをインポートした際、最もエンジニアを絶望させるのは「バラバラに砕け散ったテキストフレーム」の群れだ。これらは論理構造を持たず、ただ座標上に配置されただけのゴミ同然のオブジェクトである。
これを手動で修正するのは、自動化を掲げる我々にとって最大の敗北だ。今回は、VBAを用いてこれらテキスト断片を「左上から右下へ」という読順に従って再構築する、真の自動化アルゴリズムを伝授する。
—
1. なぜ「単純なループ」では失敗するのか
多くの初心者は `ActivePage.Shapes` をループさせ、そのままテキストを連結しようとする。だが、インポートされたオブジェクトのスタック順(Zオーダー)は、作成順であって読順ではない。
我々が実装すべきは、「Y軸で大まかな行を判定し、X軸で列を整列させる」という空間ソートだ。
空間ソートの戦略
1. 正規化: すべてのテキストオブジェクトをコレクションに格納する。
2. バケット化: Y座標の誤差(フォントサイズの1.5倍程度)を許容し、同一行としてグループ化する。
3. 並び替え: 行内ではX座標で昇順ソートする。
4. 再構築: 結合した文字列を作成し、元の断片を破棄する。
—
2. 実装コード:オブジェクトライフサイクルを意識した設計
メモリリークを許さないのが、我々シニアエンジニアの流儀だ。`Shape` オブジェクトの明示的な解放と、`Optimization` モードの活用は必須である。
Option Explicit
‘ 座標判定のための閾値(フォントサイズに合わせて調整が必要)
Private Const TOLERANCE As Double = 0.5
Public Sub ReconstructTextBlocks()
Dim s As Shape, sr As ShapeRange
Dim i As Long
‘ パフォーマンス最適化:画面更新を停止
Optimization = True
EventsEnabled = False
Set sr = ActivePage.Shapes.FindShapes(Type:=cdrTextShape)
‘ 座標に基づいてソート処理を行うためのカスタムクラス、または配列変換
‘ ここでは簡略化のため、座標配列を生成してソートするロジックを想定する
‘ ※実際の開発ではBubbleSortやQuickSortを実装すること
‘ — メインループ —
‘ 1. オブジェクトの座標を読み取り配列へ格納
‘ 2. Y座標(降順)→ X座標(昇順)でソート
‘ 3. テキスト連結と新規配置
‘ オブジェクトの解放
For i = 1 To sr.Count
‘ ここでテキストのプロパティを抽出し、元オブジェクトを削除
‘ sr(i).Delete
Next i
‘ 終了処理
Optimization = False
ActiveWindow.Refresh
EventsEnabled = True
End Sub
—
3. レガシー環境におけるメモリ最適化の極致
CorelDRAWのVBAエンジンは、COMインターフェースを介したオーバーヘッドが大きい。特に数千のテキストフレームを扱う場合、以下の「禁じ手」に近いテクニックが不可欠だ。
- `Optimization = True` の徹底: これを忘れると、1操作ごとに再描画が走り、処理時間が100倍に跳ね上がる。
- イベントの無効化: `EventsEnabled = False` にし、ドキュメントの変更に伴う再計算イベントを強制的に遮断する。
- オブジェクトの明示的破棄: ループ内で `Set s = Nothing` を明示的に行い、VBAのガベージコレクションを待たずにメモリを解放する。
—
4. システム間連携の勘所
もしこれが、社内システムから生成されたSVGやXMLデータとの連携であれば、Win32 APIを直接叩く必要はない。むしろ、CorelDRAWの `ImportEx` メソッドを制御し、インポート時に「テキストをカーブに変換しない」「テキストを連結する」オプションを渡すのが先決だ。
しかし、不可逆なフォーマット(PDF等)の場合は、このVBAスクリプトこそが「唯一の救い」となる。
さらに先へ行くためのヒント
- 文字間隔の調整: 結合後の `Text.Story.Kern` プロパティを調整し、元のレイアウトを完全に復元する。
- 外字・特殊フォント対応: `Text.Story.Font` が存在しない環境でのフォールバック処理を組み込む。
—
結びに代えて
自動化とは、単にツールを動かすことではない。「ソフトウェアが解釈できていない論理構造を、コードによって再定義すること」である。
今回紹介した座標アルゴリズムは、あらゆるグラフィック処理の基本だ。これさえ体得すれば、CorelDRAWという巨大なレガシーシステムを、文字通り「意のままに」操ることが可能になる。
コードは嘘をつかない。あなたの手で、その煩雑なテキストの山に秩序をもたらしてほしい。質問があれば、CorelDRAWの深い深淵の淵で待っている。
