CorelDRAW VBAの深淵:実行時エラーを「ゼロ」に抑え込む堅牢な設計思考
CorelDRAW VBAの世界へようこそ。私はこれまで数多の印刷工程、サイン製作、自動製図システムを構築してきたが、初心者が必ずと言っていいほどハマる「死の罠」がある。それは、「存在を前提としたオブジェクト操作」だ。
ユーザーは常に開発者の想像を超える操作をする。ページを勝手に削除し、レイヤー名を「レイヤー 1」から「背景_2023」へ書き換え、10ページしかないドキュメントで100ページ目を指定する。その瞬間、あなたの書いたコードはランタイムエラーを吐き、業務は止まり、ツールの信頼性は失墜する。
今回は、CorelDRAWのページ・レイヤー操作における「絶対に壊れない」エラーハンドリングの実装哲学を伝授しよう。
—
1. なぜ「On Error Resume Next」は悪手なのか
多くのサンデープログラマーは、エラーを握りつぶすために `On Error Resume Next` を多用する。だが、これはプロの現場では「時限爆弾」と同義だ。
例えば、存在しないレイヤーに図形を描画しようとした場合、エラーを無視すると図形は「現在選択されている(意図しない)レイヤー」に描画される。これが数千枚の自動出力で発生したとしたら? 印刷ミスによる数百万の損害を生むのは、あなたのコードだ。
鉄則:エラーは「無視」するのではなく、「予見して回避」するか、「安全に捕捉」せよ。
—
2. ページ操作:インデックスの境界線を見極める
CorelDRAWのページ指定は1ベース(1から始まる)だ。ユーザーが入力したページ番号が `ActiveDocument.Pages.Count` の範囲内にあるかを、アクションを起こす前に必ずチェックしなければならない。
堅牢なページ遷移関数の例
”’
”’
”’ 遷移先のページ番号
”’
Public Function SafeActivatePage(pageIndex As Integer) As Boolean
‘ 1. ドキュメントが開いているか確認
If ActiveDocument Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
SafeActivatePage = False
Exit Function
End If
‘ 2. 範囲チェック(境界値テスト)
If pageIndex < 1 Or pageIndex > ActiveDocument.Pages.Count Then
Debug.Print “Error: 指定されたページ ” & pageIndex & ” は存在しません。”
SafeActivatePage = False
Exit Function
End If
‘ 3. エラーハンドリングを伴う実行
On Error GoTo ErrorHandler
ActiveDocument.Pages(pageIndex).Activate
SafeActivatePage = True
Exit Function
ErrorHandler:
‘ 予期せぬエラー(メモリ不足やファイル破損等)をキャッチ
MsgBox “ページ遷移中に予期せぬエラーが発生しました: ” & Err.Description, vbCritical
SafeActivatePage = False
End Function
—
3. レイヤー操作:存在チェックと自動生成のパターン
レイヤー操作で最も多いエラーは「名前による指定」だ。CorelDRAWでは、存在しないレイヤー名を `Layers(“Temp”)` のように呼び出した瞬間にVBAが停止する。
これを防ぐには、「レイヤーが存在するか確認し、なければ作る(あるいはエラーを返す)」というラッパー関数(Wrapper Function)を通すのが定石だ。
プロフェッショナルなレイヤー取得ロジック
”’
”’
Public Function GetOrCreateLayer(ByRef targetPage As Page, ByVal layerName As String) As Layer
Dim ly As Layer
‘ レイヤーの存在確認
On Error Resume Next ‘ 存在確認のため一時的に許可
Set ly = targetPage.Layers(layerName)
On Error GoTo 0 ‘ 即座に解除
If ly Is Nothing Then
‘ 存在しない場合は作成
On Error GoTo CreateError
Set ly = targetPage.CreateLayer(layerName)
Debug.Print “Layer ‘” & layerName & “‘ を新規作成しました。”
End If
Set GetOrCreateLayer = ly
Exit Function
CreateError:
MsgBox “レイヤーの作成に失敗しました。レイヤー名が不正か、ロックされている可能性があります。”, vbCritical
Set GetOrCreateLayer = Nothing
End Function
—
4. ガイド線の自動配置:座標系の罠を回避する
ガイド線の追加(`Page.Guides.Add`)もエラーの温床だ。特に、マスターレイヤーにガイドを引くのか、ローカルレイヤーに引くのかで挙動が変わる。また、座標値がドキュメントの範囲を大きく逸脱している場合、後続の処理で計算エラーを引き起こす可能性がある。
ガイド線配置のベストプラクティス
”’
”’
Public Sub SetupSmartGuides(targetPage As Page, xVal As Double, yVal As Double)
On Error GoTo GuideError
‘ ガイド線レイヤーがロックされていないか、非表示でないかを確認
‘ CorelDRAWのガイドは通常 “Guides” という特殊なレイヤーに属する
Dim guideLayer As Layer
Set guideLayer = targetPage.Layers(“Guides”)
If guideLayer.Visible = False Then guideLayer.Visible = True
If guideLayer.Editable = False Then guideLayer.Editable = True
‘ 垂直・水平ガイドの配置
targetPage.Guides.AddGuide xVal, 0, xVal, 100 ‘ 垂直
targetPage.Guides.AddGuide 0, yVal, 100, yVal ‘ 水平
Exit Sub
GuideError:
‘ ユーザーに通知しつつ、処理を継続させるか中断させるか判断
Debug.Print “Guide Placement Error: ” & Err.Description
End Sub
—
5. ファイル・データベース連携時の注意点
外部のCSVやデータベースからページ数やレイヤー名を取得して自動生成する場合、以下の3点に注意せよ。
1. 禁則文字のサニタイズ: レイヤー名に使えない文字(CorelDRAWの内部仕様に依存)が含まれていないか。
2. 型変換の保証: CSVから読み込んだ「10」は文字列(String)だ。必ず `CInt()` や `CDbl()` で数値型にキャストしてからCorelDRAW APIに渡せ。
3. トランザクションの意識: 大量のページを生成する際、途中でエラーが起きたらどうするか? `ActiveDocument.BeginCommandGroup` を使い、エラー時には `ActiveDocument.Undo` で一括ロールバックさせる設計が、プロの仕事だ。
—
結論:保守性の高いコードとは「疑い深いコード」である
CorelDRAW VBAは強力だが、そのAPIは決して親切ではない。
「ページはあるはずだ」「レイヤー名は変わっていないはずだ」という「はず」をすべて捨て去ること。それが、深夜の緊急呼び出しを防ぎ、ユーザーに信頼されるツールを作る唯一の道だ。
今回紹介したラッパー関数や境界値チェックを、あなたの標準ライブラリに組み込んでほしい。コードの行数は増えるが、それは「堅牢さ」という名のコストであり、将来の自分への投資である。
「動くコード」を書く時代は終わった。これからは「壊れないコード」で業務を支配せよ。
