【実務・中級編】【初心者必見】CorelDRAWの単位系(インチ、ミリ、ピクセル)の罠とVBA内部での正しい数値換算方法 – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAの「単位」の闇を切り裂く:堅牢な自動化ツールを設計する唯一の流儀

CorelDRAWのVBA開発に足を踏み入れた者が最初に直面する「見えない壁」。それが「単位系(Units)の罠」です。

UI上で「ミリメートル」を設定しているからといって、コード内で `ActiveShape.LeftX = 10` と書く。これがどれほど危険な賭けか、あなたは理解しているでしょうか?

今日は、CorelDRAWの内部構造(CorelDRAW Internal Units)を掌握し、環境設定に依存しない「堅牢かつ移植性の高い」自動化ツールを組むための極意を伝授します。

—

1. なぜ「数値の直書き」がバグの温床になるのか

CorelDRAWの内部データは、実は「ミリ」や「インチ」ではなく、「内部単位(Internal Units)」と呼ばれる固定精度で管理されています。

  • 内部単位の正体: 1インチを720,000分割した値(1ピクセル=1/72インチ=10,000内部単位)が基本です。
  • 罠の正体: `ActiveDocument.Unit` プロパティは、あくまで「ユーザーインターフェース上の表示単位」を指します。ユーザーがドキュメント設定で単位を変えた瞬間、あなたの書いたロジック(例: `LeftX = 10`)は、ミリ単位からインチ単位へ、あるいはピクセル単位へと意味を変え、レイアウトは崩壊します。

結論: プロダクションコードにおいて、`ActiveDocument.Unit` に依存した計算は禁止です。

—

2. 現場で採用すべき「絶対変換ロジック」

バグをゼロにするための鉄則は、「すべての座標・サイズ計算を内部単位に統一し、必要な時だけ変換関数を通す」ことです。

CorelDRAW VBAには `Application.ConvertUnits` という強力なメソッドがあります。これこそが、我々アーキテクトが信頼する唯一の変換エンジンです。

堅牢な単位変換用モジュール(コピペ用)

‘ ———————————————————
‘ Module: UnitConverter
‘ 概要: ドキュメント設定に依存せず、常に正確な値を算出する
‘ ———————————————————
Option Explicit

‘ ミリから内部単位への変換
Public Function MillimetersToInternal(ByVal mm As Double) As Double
‘ cdrMillimeterを明示的に指定することで、ドキュメント設定を無視する
MillimetersToInternal = Application.ConvertUnits(mm, cdrMillimeter, cdrInternal)
End Function

‘ 内部単位からミリへの変換(ログ出力や計算確認用)
Public Function InternalToMillimeters(ByVal internalValue As Double) As Double
InternalToMillimeters = Application.ConvertUnits(internalValue, cdrInternal, cdrMillimeter)
End Function

‘ 使用例: 10mmの位置に配置する
‘ ActiveShape.LeftX = MillimetersToInternal(10)

—

3. プロダクションコードにおける設計指針

単に変換関数を作るだけでは不十分です。実務で「保守性」を担保するために、以下の3原則を徹底してください。

① 座標の基準点を常に意識する

CorelDRAWの座標系は「ページ左下」が `(0,0)` です。しかし、オブジェクトの `LeftX` や `TopY` は「バウンディングボックスの端」を指します。
複数の図形を整列させる際、単位変換後の値をそのまま加算すると、微小な浮動小数点誤差(Float Error)が蓄積し、積み重なった図形が少しずつズレます。計算は必ず内部単位で行い、配置直前に変換を確定させてください。

② 外部データ(CSV/DB)連携のルール

外部から「10.5mm」という数値を受け取る場合、必ず文字列からDouble型へ変換し、その場で `MillimetersToInternal` を通すパイプラインを構築してください。

  • ダメな例: `val = 10.5` → `ActiveShape.SizeWidth = val`
  • 良い例: `val = MillimetersToInternal(CDbl(csvData))` → `ActiveShape.SizeWidth = val`

③ 単位変更のロック(安全策)

ツール実行中は、ユーザーが単位設定を変更できないよう、あるいは誤った単位設定であっても挙動が変わらないよう、常に `cdrInternal` を引数に含めるコーディングスタイルを貫いてください。

—

4. 最後に:エンジニアとしてのマインドセット

初心者は「今、画面にどう見えているか」でコードを書きます。しかし、我々エンジニアは「CorelDRAWのエンジンがどう解釈するか」をコードに落とし込みます。

単位系を意識した設計は、一見すると面倒なボイラープレートコードに見えるかもしれません。しかし、これこそが「修正依頼が来た時に、どの単位設定でも動く」という最強の保守性を生むのです。

明日からのあなたのコードに、この「単位の抽象化」を取り入れてください。それが、プロとアマを分かつ境界線です。

—
何か特定の座標計算で詰まっている案件があれば教えてください。その場でロジックを最適化して見せましょう。

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