CorelDRAW VBAの「単位の罠」を突破せよ:内部数値(Internal Units)を支配するエンジニアリング術
こんにちは。CorelDRAWの自動化の世界へようこそ。
マクロの記録ボタンを押してコードを生成し、いざ動かしてみると「なぜかミリ単位でずれる」「環境によって座標が狂う」……そんな経験はありませんか?
CorelDRAW VBAの沼にハマる多くの初心者が最初に直面する壁、それが「単位系(Units)の呪い」です。今日は、CorelDRAWの内部エンジンが世界をどう見ているのか、その核心に触れ、どんな設定環境でも正確な座標を叩き出すための「真の変換ライブラリ」の作り方を伝授します。
—
1. なぜ「単位」でミスが起きるのか?
CorelDRAWのGUI上では、ユーザーは「ミリメートル」「インチ」「ピクセル」など、好きな単位でデザインしますよね。しかし、VBAの内部演算でこれらをそのまま扱うのは自殺行為です。
CorelDRAWの内部エンジンは、すべて「Internal Units(内部単位)」という極めて高い精度の数値で座標を管理しています。
具体的には、1インチを720,000分割した値を最小単位として計算を行っています。
もし、あなたがコード内で `ActiveDocument.Unit = cdrMillimeter` と設定していても、背後では変換誤差や単位の切り替えによる挙動の変化がつきまといます。これを回避する唯一の方法は、「常にInternal Unitsで計算し、必要な時だけ表示用の単位に変換する」というアプローチです。
—
2. 単位変換の数理:Internal Unitsの正体
Internal Unitsの基準は常に「インチ」です。
CorelDRAWの内部定数では、1インチ = 720,000 units です。
これさえ押さえれば、どんな単位も以下の数式で変換可能です。
- ミリメートル → Internal Units
`値 720000 / 25.4`
- インチ → Internal Units
`値 720000`
- ポイント → Internal Units
`値 10000` (※1インチ=72ptのため、720000/72=10000)
—
3. 実装:最強の単位変換ライブラリ
環境依存を排除し、コードの堅牢性を高めるための変換関数を作成しましょう。これを標準モジュールに一つ入れておくだけで、あなたのマクロの精度は劇的に向上します。
‘ ==========================================================
‘ CorelDRAW 単位変換ユーティリティ
‘ 概要: ユーザーの単位設定に依存せず、正確な描画制御を行う
‘ ==========================================================
‘ 内部単位(Internal Units)への変換関数群
Public Function ToInternalUnits(ByVal Value As Double, ByVal Unit As cdrUnit) As Double
‘ ActiveDocumentの単位設定を気にせず、常に数学的に計算する
Select Case Unit
Case cdrMillimeter: ToInternalUnits = (Value 720000) / 25.4
Case cdrInch: ToInternalUnits = Value 720000
Case cdrPoint: ToInternalUnits = Value 10000
Case Else: ToInternalUnits = Value ‘ 単位不明時はそのまま返す
End Select
End Function
‘ 内部単位から指定単位への変換関数群
Public Function FromInternalUnits(ByVal InternalValue As Double, ByVal Unit As cdrUnit) As Double
Select Case Unit
Case cdrMillimeter: FromInternalUnits = (InternalValue 25.4) / 720000
Case cdrInch: FromInternalUnits = InternalValue / 720000
Case cdrPoint: FromInternalUnits = InternalValue / 10000
End Select
End Function
—
4. なぜこのやり方が「プロ」なのか?
このコードのポイントは、`ActiveDocument.Unit` を参照していない点です。
初心者の多くは `ActiveDocument.Unit = cdrMillimeter` と宣言してコードを書き始めますが、これだとユーザーがドキュメント設定を変更した瞬間に計算結果が狂います。
上記の関数を使えば、以下のような「単位を意識しない安全な描画」が可能になります。
Sub CreatePreciseSquare()
Dim s As Shape
‘ ユーザーの単位設定が何であれ、10mm x 10mmの正方形を作る
Dim size As Double
size = ToInternalUnits(10, cdrMillimeter)
Set s = ActiveLayer.CreateRectangle(0, 0, size, -size)
MsgBox “作成された正方形の幅は ” & FromInternalUnits(s.SizeWidth, cdrMillimeter) & ” mm です。”
End Sub
—
5. 最後に:エンジニアとしての心構え
CorelDRAW VBAを使いこなす第一歩は、「ソフトウェアの表示(GUI)と、裏側の計算エンジンを切り離して考えること」です。
- ユーザーに見せるのは「ミリ」や「インチ」。
- 脳内で考えるのは「Internal Units」。
この二つを使い分ける感覚が身につけば、あなたはもう「マクロの記録」に頼るだけの初心者ではありません。どんな複雑な図形生成も、正確に制御できるようになるはずです。
もしコードで詰まったら、いつでも戻ってきてください。CorelDRAWの奥深さを知ることは、デザインと論理の架け橋を築く素晴らしい体験ですよ。
さあ、次はどんなオブジェクトを自動化しますか?応援しています。
