こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺め、「なんだか動くけれど、中身がよく分からない」「少し修正するとすぐにエラーで止まってしまう」そんなモヤモヤを抱えていませんか?
今回は、単に動くだけのコードから卒業し、「現場で長期間、誰が触ってもビクともしない堅牢なマクロ」を作り上げるための極意を伝授します。
テーマは「大規模マクロの保守性向上:`Option Explicit`の徹底と独自エラーログ出力クラスの設計」です。
ここをしっかりとクリアすれば、あなたの書くコードは見違えるほど洗練され、CorelDRAW VBAの基本はバッチリですよ。さあ、一緒にプロのエンジニアへの階段を登っていきましょう!
—
なぜ、あなたのマクロはすぐに壊れるのか?
現場でよくある悲劇。それは、「昨日まで動いていたマクロが、今日突然エラーを吐いて止まった」という現象です。原因を調べると、大抵は以下の2つに集約されます。
1. うっかりミスの変数(タイポ)が野放しになっている
2. エラーが起きたとき、画面に味気ないダイアグラムが出るだけで、何が原因で落ちたのか誰も分からない
この2つの課題をスマートに解決するのが、今回解説する「`Option Explicit`の強制」と「独自エラーログ出力クラスの設計」です。
—
1. 変数の宣言ミスを根絶する:`Option Explicit`の魔法
VBAを書くとき、変数の型を宣言せずにいきなり使い始めていませんか?
例えば、以下のようなコードです。
‘ 悪い例:変数の宣言なし
Sub DrawBox()
sze = 100 ‘ ほんとは size と書きたかった!
ActiveLayer.CreateRectangle 0, 0, sze, sze
End Sub
上記のコード、`sze` という変数に 100 を代入していますが、その下の行では `sze` を使っているつもりが、もし `size` と打ち間違えていたら……?
VBAは勝手に「新しい空っぽの変数 `size` が出てきたぞ」と勘違いし、四角形は描画されず、エラーすら出ずにスルーされます。これではデバッグのしがえがありません。
解決策:モジュールの一番上に `Option Explicit` を書く
この「うっかりミス」をVBAのコンパイラ(翻訳者)に厳しくチェックさせるお呪いが、`Option Explicit`(明示的な変数宣言の強制)です。
Option Explicit ‘ ←これをモジュールの最上部に必ず書く!
Sub DrawBoxProperly()
Dim sze As Double
sze = 100
ActiveLayer.CreateRectangle 0, 0, sze, sze
End Sub
これを記述しておくと、万が一変数名を打ち間違えたときに、コードを実行する前に「変数が見つかりません」とVBAが怒って教えてくれます。大規模なマクロになればなるほど、この規律があなたを救う防壁となります。
> 💡 プロからのアドバイス
> VBAのVBE(編集画面)のメニューにある `[ツール] > [オプション]` から、「変数の宣言を強制する」にチェックを入れておきましょう。新しいモジュールを作ったときに、自動で `Option Explicit` が挿入されるようになります。
—
2. エラーを「黙らせない」:独自エラーログ出力クラスの設計
マクロを実行中に、ユーザーの環境や予期せぬデータ(例えば、壊れたSVGファイルのインポートなど)によってエラーが発生することは避けられません。そんなとき、`On Error Resume Next` でエラーを無理やり無視していませんか? それは一番やってはいけない悪手です。
エラーが起きたなら、「いつ、どこで、どんなエラーが起きたのか」をテキストファイルに記録(ロギング)し、優しくユーザーに知らせるのがプロの作法です。
VBAには「クラスモジュール」という、機能を部品化する強力な仕組みがあります。今回は、エラー記録専用のクラス(名前を `ErrorLogger` としましょう)を設計します。
ステップ1:クラスモジュールの作成
VBEのメニューから `[挿入] > [クラス モジュール]` を選択し、プロパティウィンドウで名前を `ErrorLogger` に変更してください。
そして、以下のコードを貼り付けます。
‘ ==========================================
‘ クラス名: ErrorLogger
‘ 概要: 発生したエラーをタイムスタンプ付きでテキストに記録する
‘ ==========================================
Option Explicit
Private m_LogFilePath As String
‘ クラス初期化時にログファイルの保存先を決定
Private Sub Class_Initialize()
‘ CorelDRAWドキュメントと同じフォルダ、またはデスクトップ等に出力
m_LogFilePath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\CorelDraw_Macro_Error.log”
End Sub
‘ エラー記録メソッド
Public Sub LogError(ByVal moduleName As String, ByVal procedureName As String, ByVal errNumber As Long, ByVal errDescription As String)
Dim fileNum As Integer
fileNum = FreeFile ‘ 空いているファイル番号を取得
‘ ログファイルに追記モードで書き込み
Open m_LogFilePath For Append As #fileNum
Print #fileNum, “—————————————-”
Print #fileNum, “発生日時: ” & Now
Print #fileNum, “モジュール: ” & moduleName
Print #fileNum, “プロシージャ: ” & procedureName
Print #fileNum, “エラー番号: ” & errNumber
Print #fileNum, “詳細: ” & errDescription
Close #fileNum
‘ ユーザーへの優しい通知
MsgBox “処理中にエラーが発生しました。” & vbCrLf & _
“詳細なログをデスクトップに保存しました。” & vbCrLf & _
“管理者にお問い合わせください。”, vbCritical, “エラー通知”
End Sub
ステップ2:標準モジュールでのクラスの呼び出し
作成したエラーロガークラスを、実際の描画処理を行う標準モジュールから呼び出してみましょう。
Option Explicit
Sub ProcessCorelDrawTasks()
Dim logger As New ErrorLogger ‘ クラスのインスタンス化
On Error GoTo ErrorHandler ‘ エラー発生時のジャンプ先を指定
‘ — ここからメインの処理 —
‘ わざとエラーを発生させるテスト(ゼロ除算)
Dim a As Integer, b As Integer, c As Integer
a = 10
b = 0
c = a / b ‘ ←ここでエラー 11 が発生する
Exit Sub
ErrorHandler:
‘ エラーをキャッチしたら、クラスに詳細を投げる
logger.LogError “Module1”, “ProcessCorelDrawTasks”, Err.Number, Err.Description
End Sub
このコードを実行すると、画面には「処理中にエラーが発生しました」というポップアップが表示され、デスクトップには以下のようなログファイルが自動生成されます。
—————————————-
発生日時: 2023/10/25 14:30:00
モジュール: Module1
プロシージャ: ProcessCorelDrawTasks
エラー番号: 11
詳細: ゼロで除算しました。
これさえあれば、「現場で何が起きたのか」を後から完璧にトレースできますね。
—
まとめ:堅牢なコードがあなたの作業時間を自由にする
今回は、CorelDRAW VBAの大規模開発における基礎中の基礎、そして最も重要な「`Option Explicit`による変数の厳格化」と「クラスモジュールを活用したエラーロギング」について解説しました。
- 変数の打ち間違いを防ぐために `Option Explicit` を必ず書く。
- エラーは隠さず、クラスを使ってテキストファイルに記録・保存する。
この2つを意識するだけで、あなたが書くマクロの品質はアマチュアレベルからプロのエンジニアレベルへと一気に飛躍します。エラーに怯える日々にサヨナラし、快適で自動化されたCorelDRAWライフを手に入れましょう!
ここをクリアしたあなたなら、もうCorelDRAW VBAの基本はバッチリです。次のステップへ進んで、さらに高度な図形操作の自動化に挑戦してみてくださいね。それでは、また次の記事でお会いしましょう!
