CorelDRAWのオートメーションの世界へようこそ。
マクロの記録ボタンを押して「動いた!」と喜ぶ段階は、もう卒業しましょう。今日は、CorelDRAWという巨大なアプリケーションの「生命線」を握る、イベントハンドリングの深淵に踏み込みます。
ドキュメントを閉じる、という何気ない操作。ここには、データの整合性やバックアップのタイミングといった「業務の命運」がかかっています。今回は、プロフェッショナルが避けて通れない、ドキュメント破棄時の厳格な制御について解説します。
—
1. なぜ「閉じる」を制御する必要があるのか?
通常、ユーザーが「×」ボタンを押せばドキュメントは閉じます。しかし、プロの現場では以下のリスクが常に付きまといます。
- 保存忘れによるデータ損失: 修正履歴のバックアップが取れていない。
- 不適切な状態での終了: 外部データベースとの同期が完了していない。
- 整合性の欠如: 特定のレイヤーが隠れたまま保存されると困る業務フロー。
これらを解決するために、VBAには「ドキュメントが閉じられる瞬間に介入する」仕組みが用意されています。
—
2. イベントハンドリングの要:`DocumentCloseEx` の真実
CorelDRAW VBAでイベントを扱うには、標準モジュールではなくクラスモジュールを使用します。これが「マクロの記録」から脱却するための第一歩です。
ステップ1:クラスモジュールの作成
VBAエディタで「挿入」>「クラスモジュール」を選択し、名前を `clsAppEvents` に変更してください。ここに以下のコードを記述します。
‘ — クラスモジュール: clsAppEvents —
‘ Public WithEvents を使うことで、CorelDRAWのイベントを捕捉します
Public WithEvents AppEvents As Application
‘ ドキュメントが閉じられる「直前」に発生するイベント
Private Sub AppEvents_DocumentCloseEx(ByVal Doc As Document, Cancel As Boolean)
‘ 厳格な整合性チェック
If MsgBox(“ドキュメントを閉じる前に、自動バックアップを生成しますか?”, vbYesNo + vbQuestion) = vbYes Then
‘ ここにバックアップ保存処理を記述
Debug.Print “バックアップ中: ” & Doc.FileName
‘ Doc.SaveAs “C:\Backups\” & Doc.Title & “.cdr”
Else
‘ ユーザーの意志で処理をキャンセルさせることも可能
‘ Cancel = True ‘ これを有効にすると、ユーザーはドキュメントを閉じられなくなる
End If
End Sub
ステップ2:イベントの初期化
イベントは「監視を開始する」という宣言が必要です。標準モジュールに以下のコードを記述します。
‘ — 標準モジュール —
Dim myEvents As clsAppEvents
Public Sub InitializeAppEvents()
‘ イベント監視用のクラスを実体化
Set myEvents = New clsAppEvents
‘ 現在のApplicationオブジェクトを監視対象に設定
Set myEvents.AppEvents = Application
MsgBox “ドキュメント監視システムを起動しました。”
End Sub
—
3. 陥りやすい「落とし穴」
この実装で初心者が必ず躓くポイントが2つあります。
① インスタンスの寿命(変数のスコープ)
`myEvents` をサブプロシージャ内のローカル変数で宣言してしまうと、プロシージャが終わった瞬間に変数が破棄され、イベント監視も止まります。必ず標準モジュールの先頭で `Public` または `Private` なモジュールレベル変数として宣言してください。
② イベントの連鎖と無限ループ
`DocumentCloseEx` 内でさらに `Doc.Save` などを行う際、条件分岐を誤ると「保存を促すダイアログ」と「自作のイベント」がループし、CorelDRAWがフリーズする原因になります。必ず「処理の終了条件」を明確にしてください。
—
4. プロの現場からのアドバイス
「ドキュメントを閉じる」というイベントは、ユーザーの「思考の終わり」です。ここで無理にダイアログを出しすぎると、ユーザーはストレスを感じます。
- 静かなるバックアップ: ユーザーに尋ねることなく、裏側で別フォルダにコピーを作成する。
- フラグ管理: `Doc.Dirty` プロパティ(未保存かどうかを判定する真偽値)をチェックし、変更がある場合のみバックアップを走らせる。
‘ 変更がある場合のみバックアップする賢い実装
If Doc.Dirty Then
‘ 変更が確定しているときだけ実行
End If
—
まとめ:ここをクリアすれば、あなたはもう初心者ではない
今回紹介した `DocumentCloseEx` は、単なる「閉じる」イベントではありません。これは、「アプリケーションのライフサイクルを制御下に置く」という、エンジニアとしての第一歩です。
- クラスモジュールでイベントを受け取る。
- グローバル変数でインスタンスを保持する。
- Dirtyプロパティで最小限の負荷で処理を行う。
この3つさえ押さえれば、あなたの作るマクロは「単なる補助ツール」から「業務を支える堅牢なシステム」へと進化します。
さあ、恐れずに自分のコードをCorelDRAWのイベントパイプラインに接続してみてください。きっと、今まで見えなかったアプリケーションの鼓動が聞こえるはずです。応援していますよ。
