【テクニカル・上級編】【中級者向け】複数に分散しているテキストフレームを読順(左から右、上から下)の座標アルゴリズムに従って自動結合・再構築するスクリプト – CorelDRAW VBA解析バイブル

スポンサーリンク

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の深い深淵の淵で待っている。

タイトルとURLをコピーしました