【入門編】ActiveDocumentとDocumentsコレクションの使い分け:複数ドキュメントを開いた状態での安全な対象指定 – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して得られたコードを眺めるだけの日々は、今日で終わりにしましょう。

実務でCorelDRAWをバリバリ使っていると、「複数の図面ファイルを開いたまま、一括で処理を走らせたい」という状況に必ず直面します。そんなとき、なんとなく `ActiveDocument` だけを頼りにコードを書いていると……とんでもない大事故(意図しない顧客の図面を書き換えてしまう等!)を引き起こす原因になります。

今回は、複数ドキュメント環境を完全掌握し、プロとして安全かつ確実にターゲットを操作するための極意を伝授します。ここをクリアすれば、CorelDRAW VBAの基本はバッチリですよ!

—

1. なぜ `ActiveDocument` だけでは危険なのか?

CorelDRAW VBAを学び始めると、真っ先に目にするのがこのオブジェクトです。

‘ 今アクティブなドキュメントのページ数を取得する
Dim pCount As Long
pCount = ActiveDocument.Pages.Count

一見、とても直感的で分かりやすいですよね。しかし、ここに大きな罠があります。

「アクティブ」とは、ユーザーが今クリックしている画面にすぎない

`ActiveDocument` は文字通り、「今、画面の最前面でフォーカス当たっている(アクティブな)ドキュメント」を指します。
もし、マクロの実行中にユーザーが別のウィンドウをクリックしたり、バックグラウンド処理のタイミングがズレたりすると、「今どのドキュメントがアクティブか」が刻一刻と変わってしまうのです。

実務の現場で「A社の図面を処理するはずが、裏で開いていたB社のロゴデータを改変してしまった……」なんてことになったら大惨事ですよね。プロのエンジニアは、この「気分屋」な `Active` に依存しません。

—

2. Documentsコレクションで「名指し」で管理する

CorelDRAWアプリケーションには、現在開かれているすべてのドキュメントを管理する `Documents` コレクションという強力なリストが存在します。

これを使うと、ドキュメントを「アクティブだから」ではなく、「名前で」「インデックス番号で」確実に指定して変数に格納することができます。

コレクションの基本イメージ

  • `Documents.Count` : 開かれているファイルの総数
  • `Documents(1)` または `Documents(“filename.cdr”)` : 特定のドキュメントの指名買い

これを利用して、オブジェクトを変数(Document型)にしっかりバインド(結びつけ)してから操作するのが、実務における鉄則です。

—

3. 【実践】安全なドキュメント操作のコードパターン

それでは、実際に複数のドキュメントを開いている環境を想定した、安全で美しいコードを見てみましょう。

以下のコードは、「現在開いているすべてのドキュメントを巡回し、それぞれの1ページ目に特定のテキストを挿入する」という実用的なサンプルです。

Sub SafeMultiDocumentProcess()
‘ 1. 宣言セクション:型を明示してメモリを正しく扱う
Dim doc As Document
Dim i As Long

‘ 2. 安全確認:そもそもドキュメントが開かれているか?
If Documents.Count = 0 Then
MsgBox “処理対象のドキュメントが1つも開かれていません。”, vbExclamation, “処理中断”
Exit Sub
End If

‘ 3. ユーザーへの優しさ:画面描画をロックして処理速度を爆発的に上げる
Application.Optimization = True
Application.EventsEnabled = False ‘ イベントも一時停止

On Error GoTo ErrorHandler ‘ エラー時の後始末を担保

‘ 4. Documentsコレクションを巡回(For Eachの美しさ)
For Each doc In Documents
‘ 対象ドキュメントを明示的にアクティブにする必要がある場合はここで切り替え
doc.Activate

‘ 各ドキュメントの1ページ目を対象にする
doc.Pages(1).Activate

‘ 例:1ページ目の座標 (100mm, 100mm) に文字を配置
‘ ※単位系は現在のドキュメント設定に依存します
Dim sText As Shape
Set sText = doc.ActiveLayer.CreateArtisticText(100, 100, “処理済み: ” & doc.Name)

‘ プロパティの変更
sText.Fill.UniformColor.CMYKAssign 0, 100, 100, 0 ‘ 真っ赤な文字にする

Next doc

‘ 5. 正常終了時の後始末
Application.Optimization = False
Application.EventsEnabled = True

MsgBox “全 ” & Documents.Count & ” 件のドキュメント処理が完了しました!”, vbInformation, “成功”
Exit Sub

ErrorHandler:
‘ エラーが発生しても、必ず描画ロックとイベントを解除する(これプロの基本!)
Application.Optimization = False
Application.EventsEnabled = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
End Sub

—

4. コードのここがポイント!プロの技法解説

上記のコードには、現場で生き残るためのテクニックが詰め込まれています。いくつか重要なポイントを解説しましょう。

① `For Each doc In Documents` の採用

インデックス(`For i = 1 To Documents.Count`)で回すことも可能ですが、ドキュメントの開閉や削除が絡む複雑な処理では、`For Each` の方がコレクションの列挙において安全かつスマートです。何よりコードが読みやすくなります。

② `Application.Optimization = True` の魔力

複数のドキュメントに対して一括処理を行う際、CorelDRAWはファイルが切り替わるたびに画面の再描画(プレビューの更新)を行おうとします。これが処理を非常に重くする原因です。
処理の直前で `Optimization = True`(描画停止)にし、処理が終わったら `False` に戻す。たったこれだけで、マクロの実行速度が何倍にも跳ね上がります。

③ エラーハンドリング(後始末の担保)

もしマクロの途中でエラー(ファイルが読み取り専用だった等)が発生した場合、画面描画がロックされたままVBAが停止し、CorelDRAWがフリーズしたような状態になってしまいます。
`On Error GoTo ErrorHandler` を仕掛け、どんな結末を迎えても必ず `Optimization = False` を通る構造にすることが、実務レベルのマクロの絶対条件です。

—

まとめ

今回は `ActiveDocument` の危険性と、それを回避するための `Documents` コレクションの活用法について解説しました。

  • `ActiveDocument` はユーザーの操作で変わってしまう「移り気な存在」
  • 安全な処理には `Documentsコレクション` と `Document型変数` を使う
  • 複数ファイルを扱うときは `Optimization` でパフォーマンスと安定性を担保する

この基本さえ押さえておけば、どれだけ大量のファイルが同時に開かれていても、あなたのマクロが誤動作を起こすことはありません。

さあ、恐れずに複数のファイルを開いて、このコードを試してみましょう。あなたのCorelDRAW自動化スキルは、確実に次のステージへ進んでいますよ!

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