こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して得られたコードを眺めるだけの日々は、今日で終わりにしましょう。
今回は、CorelDRAW VBAのピラミッドの最ュートに君臨する「Applicationオブジェクト」の正体に迫ります。ここをクリアすれば、CorelDRAW VBAの基本はバッチリですよ。
それでは、すべての操作の起点となる「最も偉大なオブジェクト」を一緒に紐解いていきましょう。
—
1. Applicationオブジェクトとは何か?(CorelDRAW世界の大本山)
VBA(Visual Basic for Applications)の世界では、操作したい対象がすべて「オブジェクト(モノ)」として階層構造(ツリー構造)で管理されています。
その最上位、つまりCorelDRAWというアプリそのものを指し示すのが `Application` オブジェクト です。
図解すると、このようなピラミッド構造になっています。
Application (CorelDRAW アプリケーション自身)
┣ Documents (現在開いているすべてのドキュメントの集合体)
┃ ┣ Document (個別のドキュメント。これが「今作業しているファイル」)
┃ ┃ ┣ Pages (ページの集合体)
┃ ┃ ┗ Layers (レイヤーの集合体)
┗ ActiveDocument (現在アクティブなドキュメントに一発でアクセスするショートカット)
プログラミング初心者がまず知るべき重要ポイントは、「すべてのコードは、この `Application` から始まる(あるいは `Application` の下にある)」ということです。
—
2. 省略の美学:`Application` は書かなくても動く?
実は、CorelDRAWのVBAエディタ(VBE)を開いてコードを書くとき、最上位の `Application` は省略して書くことが許されています。
例えば、次の2つのコードは全く同じ意味です。
‘ 1. 省略せずに書いた場合
Dim appVersion As String
appVersion = Application.Version
‘ 2. 省略して書いた場合(一般的)
Dim appVersion As String
appVersion = Version
「じゃあ省略すればいいじゃん!」と思うかもしれませんが、初心者のうちはあえて `Application` やその周辺の階層を意識することが、オブジェクトモデルを脳内にインストールする最速の近道です。
—
3. 【実践】起動中のドキュメント情報を取得するコード
それでは、現在CorelDRAWで何が起きているのかを、VBAを使って「おしゃべり」させてみましょう。
以下のコードをVBEの標準モジュールに貼り付けて実行してみてください。現在開いているドキュメントの数や、それぞれのファイル名・パスをメッセージボックスで教えてくれます。
Sub CheckCurrentDocuments()
‘ —————————————————————-
‘ 目的: Applicationオブジェクトを通じて、起動中のドキュメント情報を取得する
‘ —————————————————————-
Dim docCount As Long
Dim doc As Document
Dim msg As String
‘ 1. Applicationオブジェクトから、開かれているドキュメントの総数を取得
‘ (Application.Documents.Count でも同じ意味です)
docCount = Documents.Count
If docCount = 0 Then
MsgBox “現在、開かれているドキュメントはありません。”, vbExclamation, “ドキュメント情報”
Exit Sub
End If
‘ 2. 基本情報をメッセージのヘッダーとして作成
msg = “【CorelDRAW 稼働状況】” & vbCrLf & _
“開かれているドキュメントの数: ” & docCount & “個” & vbCrLf & _
“—————————————-” & vbCrLf
‘ 3. For Each を使って、開いているすべてのドキュメントを巡回(ループ)する
For Each doc In Documents
msg = msg & “・ファイル名: ” & doc.Name & vbCrLf
‘ まだ一度も保存されていない(名前のない)新規ドキュメントへの配慮
If doc.Saved = False Then
msg = msg & ” (パス: 未保存の新規ファイル)” & vbCrLf
Else
msg = msg & ” (パス: ” & doc.FullFileName & “)” & vbCrLf
End If
msg = msg & “—————————————-” & vbCrLf
Next doc
‘ 4. まとめた情報を一度にポップアップ表示
MsgBox msg, vbInformation, “ドキュメント解析完了”
End Sub
このコードのポイント
- `Documents.Count`: ズバリ「今、何枚のキャンバス(ファイル)が開いているか」を数値で返します。
- `For Each doc In Documents`: 開いているドキュメントが1つであれ5つであれ、順番にすべてを捕まえて変数 `doc` に代入し、処理を繰り返す魔法の構文です。
- `doc.Name` と `doc.FullFileName`: 前者はファイル名のみ(例: `Design.cdr`)、後者はフルパス(例: `C:\Work\Design.cdr`)を取得します。
—
4. 初学者が絶対に陥る「トラップ」とエラー回避の知見
ここで、現場のエンジニアとして一つ、初心者が必ずハマる罠についてお伝えしておきます。
罠:「開いているドキュメントが1つもない」状態で `ActiveDocument` を呼び出す
よくあるのが、CorelDRAWを起動しただけで、まだ何もファイルを開いていない(または全部閉じた)状態で、以下のようなコードを実行してしまうケースです。
‘ ⚠️ 危険なコード例
Sub BadExample()
‘ まだドキュメントがないのに、無理やりアクティブなドキュメントを触ろうとする
ActiveDocument.Pages(1).ActiveLayer.CreateRectangle 0, 0, 100, 100
End Sub
これを実行すると、容赦なく 「実行時エラー ’91’: オブジェクト変数または With ブロック変数が設定されていません。」 という、VBA初心者メンタル粉砕エラーが発生します。
対策:必ず「存在確認」のワンクッションを置く
実務で頑健(ロバスト)なマクロを書くときは、処理の前に必ず「ドキュメントが本当に存在するか?」を確認するガード節を入れましょう。
Sub SafeExample()
‘ ガード節:ドキュメントがなければ処理を中断する
If Documents.Count = 0 Then
MsgBox “先にドキュメントを作成または開いてください。”, vbCritical
Exit Sub
End If
‘ ここに安全な処理を書く
MsgBox “安全に処理を実行できます!現在のドキュメント名: ” & ActiveDocument.Name
End Sub
この「何も開いていない状態があり得る」というオブジェクトのライフサイクルを意識できるようになると、あなたの書くコードの品質はプロのそれへと一気に飛躍します。
—
おわりに
今回は、CorelDRAW VBAの最上位である `Application` オブジェクトの基本と、開いているドキュメントの情報を安全に取得する方法を解説しました。
- アプリケーション全体を統括するのは `Application`(省略可能)
- 開いているファイル群を束ねているのは `Documents`
- 操作対象が存在するか(`Count > 0` か)を確認してから触るのがプロの流儀
ここをクリアできれば、次はページやレイヤー、そして図形(シェイプ)の操作へと進む準備は万全です。
ぜひご自身の環境でコードを動かして、VBAとの対話を楽しんでみてくださいね!
