【実務・中級編】【レガシー保守】SolidWorks 2012以前の古いAPIメソッドを最新のSolidWorks 2024対応コードへリファクタリングする手順 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見

【レガシー保守】SolidWorks 2012以前の古いAPIメソッドを最新のSolidWorks 2024対応コードへリファクタリングする手順

開発プロジェクトのリーダーである私のもとに、たびたびこんな悲鳴が届く。
「社内で代々引き継がれてきた図面自動化マクロが、SolidWorks 2024にバージョンアップした途端に動かなくなった」と。

無理もない。今から10年以上前のSolidWorks 2012以前に書かれたVBAコードは、現在のモダンなAPIアーキテクチャから見れば「技術的負債の塊」だ。当時許容されていた暗黙的なオブジェクト参照、非推奨となったインターフェース、そしてメモリリークを誘発する記述が、現代の厳格なCOMコンポーネント環境でエラーを吐くのは当然と言える。

今回は、レガシーマクロを最新のSolidWorks 2024環境へ安全かつ完璧に移行させるための「極限の知見」を授けよう。

なぜ古いコードは動かないのか?(敗因の分析)

レガシーマクロが現代のSolidWorksでクラッシュ・フリーズする理由は主に3つある。

1. `SldWorks.Application` の不適切なインスタンス取得と解放
レガシーコードによありがちな `GetObject(, “SldWorks.Application”)` の乱用や、参照カウンタを適切にデクリメントしない設計は、SolidWorks 2024のマルチスレッドおよびアドイン管理機構と激しく衝突する。
2. 非推奨メソッド・引数の廃止
10年以上の間に、多くのジオメトリ生成メソッド(例:古いスケッチ作成やフィーチャ押出しのAPI)が内部構造の刷新に伴い廃止、またはオーバーロードの仕様が変更されている。
3. エラーハンドリングの欠如と「黙った失敗」
エラー時に `On Error Resume Next` で強行突破するコードは、最新APIが返すHRESULT(エラーコード)を無視し、ドキュメントの破損やゾンビプロセスの生成を引き起こす。

レガシーコードを2024対応へ書き換える4つの鉄則

鉄則1:アプリケーションインスタンスの厳格な取得

古いコードにあるような曖昧な接続を排除し、常にアクティブなセッションを安全に取得する。

鉄則2:遅延バインディングから事前バインディングへの移行

開発環境で `SolidWorks 20x.x Type Library` を参照設定し、型安全(Type-Safe)なコードを書く。これにより、非推奨メソッドや引数のミスマッチをコンパイル時に検知できる。

鉄則3:フィーチャ生成APIのモダン化

例えば、古い `InsertExtrude2` などのプリミティブなメソッドから、より堅牢な `FeatureManager` インターフェースを利用した構築手法へシフトする。

鉄則4:完全なオブジェクトクリーンアップ

VBAの終了時に明示的に変数を `Nothing` に設定し、COMのメモリリークを防ぐ。

【実践】2012年スタイルから2024年プロダクションコードへのリファクタリング

百聞は一見に如かず。実際に、古いパーツファイル生成処理をモダンなSolidWorks 2024対応コードへリファクタリングした例を示す。

以下のコードは、「指定した寸法でベースとなるボス(直方体)を新規パーツに作成する」という実務で最も頻繁に使う処理の完成形だ。そのままコピペして現場で活用してほしい。

Option Explicit

‘ ==============================================================================
‘ 処理名: CreateBaseBlock_2024
‘ 概要 : レガシーコードを排除し、SolidWorks 2024 APIに最適化したパーツ生成プロシージャ
‘ 備考 : 事前バインディングを使用するため、VBEの「参照設定」で
‘ 「SolidWorks x.x Type Library」にチェックを入れること。
‘ ==============================================================================
Sub CreateBaseBlock_2024()
‘ 1. オブジェクト変数の宣言(型を明確に定義し、遅延バインディングを避ける)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swFeatMgr As SldWorks.FeatureManager
Dim boolstatus As Boolean
Dim errCode As Long

‘ 2. パフォーマンス向上のための画面描画停止フラグ
Dim lErrors As Long
Dim lWarnings As Long

‘ — エラーハンドリングの開始 —
On Error GoTo ErrorHandler

‘ 3. SolidWorks アプリケーションの安全な取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していないか、セッションが無効です。”, vbCritical, “致命的エラー”
Exit Sub
End If

‘ 4. 新規パーツドキュメントの作成 (2024推奨のテンプレート取得ロジック)
Dim defaultTemplate As String
defaultTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)

Set swModel = swApp.NewDocument(defaultTemplate, swDwgPaperSizes_e.swDwgPaperA4size, 0, 0)
If swModel Is Nothing Then
MsgBox “パーツドキュメントの新規作成に失敗しました。テンプレートパスを確認してください。”, vbCritical
Exit Sub
End If

Set swPart = swModel
Set swFeatMgr = swModel.FeatureManager

‘ 5. 処理速度最適化:画面更新をロック
swModel.Extension.UsePersistReferences = False
boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swViewDisplayUpdateDuringRedraw, False)

‘ 6. スケッチ平面の選択(フロント平面をアクティブ化)
boolstatus = swModel.Extension.SelectByID2(“フロント”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
Err.Raise 1000, “CreateBaseBlock”, “基準平面 ‘フロント’ の選択に失敗しました。”
End If

‘ 7. スケッチの作成(センター矩形を描画)
swModel.SketchManager.InsertSketch True

‘ 矩形描画: 中心(0,0)から 幅100mm, 高さ50mm の矩形を作成
Dim swSketchRect As Object
Set swSketchRect = swModel.SketchManager.CreateCenterRectangle(0, 0, 0, 0.05, 0.025, 0)

swModel.SketchManager.InsertSketch True ‘ スケッチ終了

‘ 8. フィーチャ生成:フィーチャマネージャー経由での押し出し(モダンAPIの適用)
‘ 引数: 局所的, 逆方向, 両方向, 終了条件(面なし=0), 終了条件(面なし=0), 奥行き1(0.05m=50mm), 奥行き2, ドラフト…
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatMgr.FeatureExtrusion2( _
True, _ ‘ 局所的フィーチャか
False, _ ‘ 逆方向へ押し出すか
False, _ ‘ 両方向押し出しか
0, 0, _ ‘ 終端条件 (Blind)
0.05, 0, _ ‘ 奥行き深度 (m単位: 50mm), 奥行き2
False, False, _ ‘ ドラフト有効か, 逆ドラフトか
False, False, _ ‘ ドラフト角方向1, ドラフト角方向2
0, 0, _ ‘ ドラフト角1, ドラフト角2
False, False, _ ‘ 薄板フィーチャ有効か
False, False, _ ‘ 薄板タイプ, 終端条件…
False, _ ‘ 自動フィレット等
True, True, _ ‘ マージ結果, フィーチャのスコープ
0, 0, 0, _ ‘ 押し出し方向等
False, False)

If swFeat Is Nothing Then
Err.Raise 1001, “CreateBaseBlock”, “フィーチャの押し出しに失敗しました。”
End If

‘ 9. 正常終了処理:画面更新の復元
boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swViewDisplayUpdateDuringRedraw, True)
swModel.GraphicsRedraw2

MsgBox “SolidWorks 2024 対応パーツの生成が完了しました。”, vbInformation, “完了”
GoTo CleanUp

ErrorHandler:
‘ 異常終了時のフォールバック
If Not swModel Is Nothing Then
swModel.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayUpdateDuringRedraw, True
End If
MsgBox “エラーが発生しました。” & vbCrLf & _
“説明: ” & Err.Description & vbCrLf & _
“コード: ” & Err.Number, vbCritical, “実行時エラー”

CleanUp:
‘ 10. メモリリーク防止のためのオブジェクト解放
Set swFeat = Nothing
Set swSketchRect = Nothing
Set swFeatMgr = Nothing
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub

リーダーからの実務アドバイス:保守性とデータベース連携の要諦

現場でこのコードを運用する際、単に「動く」だけではプロの仕事とは言えない。外部データベース(Excel、Access、あるいはPLM/PDMシステム)から寸法やパラメータを動的に流し込む設計にする場合、以下の点に留意せよ。

  • 単位系(Unit System)の厳密な管理

SolidWorksのAPIは内部的にメートル法(MKS: meters, kilograms, seconds)でデータを処理する。レガシーコードによくある「ミリ単位の数値をそのまま渡す」ミスは、2024環境でも大事故(巨大すぎる、あるいは目に見えないほどの極小パーツの生成)の原因になる。必ず `0.05` のようにメートル換算(mmなら1000で割る)を徹底すること。

  • トランザクション管理

データベースから複数・数千点ものパーツを自動生成するバッチ処理では、途中でエラーが起きた場合にドキュメントが中途半端に開いたままプロセスが埋まる。必ず `swApp.CloseDoc` によるセーフティネットをエラーハンドラ内に組み込むべきだ。

古い遺物を恐れるな。正しい知識とアーキテクチャの刷新によって、あなたのVBAマクロはSolidWorks 2024のポテンシャルを最大限に引き出す、強靭な自動化エンジンへと生まれ変わる。さあ、今すぐコードの書き換えに着手したまえ。

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