CorelDRAW VBAの「単位の呪縛」を解く:内部単位(Internal Units)を掌握する最適化戦略
CorelDRAWの自動化を志すエンジニアが、最初の数時間で必ず直面する壁がある。それが「単位系」の不整合だ。UI上の「mm」や「inch」を信じてコードを書くと、複雑な座標計算で必ず浮動小数点誤差の毒牙にかかる。
なぜか? CorelDRAWのコアエンジンは、実世界単位ではなく、「内部単位(Internal Units)」という絶対的な固定精度整数系で世界を記述しているからだ。
本稿では、レガシーを叩き直し、堅牢な自動化パイプラインを構築するための「単位系攻略の極意」を伝授する。
—
1. 内部単位(Internal Units)の正体
CorelDRAWの内部単位は、`1インチ = 25400単位` という固定比率で管理されている。この「25400」という数値こそが、全ての計算の起点となる。
- 内部単位 (Internal Units): 72dpiであれば1ポイント=352.77…といった換算ではなく、常に「1/25400インチ」を最小単位とする整数ベースのシステム。
- 最大の罠: UI設定(ツール>オプション)で「mm」を選んでいようが、VBAの `ActiveDocument.Unit` を変更していようが、内部計算をUI単位に依存させるのは設計ミスだ。UI設定はあくまで「ユーザーへの表示用」であり、ロジックには関与させてはならない。
—
2. 厳密な単位変換ロジックの実装
計算ミスを排除するためには、独自の変換レイヤーを設けるのがベストプラクティスだ。以下に、ミリメートルと内部単位を相互変換する、型安全を意識した変換用モジュールの一部を示す。
‘ 【CorelDRAW Unit Converter Module】
‘ 内部単位(25400単位/inch)を基準とした厳密な定数定義
Private Const UNITS_PER_INCH As Double = 25400
Private Const MM_PER_INCH As Double = 25.4
‘ ミリから内部単位への変換
Public Function MmToInternal(ByVal mmValue As Double) As Long
‘ 浮動小数点誤差を丸めるためにRound関数を噛ませるのが定石
MmToInternal = CLng(Round((mmValue / MM_PER_INCH) UNITS_PER_INCH))
End Function
‘ 内部単位からミリへの変換
Public Function InternalToMm(ByVal internalValue As Long) As Double
InternalToMm = (internalValue / UNITS_PER_INCH) MM_PER_INCH
End Function
—
3. オブジェクトライフサイクルとメモリ最適化の極致
CorelDRAWのVBAは、ドキュメントやシェイプを操作するたびに、裏でCOMラッパーが生成される。これを放置すると、メモリリークだけでなく、大規模な描画処理で「オブジェクトのスタックオーバーフロー」を引き起こす。
特に `ActiveLayer` や `ActiveDocument` をループ内で再取得するような愚は避けよ。
‘ 悪い例:ループ内でActiveDocumentを何度も呼び出す(負荷大)
For i = 1 To 100
ActiveDocument.ActivePage.Layers(1).CreateRectangle 0, 0, 10, 10
Next i
‘ 伝説的アーキテクト流:参照をキャッシュし、メモリ消費を抑える
Sub OptimizedDrawing()
Dim doc As Document
Dim layer As Layer
‘ プロセス開始前にインスタンスを固定
Set doc = ActiveDocument
Set layer = doc.ActivePage.ActiveLayer
‘ 描画処理はキャッシュした参照に対して行う
‘ これにより、COM層のオーバーヘッドを劇的に削減できる
layer.CreateRectangle 0, 0, MmToInternal(10), MmToInternal(10)
‘ 明示的な解放(VBAではNothing代入が礼儀)
Set layer = Nothing
Set doc = Nothing
End Sub
—
4. シニアエンジニアへの提言:システム間連携の鍵
CorelDRAWで生成したCADデータやグラフィックを外部システム(VB.NET製の加工機制御ソフトなど)と連携させる場合、「座標系の原点」と「単位変換の丸め誤差」が常に争点になる。
- 極意1: 外部APIへデータを渡す際は、必ず内部単位(Long型)で送れ。浮動小数点数(Double)で渡すと、プラットフォーム間での解釈の違いにより、1/1000mmのズレが生じ、精密加工で致命傷になる。
- 極意2: Windows API(`GetDeviceCaps`等)でモニター解像度を取得し、高DPI環境でのズレを補正する必要がある場合、CorelDRAWの内部単位系とは切り離して管理すること。混ぜれば必ず破綻する。
—
最後に:コードは「芸術」ではなく「工業」である
CorelDRAW VBAは、一見するとGUI操作の記録に近いツールに見える。しかし、それを大規模なワークフローに組み込むのであれば、OSレベルのメモリ管理と、数値計算の堅牢性が全てだ。
単位系という「言語」を正しく統一し、メモリという「血」を循環させる。それが、CorelDRAWを掌中で踊らせる唯一の道である。
次回の講義では、`Selection` オブジェクトの罠と、なぜ `ShapeRange` を使うべきなのかについて、実例を交えて深掘りしていく。健闘を祈る。
