【入門編】CorelDRAW VBAにおける単位換算の罠:ActiveDocument.Unitと内部単位(Internal Units)の相互変換 – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して、生成されたコードを眺めてみる……うんうん、自動化の第一歩としては素晴らしいアプローチです。でも、しばらく実務で使えるマクロを書いていると、こんな疑問や壁にぶつかりませんでしたか?

  • 「あれ? 単位をミリメートル(mm)にしているのに、コードの中では変な数字(例えば 2540000 とか!)が出てくるぞ……?」
  • 「画面上ではきっちり 10mm 動かしたはずなのに、コードで `ActivePage.ActiveShape.LeftX = 10` と書いたら、とんでもなく巨大な図形になって画面からはみ出た!」

……ふふふ、よくぞ気づいてくれました。その違和感こそ、あなたが「マクロの記録を卒業し、真のCorelDRAW VBAエンジニアへと進化する扉」を開いた証拠です。

今回は、CorelDRAW VBAの裏側を支配する「内部単位(Internal Units)」と、私たちが普段目にする「UI単位(ActiveDocument.Unit)」の切ない関係、そしてそれをスマートに手なずけるための数学的アプローチを、優しく、そして徹底的に解説していきますね。
ここさえクリアすれば、座標計算や図形の正確な配置で迷うことはもう二度とありませんよ!

1. なぜ「単位の罠」にハマるのか?

私たちがCorelDRAWの画面を見るとき、ドキュメントのプロパティとして「ミリメートル」「インチ」「ポイント」などを自由に切り替えていますよね。

しかし、CorelDRAWの心臓部(VBAのオブジェクトモデルの深層)では、ユーザーが何を選んでいよう関係なく、すべての長さを「Internal Units(内部単位)」という独自の極小ユニットで管理しています。

内部単位の正体:DLU (Drawing Length Units)

CorelDRAWの内部では、長さを DLU(Drawing Length Units) という単位で処理しています。
実はこれ、1インチ = 25,400 DLU という固定の分解能を持っています。

  • 画面設定が ミリ (mm) のとき:1mm = 1,000 DLU
  • 画面設定が インチ (inch) のとき:1 inch = 25,400 DLU

つまり、あなたがVBAコードで `10` と書いたとき、CorelDRAWはそれを「10 DLU(=たったの 0.01mm!)」と解釈してしまうのです。これが、図形が点のように小さくなってしまったり、逆に意図せず暴走したりする根本原因です。

2. 罠を回避する王道アプローチ:「ActiveDocument.MasterFromCreateUnit」

「じゃあ、毎回 25,400 で割ったりかけたり計算しなきゃいけないの?」
いいえ、そんな面倒なことを先輩エンジニアが放置するわけがありません。

CorelDRAW VBAには、私たちが入力したい「UI上の単位(ミリやインチ)」を、内部単位(DLU)へ瞬時に、そして安全に変換してくれる魔法のメソッドが用意されています。それが `ActiveDocument.MasterFromCreateUnit`(または各種変換メソッド)です。

しかし、もっと直感的で、プロの現場でも好んで使われる「ドキュメントのネイティブな換算係数」を取得する方法を見てみましょう。

単位換算の黄金律:`ActiveDocument.ToUnits` と `FromUnits`

CorelDRAWのドキュメントオブジェクトには、現在の単位系を基準にして数値の相互変換を行うメソッドが備わっています。

  • `ActiveDocument.ToUnits(Value)`: 内部単位(DLU)を、現在のUI単位(mmなど)の数値に変換する。
  • `ActiveDocument.FromUnits(Value)`: 現在のUI単位(mmなど)で入力された数値を、内部単位(DLU)に変換する。

これを使えば、「今ユーザーが何単位を選んでいるか」をVBA側が自動で忖度(そんたく)して計算してくれるようになります。

3. 実践! 単位換算を完全にマスターするコード例

百聞は一見に如かず。実際に、ユーザーが指定したミリ数を正確に内部単位に変換し、安全に図形を配置・移動させる実用マクロを見てみましょう。

このコードは、ドキュメントの単位が「ミリ」であれ「インチ」であれ、常に正確に「10mm」の正方形を生成するエリート仕様です。

Sub CreatePreciseSquare()
‘ エラーハンドリングの基本
On Error GoTo ErrorHandler

‘ 画面描画を停止してパフォーマンスを爆発的に向上させる(プロの常識!)
ActiveDocument.BeginCommandGroup “正確な正方形の作成”
Application.Optimization = True
Application.EventsEnabled = False

Dim s As Shape
Dim targetSizeMM As Double
Dim internalSize As Double

‘ 作りたいたいサイズ(例:絶対に「10mm」にしたい!)
targetSizeMM = 10#

‘ 【重要】
‘ ユーザーがドキュメント単位に何を選んでいようとも、
‘ 「10mm」をCorelDRAWの内部単位(DLU)に正確に変換する
‘ ※ パソコンの単位設定が「ミリ」の場合、ActiveDocument.FromUnits(10) は 10000 を返します。
internalSize = ActiveDocument.FromUnits(targetSizeMM)

‘ 中心基準、あるいは左下基準で10mmの正方形を描画
‘ 引数には必ず「内部単位(DLU)」で渡します
Set s = ActiveLayer.CreateRectangle(0, internalSize, internalSize, 0)

‘ ついでに、現在の単位系でサイズをメッセージボックスに表示してみる
‘ ToUnits を使えば、内部単位を現在のUI単位に戻して確認できます
Dim checkedSize As Double
checkedSize = ActiveDocument.ToUnits(s.SizeWidth)

MsgBox “図形を作成しました!” & vbCrLf & _
“現在の単位系での幅: ” & checkedSize & ” (” & ActiveDocument.Unit & “)”, _
vbInformation, “単位換算マスター”

CleanUp:
‘ 画面描画とイベントを必ず復元する
Application.EventsEnabled = True
Application.Optimization = False
ActiveDocument.EndCommandGroup
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub

コードのここがポイント!

1. `Application.Optimization = True`: 大量処理や図形生成の際、画面の再描画を止めることでマクロの実行速度が何倍にも跳ね上がります。プロの現場では必須のお作法です。
2. `ActiveDocument.FromUnits(targetSizeMM)`: ここが今回のテーマの核心です。「10mmという人間にとって分かりやすい数値」を、CorelDRAWが理解できる「DLU(内部単位)」に安全に翻訳しています。
3. `ActiveDocument.EndCommandGroup`: これを挟むことで、万が一マクロの処理で図形がぐちゃぐちゃになっても、Ctrl + Z (元に戻す)を「1回」押すだけで一連の変更を綺麗にロールバックできます。

4. 陥りやすい罠とデバッグの極意

最後に、初心者がやりがちな「やっちまった!」なケースと、その対策をシェアしておきますね。

罠①:「数字だけ」を代入してしまう

‘ 駄目な例:
s.SizeWidth = 50

もしドキュメント単位が「ミリ」で、このコードを書いた場合、CorelDRAWはこれを「50 DLU(= 0.05mm)」と解釈してしまい、肉眼で見えないようなゴミクズのような図形が出来上がります。

正しいアプローチ:

‘ 良い例:
s.SizeWidth = ActiveDocument.FromUnits(50)

罠②:ドキュメント単位(`ActiveDocument.Unit`)を直接判定しようとする

「If文で単位がミリかどうか判定して、場合によって分岐させよう……」なんてコードを書く必要はありません。`FromUnits` や `ToUnits` は、現在のドキュメント単位を自動で検知してよしなに計算してくれるからです。余計な分岐を書くほど、バグの温床になります。

まとめ

いかがでしたか? CorelDRAW VBAにおける単位換算の仕組み。

  • CorelDRAWの内部はすべて 内部単位(DLU / 1インチ=25,400) で動いている。
  • 人間の指定する単位と内部単位の橋渡しをするのが `FromUnits`(入力用)と `ToUnits`(出力・確認用)。
  • この2つのメソッドを使いこなせば、ユーザーの環境(単位設定)に依存しない、堅牢でプロフェッショナルなマクロが書ける!

ここをクリアしたあなたは、もう「マクロの記録の奴隷」ではありません。CorelDRAWのポテンシャルを意のままに引き出す、立派なVBAエンジニアです。

日々の業務効率化に、ぜひこの知見を役立ててくださいね。それでは、また次のテクニカルセッションでお会いしましょう!

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