こんにちは!CorelDRAWを使ったデザイン作業の自動化、日々の業務でお疲れ様です。
「マクロの記録」から一歩踏み出し、自分でVBA(Visual Basic for Applications)を書き始めたはいいものの、「動いていたはずのコードが急に動かなくなった」「エラーが出ても原因がどこにあるのかさっぱり分からない」と頭を抱えていませんか?
かつての私もそうでした。CorelDRAWのオブジェクトモデルは非常に強力ですが、それゆえに場当たり的なコードを書いていると、すぐにメンテナンス不可能な「スパゲッティコード」になってしまいます。
今回は、あなたが書いたマクロを「属人化の呪縛」から解放し、現場で安心して運用できるプロフェッショナルなコードへと生まれ変わらせるための極意をお伝えします。ここをクリアすれば、CorelDRAW VBAの基本はバッチリですよ!
—
なぜ「Option Explicit」が命綱なのか?
VBAエディタを開いたとき、モジュールの最上部にこの1行があるかないか。それがエンジニアとしての生死を分けます。
Option Explicit
暗黙の型の罠と、未定義変数の恐怖
`Option Explicit` を記述しないでおくと、VBAは「宣言されていない変数」を勝手に`Variant`型として新しく作り出します。
例えば、以下のようなコードがあったとします。
‘ Option Explicitがない世界
Sub BadExample()
Dim myShape As Shape
Set myShpae = ActivePage.CreateRectangle(0, 0, 100, 100) ‘ 痛恨のスペルミス! (myShape と myShpae)
‘ この後、myShape を操作しようとしても、中身は空っぽのまま…
myShape.Fill.UniformColor.CmykAssign 0, 100, 100, 0
‘ -> 「オブジェクト変数またはWithブロック変数が見つかりません」という恐怖のエラーへ
スペルミスをしているにもかかわらず、VBAはエラーを出さずに「`myShpae`という新しい変数を勝手に作ったんだな」と解釈して実行してしまいます。これが何百行もあるコードに紛れ込んだら、原因特定に何時間も溶かすことになります。
解決策:強制宣言の義務化
モジュールの先頭に必ず `Option Explicit` を書きましょう。これだけで、スペルミスや変数宣言のし忘れをVBAがコンパイル時に検知し、未然に防いでくれます。
> 💡 先輩からのアドバイス
> VBE(Visual Basic Editor)のメニューから [ツール] > [オプション] を開き、[編集] タブにある [変数の宣言を強制する] にチェックを入れておいてください。これで、新しい標準モジュールを作ったときに自動で `Option Explicit` が挿入されるようになります。
—
現場で役立つ!独自エラーログ出力クラスの作成
マクロを他のデザイナーやオペレーターに渡したとき、一番怖いのが「エラーで止まりました。画面には何やら英語のメッセージが出ています」という報告です。
「どの書類(Document)の、どのページ(Page)の、どのレイヤー(Layer)を触っているときに死んだのか」を自動で記録する、専用のエラーログ出力メカニズムをクラスモジュールで作ってみましょう。
1. クラスモジュールの準備
VBEの [挿入] > [クラス モジュール] を選択し、プロパティウィンドウで名前を `Logger` に変更してください。
以下が、ファイルシステム(FileSystemObject)を使ってデスクトップ等にログを吐き出すエリートクラスのコードです。
‘ =================================ログ出力クラス (Logger) =================================
Option Explicit
Private Fso As Object
Private LogFilePath As String
‘ クラス初期化時にログファイルのパスを決定
Private Sub Class_Initialize()
Set Fso = CreateObject(“Scripting.FileSystemObject”)
‘ デスクトップに “CorelDRAW_Macro_Error.log” という名前で出力します
Dim wsh As Object
Set wsh = CreateObject(“WScript.Shell”)
LogFilePath = wsh.SpecialFolders(“Desktop”) & “\CorelDRAW_Macro_Error.log”
Set wsh = Nothing
End Sub
‘ 外部から呼び出すエラー書き込みメソッド
Public Sub WriteLog(ByVal ErrorNumber As Long, ByVal ErrorDescription As String, ByVal ModuleInfo As String)
On Error Resume Next ‘ ログ書き込み自体のエラーで無限ループするのを防ぐ
Dim ts As Object
‘ ファイルが存在しない場合は作成(True)、追記モード(8)で開く
Set ts = Fso.OpenTextFile(LogFilePath, 8, True)
ts.WriteLine “==================================================”
ts.WriteLine “発生日時: ” & Now
ts.WriteLine “モジュール/箇所: ” & ModuleInfo
ts.WriteLine “エラー番号: ” & ErrorNumber
ts.WriteLine “エラー内容: ” & ErrorDescription
ts.WriteLine “ActiveDoc: ” & IIf(ActiveDocument Is Nothing, “なし”, ActiveDocument.Name)
ts.WriteLine “==================================================”
ts.WriteLine “”
ts.Close
Set ts = Nothing
End Sub
Private Sub Class_Terminate()
Set Fso = Nothing
End Sub
2. 標準モジュールからの実践的な呼び出し
それでは、先ほど作った `Logger` クラスを活用する、堅牢なメイン処理の書き方を見てみましょう。ここでは、アクティブドキュメントのレイヤー安全確認も含めた実用的なコードにします。
Option Explicit
Sub MainProcess()
‘ エラーハンドリングの開始
Dim appLogger As New Logger
On Error GoTo ErrorHandler
‘ — 【CorelDRAW操作の安全確認】 —
‘ ドキュメントが開かれているか?
If ActiveDocument Is Nothing Then
MsgBox “処理対象のドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If
‘ アクティブページの取得とレイヤーの安全確認
Dim activeLay As Layer
Set activeLay = ActivePage.ActiveLayer
If activeLay.Locked Then
MsgBox “現在のレイヤー [” & activeLay.Name & “] はロックされています。ロックを解除してください。”, vbExclamation
Exit Sub
End If
‘ — メインの処理(例:矩形を描画して特定の色を塗る) —
Dim rect As Shape
Set rect = ActivePage.CreateRectangle(50, 50, 150, 150)
rect.Fill.UniformColor.CmykAssign 0, 100, 100, 0 ‘ シアンの四角形
‘ わざとエラーを起こすテスト(コメントアウトを外すとログ出力テストができます)
‘ Err.Raise 11, , “意図的なゼロ除算テストエラー”
MsgBox “すべての処理が正常に完了しました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ 異常発生時のキャッチ
appLogger.WriteLog Err.Number, Err.Description, “MainProcess (Page: ” & ActivePage.Index & “)”
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
まりの詳細な原因はデスクトップのログファイルに記録されました。” & vbCrLf & _
“管理者にお問い合わせください。”, vbCritical, “システムエラー”
End Sub
—
プロのコードが持つ「3つの美徳」
今回紹介したアプローチを取り入れることで、あなたの書くCorelDRAWマクロには以下の3つの美徳が宿ります。
1. フェイルセーフ(Fail-Safe)の思想
「ドキュメントが開かれているか」「レイヤーがロックされていないか」といった前提条件を処理の前に必ずチェックし、事故を未然に防ぎます。
2. サイレント・デバッグの実現
現場でエラーが起きても、ユーザーがログファイルをメールで送ってくれるだけで、開発者は一瞬で「どのコードのどの行で何が起きたか」を特定できます。
3. 可読性と拡張性
変数が強制宣言され、エラー処理がカプセル化されているため、半年後に自分が見返しても、他の人がコードを引き継いでも、すぐに改修が可能です。
まとめ
「動けばいいや」のコードから卒業し、「保守しやすく、エラーに強く、現場で信頼される」コードを書くこと。それはCorelDRAW VBAエンジニアとしての大きなステップアップです。
`Option Explicit` を書き、専用のログクラスを仕込む。この一手間で、あなたの業務自動化ライフは劇的に安定したものに変わります。
さあ、今日の業務から、あなたのVBAコードをプロ仕様にアップグレードしてみませんか?
