廃墟と化したVBAを蘇生せよ:SolidWorks APIの「負の遺産」を殲滅する極限リファクタリング術
かつて開発されたSolidWorksマクロが、SolidWorks 2015以前の遺物として現代の環境で喘いでいる。バージョンアップのたびに発生する「型不一致」や「メソッド未定義」のエラー。これらを場当たり的な修正で凌ぐのは、地雷原を裸足で歩くようなものだ。
本稿では、レガシーマクロの深淵を覗き、SolidWorks APIの進化に適応した「堅牢なコード」へと昇華させるためのアーキテクチャ刷新論を説く。
—
1. 致命的な落とし穴:なぜレガシーマクロは「死ぬ」のか
多くのVBAマクロがクラッシュするのは、「暗黙的な型変換への依存」と「オブジェクトのライフサイクル管理の放棄」が原因だ。
特に2015以前のコードでは、`ISldWorks`や`IModelDoc2`へのキャストが曖昧なまま放置されていることが多い。現在のAPI環境では、インターフェースの厳格化が進んでおり、古い`Dispatch`ポインタの取り回しはメモリリークと不安定な動作を招く主因となる。
診断の鉄則:エラー特定の手順
1. `On Error Resume Next`の全廃: 隠れたエラーを可視化せよ。
2. 参照設定の確認: `SolidWorks 20xx Type Library`が正しく読み込まれているか。
3. API Helpの比較: 旧メソッドをIDE上でF2キー(オブジェクトブラウザ)にて検索し、`Deprecated`(廃止)または`Obsolete`の警告が出ていないか確認せよ。
—
2. 実践的リファクタリング:メソッド刷新の黄金律
例えば、フィーチャ生成の際、旧式の `CreateFeatureManager` 系メソッドが廃止されている場合がある。以下は、レガシーな `InsertFeature` を現代的な `IFeatureManager` を用いた書き方に置き換える際のテンプレートだ。
リファクタリング実例:スケッチ押し出しの再構築
‘ 【リファクタリング前:レガシーコード】
‘ Part.FeatureManager.InsertFeature “Extrude”, …
‘ ※直感的だが、エラーハンドリングが皆無で型が不明瞭
‘ 【リファクタリング後:モダンアーキテクチャ】
Public Sub CreateExtrudeModern(swModel As SldWorks.ModelDoc2, depth As Double)
Dim swFeatMgr As SldWorks.FeatureManager
Set swFeatMgr = swModel.FeatureManager
‘ 明示的なインターフェースの取得
Dim swFeatData As SldWorks.ExtrudeFeatureData2
Set swFeatData = swFeatMgr.CreateDefinition(swFtrTypeExtrude)
‘ プロパティの明示的設定
swFeatData.Depth = depth
swFeatData.Direction = 1 ‘ 0:Blind, 1:ThroughAll…
‘ フィーチャ生成とメモリ解放
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatMgr.CreateFeature(swFeatData)
‘ ライフサイクル管理:不要になったポインタは明示的にNothingへ
Set swFeatData = Nothing
Set swFeatMgr = Nothing
If swFeat Is Nothing Then Err.Raise 999, “AutoCAD”, “押し出し失敗”
End Sub
—
3. メモリ最適化とWindows APIの静かなる活用
大規模アセンブリを扱う際、VBAのガベージコレクションに期待してはならない。SolidWorks APIはCOMベースであり、参照カウンタが0にならない限りメモリは解放されない。
究極のメモリ解放テクニック
`Set obj = Nothing` を書くことは基本だが、さらに一歩踏み込み、Windows APIを使用してメモリを明示的に解放するアプローチも存在する。特にループ内で大量のオブジェクトを生成する場合は、処理の区切りで `GlobalAlloc` や `CoFreeUnusedLibraries` を検討すべきだ。
また、システム間連携(Excelとのデータ受け渡しなど)では、早期バインディング(Early Binding)を徹底せよ。遅延バインディング(`CreateObject`)は開発効率は高いが、型安全性が欠如し、メモリリークの温床となる。
—
4. チーフアーキテクトからの提言:次の10年を見据えて
レガシーコードの保守において最も重要なのは、「動けばいい」という妥協を捨てることだ。
- インターフェースの分離: 描画ロジックとデータ処理ロジックをクラスモジュールに分割せよ。
- ログ出力の導入: 簡易的なテキストログではなく、イベントベースのログ記録を実装し、クラッシュ時の「最後のスタック」を追跡できるようにせよ。
- VB.NETへの移行準備: VBAの限界を感じているなら、`Interop.SolidWorks.Interop.dll` を介した.NET Framework / .NET 6+ への移行パスを常に意識せよ。
VBAは、今なお生産現場を支える強力な武器だ。しかし、その錆を落とし、現代のAPI仕様という名刀に研ぎ直すのは、現場を知るエンジニアの責務である。
コードに魂を込めよ。そして、技術的負債を資産へと変貌させよ。それが真のエンジニアの流儀だ。
