CorelDRAW VBAを掌握せよ:シェイプ選択の「死角」を排除する堅牢なエラーハンドリング
CorelDRAWの自動化において、最も初歩的でありながら、多くの開発者が軽視し、結果として現場で「謎のクラッシュ」を引き起こす最大の要因がある。それは「ユーザーが何も選択していない状態でマクロを走らせること」だ。
自動化ツールは、往々にして「選択されたオブジェクトに対して処理を行う」という前提で書かれる。しかし、人間は必ずミスをする。何も選択されていない、あるいは予期せぬレイヤーがロックされている状態で実行ボタンが押されたとき、君の書いたコードは冷酷なランタイムエラーを吐き出し、ユーザーの作業時間を奪うだろう。
今回は、CorelDRAW VBAのアーキテクトとして、「例外を発生させず、かつ保守性に優れたシェイプ選択判定の鉄則」を伝授する。
—
1. なぜ `ActiveSelection.Shapes.Count` だけでは不十分なのか
初心者が最初に書くのは、おそらくこのようなコードだろう。
If ActiveSelection.Shapes.Count > 0 Then
‘ ここに処理を書く
End If
間違いではない。だが、プロの現場では「不十分」だ。
CorelDRAWのドキュメント構造は複雑だ。例えば、以下のようなケースを考慮しているか?
- ロックされたレイヤー: 選択はされているが、操作が許可されていないオブジェクト。
- グループ化されたオブジェクト: 内部構造をどう辿るか。
- 非表示のオブジェクト: 処理対象に含めて良いのか。
これらを無視して `ActiveSelection` に依存すると、ツールは「動くが、意図しない結果を招く」という、最も厄介なバグを生む。
—
2. 実務で「落ちない」ための堅牢な基本構造
実務レベルでは、「防御的プログラミング」を徹底する必要がある。以下のコードをテンプレートとして持っておくことを推奨する。
プロダクションコード例:安全な選択判定と例外処理
Public Sub ProcessSelectedShapes()
‘ 1. ドキュメントが開かれているか確認
If Documents.Count = 0 Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If
‘ 2. 選択状態の判定
‘ ActiveSelectionRangeを使うことで、より広範な選択状態を補足可能
If ActiveSelection.Shapes.Count = 0 Then
MsgBox “処理対象のシェイプが選択されていません。” & vbCrLf & _
“まずは対象を選択してから実行してください。”, vbInformation
Exit Sub
End If
‘ 3. エラーハンドリングの開始
On Error GoTo ErrorHandler
Dim s As Shape
‘ 選択されている各シェイプに対して反復処理
For Each s In ActiveSelection.Shapes
‘ ロックされているシェイプはスキップする等の条件判定
If Not s.Locked Then
‘ ここに本来の業務ロジックを記述
‘ 例: s.Fill.UniformColor.CMYKAssign 0, 100, 100, 0
End If
Next s
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub
なぜこの書き方が「正解」なのか
1. 早期リターン (Guard Clause): 正常系が深くなるのを防ぎ、コードの可読性を保つ。
2. `On Error GoTo` の配置: VBAにおける唯一の例外処理機構。これを書かないコードは、未完成品と同義だ。
3. `s.Locked` のチェック: 実行時エラーを未然に防ぐための強力なガード。
—
3. ファイル操作・外部連携時の注意点
ツールが複雑になり、CSVや外部データベースとの連携を行うようになると、さらに「ドキュメントのライフサイクル」を意識せねばならない。
- ドキュメントの参照を固定しない: `ActiveDocument` を多用せず、可能な限り変数に格納する。ユーザーがツール実行中にタブを切り替えた瞬間に、参照先が別ドキュメントに飛び、データが破壊される事故を防ぐためだ。
- 保存処理は慎重に: `ActiveDocument.Save` を自動化に組み込む場合、必ず「保存先パスが確定しているか」を判定しろ。`Path` が空であれば、名前を付けて保存ダイアログを強制的に呼び出すようなロジックが必要だ。
—
4. 最後に:エンジニアとしての心得
VBAは古臭い言語だと言われる。しかし、CorelDRAWのAPIを叩く限り、その柔軟性と破壊力は今も現役だ。
「初心者だから」といって、if文を一つ書いて満足してはいけない。君が書いたツールを使うユーザーは、君が想定する「理想的な操作」をしない。その時、君のコードがどう振る舞うか。
「動くコード」を書くのは作業員だ。
「壊れないコード」を書くのが、エンジニアだ。
この視点を忘れなければ、君の作るツールは必ず現場で重宝される資産になる。次のステップでは、`ActiveSelection` だけでは届かない、レイヤーを跨いだオブジェクト探索の極意を伝授しよう。精進せよ。
