【入門編】【レガシーコードのリファクタリング】廃止予定となった古いSolidWorks APIメソッドの特定とモダンAPIへの置換術 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。

あなたがこれまで大切に育ててきたSolidWorksのマクロ資産、あるいは社内に代々受け継がれてきたVBAコード。「最近、なぜか動く時と動かない時がある」「特定のバージョンアップからエラーが出るようになった」なんて悩みを抱えていませんか?

それ、もしかすると「非推奨(デプリケート)になった古いAPIメソッド」の呪縛にかかっているかもしれません。

SolidWorksは毎年進化を遂げています。それに伴い、かつて王道だったAPIが静かに姿を消し、より高速で安全な「モダンAPI」へとバトンタッチされています。今回は、レガシーコードの闇を暴き、あなたのマクロを未来永劫メンテナンス可能な「一級品のコード」へと生まれ変わらせるリファクタリング術を伝授します。

ここをクリアすれば、SolidWorks VBAの基本とAPIの本質はバッチリですよ!一緒に紐解いていきましょう。

1. なぜレガシーAPIは「悪」なのか?

「動いているなら触るな」は、プログラミングの世界では時限爆弾の別名です。古いAPIを使い続けることには、以下のような致命的なリスクが潜んでいます。

  • 突然の動作停止: Dassault Systèmes(ダッソー・システムズ)のサポートポリシーにより、非推奨となったAPIは数世代のバージョンを経て完全に削除されます。ある日突然、SolidWorksのバージョンアップとともにマクロが全滅します。
  • メモリリークとパフォーマンス低下: 古いAPIは、裏側のCOMオブジェクトの解放(メモリ管理)が曖昧なものが多く、SolidWorks本体を不安定にさせる原因になります。
  • エラーハンドリングの欠如: 昔の書き方は「エラーが起きたらそのまま沈黙する(または強制終了)」ものが多く、デバッグに膨大な時間を奪われます。

レガシーコードから脱却し、モダンなAPIへ置き換えることは、エンジニアとしての必須スキルなのです。

2. 廃止予定APIの特定:見落としがちな「3つの地雷」

実際のコードを見ていく前に、あなたのマクロに潜む「危険な匂い」を嗅ぎ分けるポイントを押さえましょう。

地雷①: `ModelDoc2` の型キャストの放棄とグローバル検索

古いコードでは、アクティブドキュメントを操作する際に、型を明確に意識せず雑に処理しているケースが目立ちます。

地雷②: 「マクロの記録」のそのままの貼り付け

「マクロの記録」機能は素晴らしい入門ツールですが、出力されるコードは当時のAPI仕様をそのままスナップショットしたレガシーの塊です。そのまま実戦投入してはいけません。

地雷③: 戻り値のチェック漏れ

「ファイルを開く」「フィーチャーを追加する」といった操作で、APIが何を返したか(成功したのか、失敗したのか)を確認していないコードは、すべて地雷です。

3. 【実践】レガシーコードをモダンAPIへリファクタリングする

それでは、具体的なコード例を通じて、古い書き方をモダンな書き方へ昇華させてみましょう。

シナリオ:アクティブな図面(Drawing)から特定のビューやシート情報を取得する処理

【Before】危険なレガシーコード

以下のコードを見てください。一見動くように見えますが、古いメソッドや、エラーハンドリングの概念が抜けた典型的な危ういコードです。

‘ 【レガシーコード例】絶対真似してはいけない古い書き方
Sub LegacyMacro()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Set swApp = CreateObject(“SldWorks.Application”)
Set swModel = swApp.ActiveDoc

‘ 古い型チェックなしの操作
MsgBox “現在のファイル名: ” + swModel.GetTitle

‘ ※注意: 古いAPIでは、ドキュメントのタイプ判定を文字列や曖昧な定数で行いがち
If swModel.GetType = 1 Then ‘ 1 = swDocPart (マジックナンバーの多用)
MsgBox “これは部品です。”
End If

End Sub

何が問題なのか?
1. `swApp.ActiveDoc` は便利ですが、現在開いているドキュメントが本当に存在するか(Nothing判定)のチェックがありません。
2. `swModel.GetType = 1` のような「マジックナンバー(意味不明な数値)」は、将来の仕様変更や可読性の観点から最悪です。
3. エラーが発生したときの逃げ道(Err.Description等)がありません。

【After】洗練されたモダンAPIコード

それでは、型安全で、エラーハンドリングが完璧なモダンコードに書き換えます。

‘ 【モダンリファクタリング版】安全・高速・保守性の高いコード
Sub ModernMacroRefactored()
‘ 1. 宣言と初期化の厳格化
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks ‘ CreateObjectではなく、実行中のインスタンスを安全に取得

If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If

‘ 2. アクティブドキュメントの安全な取得
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “現在、アクティブなドキュメントがありません。”, vbExclamation, “警告”
Exit Sub
End If

‘ 3. モダンなドキュメントタイプ判定(明確な列挙体 Enum の使用)
Dim docType As Long
docType = swModel.GetType()

Select Case docType
Case swDocPART
MsgBox “対象ドキュメントは【部品 (Part)】です。”, vbInformation, “モダンAPI”
‘ ここに部品用のモダン処理を記述

Case swDocASSEMBLY
MsgBox “対象ドキュメントは【アセンブリ (Assembly)】です。”, vbInformation, “モダンAPI”
‘ ここにアセンブリ用のモダン処理を記述

Case swDocDRAWING
MsgBox “対象ドキュメントは【図面 (Drawing)】です。”, vbInformation, “モダンAPI”
‘ ここ図面用のモダン処理を記述

Case Else
MsgBox “未知のドキュメントタイプです。”, vbCritical, “エラー”
Exit Sub
End Select

‘ 4. オブジェクトの明示的な解放(VBAにおけるメモリ管理の基本)
Set swModel = Nothing
Set swApp = Nothing

MsgBox “処理が正常に完了しました。”, vbInformation
End Sub

コードのここがスゴい!モダンAPIのポイント

1. マジックナンバーの排除: `swDocPART` や `swDocASSEMBLY` といった、SolidWorksが公式に提供している型安全な列挙体(Enum)を使用しています。これにより、将来APIの内部値が変わってもコードが壊れません。
2. 徹底的な `Nothing` 判定: オブジェクトが取得できなかった場合に、即座に処理を中断(`Exit Sub`)し、不意のクラッシュを防ぎます。
3. オブジェクトの解放: 処理の最後に `Set swModel = Nothing` を行うことで、VBA特有のCOMメモリリークを防ぎ、SolidWorksの動作を軽快に保ちます。

4. プロからのアドバイス:保守性を高めるために今すぐできること

あなたの手元にある大量のマクロを一気に書き換えるのは大変です。まずは以下のステップから始めてみてください。

1. 「マクロの記録」をそのまま使わない: 記録されたコードは必ず「変数の型を明示(`Dim`)」し、不要な選択(`Select`メソッド)を削ぎ落とす。
2. SolidWorks APIヘルプを引く習慣をつける: メソッド名にカーソルを合わせて `F1` キーを押してください。「非推奨(Deprecated)」の赤字や、それに代わる新しいメソッド名が必ず記載されています。英語であっても、そこがエンジニアとしての腕の見せ所です。

古いAPIの呪縛から解放されたとき、あなたの書くVBAコードは見違えるほど軽快になり、エラーの恐怖から完全に解放されます。

ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!
自信を持って、明日からの自動化ライフをアップデートしていきましょう。それではまた、次のアーキテクチャでお会いしましょう!

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