こんにちは!CorelDRAW VBAの世界へようこそ。
私はチーフアーキテクトとして、日夜たくさんのデザイン自動化の仕組みを作っています。
「マクロの記録」ボタンを押して操作を記録してみたものの、いざ再生しようとしたらエラーが出たり、固定の数値になってしまって応用が利かなかったり……そんな壁にぶつかっていませんか?
今回は、プログラミング初学者や「マクロの記録から一歩抜け出したい!」と願うあなたに向けて、選択したベクターオブジェクトの正確な外形寸法を計算し、ドキュメントの傍らに自動でテキストとして焼き込む実用マクロを徹底解説します。
ここをクリアすれば、CorelDRAW VBAの「動的なオブジェクト操作の基本」はバッチリです。一緒にコードの裏側にある本質を紐解いていきましょう!
—
なぜ「選択中のサイズ」を自動化するのか?
デザインの現場では、制作したパーツの寸法(幅と高さ)を注釈として記載する作業が頻発します。手動でバウンディングボックスを確認し、テキストツールを持ち替えて「W: 100mm / H: 50mm」などと打ち込む……。この作業、数点ならまだしも、何十点もあると途方もない時間がかかりますよね。
今回作成するマクロは、以下のステップを瞬時に実行します。
1. 今まさに選択されているオブジェクトを特定する。
2. そのオブジェクトの「幅(Width)」と「高さ(Height)」をプログラムで取得する。
3. 取得した数値を分かりやすい文字列に整形し、オブジェクトのすぐ近くにテキストとして配置する。
この数行のスクリプトをマスターするだけで、あなたのCorelDRAW作業は劇的にスピードアップします。
—
現場でそのまま使える!自動寸法書き込みマクロ
まずは、以下のコードをCorelDRAWのVBAエディタ([Alt] + [F11])に貼り付けてみてください。
Sub InsertDimensionText()
‘ —————————————————-
‘ 選択シェイプの寸法を取得し、テキストとして自動配置するマクロ
‘ —————————————————-
‘ エラーハンドリングの基本:オブジェクトが未選択の場合の対策
If ActiveSelection.Shapes.Count = 0 Then
MsgBox “寸法を取得するオブジェクトを選択してください。”, vbExclamation, “CorelDRAW自動化”
Exit Sub
End If
‘ アクティブなドキュメントの単位系を保持(必要に応じてミリメートルに固定)
Dim originalUnit As Long
originalUnit = ActiveDocument.Unit
ActiveDocument.Unit = cdrMillimeter ‘ 寸法をミリメートルで計算・表示するため
‘ 選択されているオブジェクトを変数に格納
Dim sh As Shape
Set sh = ActiveSelection.Shape
‘ 幅と高さを取得(小数点第2位までフォーマット)
Dim w As Double, h As Double
w = Round(sh.SizeWidth, 2)
h = Round(sh.SizeHeight, 2)
‘ 焼き込むテキスト文字列を作成
Dim dimText As String
dimText = “W: ” & w & ” mm” & vbCrLf & “H: ” & h & ” mm”
‘ オブジェクトの右下にテキストを配置する座標を計算
‘ sh.LeftX は左端、SizeWidth は幅、TopX は上端、SizeHeight は高さ
Dim posX As Double, posY As Double
posX = sh.LeftX + sh.SizeWidth + 5 ‘ オブジェクトの右端から +5mm 離す
posY = sh.TopY ‘ オブジェクトの上端に合わせる
‘ ドキュメントにテキストシェイプを作成
Dim txtShape As Shape
Set txtShape = ActiveLayer.CreateArtisticText(posX, posY, dimText)
‘ テキストの見た目を整える(フォントサイズなどを指定)
With txtShape.Text.Story
.Size = 9 ‘ フォントサイズを9ptに
.Font = “Meiryo” ‘ フォントをメイリオに指定
End With
‘ ドキュメントの単位を元に戻す
ActiveDocument.Unit = originalUnit
‘ 完了メッセージ
MsgBox “寸法テキストの生成が完了しました!”, vbInformation, “完了”
End Sub
—
コードの核心を解説:ここがVBAのキモ!
ただコードをコピペするだけではエンジニアとしての血肉になりません。このスクリプトに隠されたCorelDRAW特有の重要な仕組みを3つ解説します。
1. `ActiveSelection` と `Shape` のライフサイクル
CorelDRAW VBAでは、画面上でユーザーが選んでいるものは `ActiveSelection` というコレクション(集まり)として即座に取得できます。
今回は「1つのオブジェクトが選択されている」ことを前提に、`ActiveSelection.Shape` を使って単一の `Shape` オブジェクトとして変数 `sh` に代入しています。
オブジェクト指向の世界では、この `sh` 変数を通じて、位置、サイズ、色などを自在にコントロールできるようになります。
2. 単位系(Unit)の罠を制する
ここがプロが必ず押さえるポイントです。CorelDRAWのドキュメントは、ユーザーの環境によって「ミリメートル」「インチ」「ピクセル」など、様々な単位で開かれます。
もしユーザーが「インチ」で作業しているときにこのマクロを走らせたら、意図しない数値(`1` が `25.4mm` になるなど)が出てしまいます。
そのため、コードの序盤で強制的に `ActiveDocument.Unit = cdrMillimeter` と指定し、処理の最後で元の単位に戻す(`originalUnit` の復元)という丁寧な後始末を入れています。これがプロのコードです。
3. 座標計算(`LeftX` と `TopY`)
CorelDRAWのキャンバス座標系は、「左下」が原点 (0,0) ではなく、「左上」が原点(厳密にはページの基準に基づくが、シェイプのバウンディングボックスプロパティは直感的に扱いやすくなっています)です。
オブジェクトの右側にテキストを配置するため、「左端の位置(`LeftX`)+ 幅(`SizeWidth`)」に少しの余裕(`+ 5`)を足した位置をテキストのX座標(`posX`)として計算しています。
—
陥りやすいエラーと回避のコツ
初学者が必ずと言っていいほどハマるポイントを事前にクリアしておきましょう。
- エラー:「オブジェクトが必要です (Error 424)」
- 原因: 何も選択していない状態でマクロを実行したとき。
- 対策: 今回のコードの最初に入れている `If ActiveSelection.Shapes.Count = 0 Then …` というガード節(番犬のようなコード)が、このエラーを未然に防いでくれます。実務のコードでは、この「空振り対策」を必ず入れるようにしましょう。
- 寸法が小数点だらけで汚い
- 原因: `sh.SizeWidth` は内部で高精度な浮動小数点数を持っているため、そのまま出力すると `100.0000123 mm` のようになってしまいます。
- 対策: `Round(sh.SizeWidth, 2)` と囲むことで、小数点第2位で美しく四捨五入しています。
—
まとめと次のステップ
今回は、選択したベクターオブジェクトの寸法を自動計算し、テキストとしてドキュメントに焼き込むマクロを通じて、CorelDRAW VBAの「選択オブジェクトの操作」「単位系の制御」「座標計算」の基礎を解説しました。
ここをクリアできれば、次は「選択した複数のオブジェクトすべてに一括で処理を行うループ処理(`For Each`)」や、「レイヤーを自動で分けて配置する処理」へとステップアップできます。
ぜひ今日のコードをあなたのCorelDRAW環境に組み込んで、退屈な手作業を自動化する快感を味わってみてください。
それでは、次回の高度な自動化の世界でお会いしましょう!
