CorelDRAW VBAを掌握せよ:外部データを取り込み、自動化の「その先」へ
こんにちは。CorelDRAWの自動化の世界へようこそ。
「マクロの記録」ボタンを押して、生成されたコードの羅列に絶望したことはありませんか?実は、あれはCorelDRAWが「どう動いたか」の足跡であって、エンジニアが書くべき「プログラム」ではありません。
今回は、CAD(DXF/DWG)やOffice系(EMF/WMF)の外部データをCorelDRAWに取り込み、独自のベクター構造に正規化して保存する……そんな現場の「泥臭い自動化」を、スマートに解決する極意を伝授します。
—
1. なぜ「インポート」で躓くのか?
初心者が最も陥りやすい罠は、`Application.CorelScript.FileImport` を使おうとすることです。これはレガシーな手法であり、現代のCorelDRAW VBAではオブジェクトモデルを直接操作する `Layer.Import` を使うのが鉄則です。
ここをクリアすれば、あなたはもう「記録係」ではなく「アーキテクト」の入り口に立っています。
陥りやすいエラー:非同期の壁
外部データは、取り込んだ瞬間にオブジェクトが確定しません。特に複雑なCADデータの場合、インポート直後に `ActiveShape` を参照しようとすると「オブジェクトがありません」というエラーが出ます。
解決の鍵: インポート直後の `ImportFilter` オブジェクトを使い、フィルタの終了処理を待機(Finish)させること。これだけで、自動化の安定性は劇的に向上します。
—
2. 実践:CAD/Officeデータ自動変換スクリプト
以下のコードは、指定したフォルダ内のDXFやEMFを読み込み、CorelDRAW形式(.CDR)に変換して保存するテンプレートです。
Sub ImportAndNormalize()
Dim doc As Document
Dim impFilter As ImportFilter
Dim impOpt As StructImportOptions
Dim filePath As String: filePath = “C:\Data\Source\Sample.dxf”
Dim savePath As String: savePath = “C:\Data\Output\Converted.cdr”
‘ 新規ドキュメントを作成
Set doc = CreateDocument()
‘ インポートオプションの設定
Set impOpt = New StructImportOptions
impOpt.MaintainLayers = True ‘ レイヤー構造を維持
‘ インポート実行
Set impFilter = doc.Layers(1).ImportEx(filePath, cdrDXF, impOpt)
‘ ここが重要!フィルタを完了させるまで待機する
impFilter.Finish
‘ — ここに正規化処理を入れる —
‘ 例:全ての線の太さを0.1mmに統一する
Dim s As Shape
For Each s In doc.ActivePage.FindShapes()
If s.Type = cdrCurveShape Then
s.Outline.Width = 0.00394 ‘ 0.1mmをインチ変換
End If
Next s
‘ 指定フォーマットで保存
doc.SaveAs savePath, cdrCDR
doc.Close
End Sub
—
3. ベクター正規化の「極限知見」
取り込んだデータは、しばしば「汚い」状態です。グループ化されすぎていたり、線がバラバラだったりします。これを正規化する際のプロのテクニックを二つ紹介します。
① グループの解除と階層のフラット化
CADデータは「ブロック」が多重入れ子になっています。`s.UngroupAll` を使うのも手ですが、パフォーマンスを重視するなら、再帰関数(Recursive Function)を使って、特定の条件を満たすオブジェクトだけをルートレイヤーへ吸い上げるのがエレガントです。
② 線の結合(Join Curves)
インポートした線が繋がっていないことはよくあります。`s.Curve.Nodes.Connect` を駆使して、一定範囲内の端点を自動結合する処理を組み込めば、レーザー加工機やカッティングプロッタに渡す際の後工程が劇的に楽になります。
—
4. 安定稼働のためのチェックリスト
自動化を現場に導入する際、以下の項目を必ず確認してください。
- 単位の統一: `ActiveDocument.Unit = cdrMillimeter` で開始時に必ず単位を固定すること。
- エラーハンドリング: `On Error GoTo` を使い、ファイルが存在しない場合やインポート失敗時にログを残すこと。
- イベントの無効化: 大量処理を行う際は `Application.Optimization = True` を宣言して、画面描画を停止させましょう。これだけで処理速度が10倍以上変わります。
—
最後に:自動化は「道具」ではなく「哲学」
CorelDRAW VBAは、単なる作業の代行ツールではありません。設計者が本来向き合うべき「クリエイティブな思考」の時間を生み出すための、あなたの最強の相棒です。
まずはこのコードをコピーして、手元のファイルを一つだけ変換してみてください。その一歩が、あなたの業務を劇的に変えるはずです。
もし詰まったら、オブジェクトブラウザ(F2キー)を開いてください。そこに書かれているメソッドの数々が、次にあなたが何を目指すべきかの地図を示してくれます。
さあ、自動化の旅を楽しみましょう。何かあればいつでも聞いてくださいね。
