【入門編】【レガシー保守】Onionレイヤー構造を持つ古いVBAマクロのクラスモジュール化と現代的なエラー処理へのリファクタリング – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAの「闇」を断つ:Onionレイヤー構造と現代的エラーハンドリングへの招待

こんにちは。SolidWorksの自動化という荒野を旅するエンジニアの皆さん。

もし、あなたの書いているコードが「`On Error Resume Next`」で埋め尽くされ、動くか動かないかを祈りながら実行ボタンを押しているなら……今こそ、その「呪い」を解く時です。

今日は、レガシーなマクロから脱却し、「メンテナンス可能で、堅牢なクラス設計」へとコードを昇華させるための極意を伝授します。

1. なぜ「On Error Resume Next」は悪手なのか?

マクロの記録から始めた方が最初に覚えるのが `On Error Resume Next` です。これは「エラーが起きても無視して進め」という命令。一見便利ですが、これは「車のブレーキを切ってアクセル全開で走る」ようなものです。

  • 何が起きたか分からない: ジオメトリ生成に失敗しても、後続の処理が連鎖的に崩壊し、デバッグ不可能な状態になります。
  • 状態の不整合: SolidWorksのAPIはオブジェクトの状態(アクティブドキュメントや選択状態)に非常に敏感です。エラーを放置すると、メモリリークやSolidWorks自体のクラッシュを招きます。

2. Onion(玉ねぎ)レイヤー構造による設計分離

メンテナンス性を高める秘訣は、「責務の分離」です。これを「Onionレイヤー」に見立てて階層化します。

1. Core Layer (APIラッパー): SolidWorksの泥臭いAPI操作のみを担当。
2. Logic Layer (業務ロジック): どのフィーチャを作るか、といったビジネスルールを記述。
3. UI/Entry Layer (入口): ユーザーとの対話。エラーの最終受け皿。

3. 実践:クラスモジュールによる堅牢な実装例

例えば、「新規パーツを作成し、押し出しフィーチャを作る」処理をクラス化してみましょう。

クラスモジュール:`PartBuilder.cls`

‘ SolidWorks APIのラッパーとなるクラス
Option Explicit

Private swApp As SldWorks.SldWorks
Private swModel As SldWorks.ModelDoc2

‘ 初期化処理:SolidWorksのインスタンスを注入する(依存性の注入)
Public Sub Initialize(app As SldWorks.SldWorks)
Set swApp = app
End Sub

‘ ジオメトリ生成のメイン処理
Public Function CreateExtrudeFeature(thickness As Double) As Boolean
‘ エラーハンドリング:現代的なGoTo構文
On Error GoTo ErrorHandler

Set swModel = swApp.NewDocument(“Part”, 0, 0, 0)
If swModel Is Nothing Then Err.Raise 1001, , “モデルの作成に失敗しました。”

‘ ここにフィーチャ生成のロジックを記述
‘ …

CreateExtrudeFeature = True
Exit Function

ErrorHandler:
‘ エラーログを記録して呼び出し元に通知
Debug.Print “Error ” & Err.Number & “: ” & Err.Description
CreateExtrudeFeature = False
End Function

標準モジュール:`Main.bas`

Sub RunAutomation()
Dim builder As New PartBuilder
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks

builder.Initialize swApp

‘ ここで実行の成否を判定する
If builder.CreateExtrudeFeature(0.05) Then
MsgBox “自動化完了!”
Else
MsgBox “エラーが発生しました。ログを確認してください。”
End If
End Sub

4. 陥りやすい罠と解決策

罠1:オブジェクトの解放忘れ

SolidWorksのAPIはCOMオブジェクトです。`Set swModel = Nothing` を疎かにすると、マクロを終了してもプロセスがバックグラウンドに残り、次回実行時にエラーを吐きます。

  • 対策: クラスの `Class_Terminate` イベントを活用して、明示的に参照をクリアする癖をつけましょう。

罠2:UIのフリーズ

重いフィーチャ生成中に画面更新が走ると、SolidWorksは応答なしになります。

  • 対策: `swApp.UserControl = False` と `swApp.Frame.KeepAlive = True` を適切に使い、処理中は画面更新を一時停止(`swModel.ViewZoomtofit2` などを避ける)させましょう。

最後に:なぜこの構造が重要なのか

あなたが書いたそのコードは、1年後のあなた自身や、あなたのチームメイトが修正することになります。「どこでエラーが起きているか」を構造的に追いかけられるコードこそが、「一生モノの自動化資産」です。

まずは、既存のスパゲッティコードから「API操作」の部分だけを抜き出し、クラスに追い出すことから始めてみてください。これだけで、あなたのSolidWorks VBAスキルは中級者から「エンジニア」へと一段階進化します。

ここをクリアすれば、もう怖くはありません。さあ、安全で堅牢な自動化の世界へ一歩踏み出しましょう。応援しています!

タイトルとURLをコピーしました