SolidWorks VBAを掌握する極限の知見
【レガシー保守】古いSolidWorks 2010時代の古いVBAマクロを最新のSolidWorks 2024環境へ完全移行する手順
レガシーシステムの呪縛は、製造業の現場において最も根深く、そして最もコストがかかる技術的負債の一つだ。
特に、今から14年以上前に書かれたSolidWorks 2010時代のVBAマクロが、未だに現行のSolidWorks 2024環境で「だましだまし」運用されている現場を私は数多く目撃してきた。
「動いているから触るな」という現場の論理は、セキュリティリスク、OSのバージョンアップ(Windows 11への移行)、そして何よりも設計プロセスのボトルネックという名の癌細胞を増殖させる。
本稿では、レガシーなSolidWorks 2010マクロを最新のSolidWorks 2024環境へ完全移行し、次世代でも耐えうる堅牢なコードベースへと昇華させるための実践的アプローチを、チーフアーキテクトの視点から余すところなく解説する。
—
1. 2010 vs 2024:APIの断絶と「Obsolete(廃止)」の現実
SolidWorks APIは後方互換性を重視していると言われるが、それはあくまで「表向き」の話に過ぎない。14年の年月を経る中で、多くのメソッドが非推奨(Obsolete)となり、2024環境では完全に削除されているか、予期せぬクラッシュ(Access Violation)を引き起こす地雷と化している。
主な破壊的変更の領域
- セレクション・マネージャーの仕様変更: 旧時代の曖昧な選択セットの取得方法から、厳密な型安全性を要求される方式への移行。
- フィーチャ作成・編集の引数肥大化: `InsertFeature` 系のメソッドにおいて、デフォルト引数の解釈や構造体(Struct)の渡し方が厳格化。
- COMオブジェクトのライフサイクル管理: 64bit環境およびCOMコンポーネントのガベージコレクションの挙動変化に伴うメモリリークの激増。
レガシーコードをそのまま現代の動的環境に放り込むことは、地雷原を裸足で歩くようなものだ。まずはコードの「断捨離」から始めなければならない。
—
2. 移行における3つの致命的アンチパターン
2010年当時に主流だった実装方式は、2024年のSolidWorks環境では百害あって一利なしである。以下のアンチパターンを排除せよ。
1. `Dim swApp As Object` の野放し(遅いバインディング)
オブジェクト型をそのまま使用すると、内部でCOMのIDispatch経由の遅延バインディングが発生し、パフォーマンスが著しく低下するだけでなく、2024年の厳格な型チェックをすり抜けて実行時エラーを誘発する。必ず `SldWorks.SldWorks` として明示的に宣言せよ。
2. オブジェクトの解放放置によるメモリリーク
VBAのランタイムにメモリ管理を丸投げする愚行。特にモデルトラバーサルやアセンブリのコンポーネント走査を行うコードでは、取得したCOMオブジェクトを `Set swFeat = Nothing` で明示的に解放しないと、SolidWorksプロセス内にゾンビオブジェクトが蓄積し、最終的にOutOfMemoryを引き起こす。
3. エラーハンドリングの欠如とマジックナンバー
`On Error Resume Next` でエラーを握りつぶすレガシー特有の悪習は、APIの仕様変更で無効化されたメソッドを沈黙させ、不正なジオメトリを生成する原因となる。
—
3. 実践:レガシーコードの現代化リファクタリング
ここでは、2010年スタイルのパーツ生成・フィーチャ操作マクロを、2024年基準の型安全かつメモリ効率を極限まで高めたコードへとリファクタリングする実例を示す。
リファクタリング前(2010レガシー風)
‘ 【危険な旧式コード】
Sub CreateBlock_Legacy()
Dim swApp As Object
Dim swPart As Object
Set swApp = CreateObject(“SldWorks.Application”)
Set swPart = swApp.ActiveDoc
‘ 曖昧な型とエラー処理なし
swPart.SketchManager.InsertSketch 1
swPart.CreateCenterRectangle 0, 0, 0, 0.1, 0.1, 0
swPart.FeatureManager.FeatureExtrusion2 True, False, False, 0, 0, 0.05, 0.05, False, False, False, False, 1.74532925199433E-02, 1.74532925199433E-02, False, False, False, False, True, 1, 1, True
End Sub
このコードは、2024環境では引数の数や型の不一致でコンパイルエラー、あるいは実行時クラッシュを起こす。
リファクタリング後(2024モダン・堅牢版)
Option Explicit
‘ ==============================================================================
‘ 業務自動化アーキテクチャ標準モジュール: ModernPartBuilder.vba
‘ 対象環境: SolidWorks 2024 SP0以降 (64bit)
‘ 目的: 型安全性、メモリ最適化、完全なエラーハンドリングの実装
‘ ==============================================================================
Public Sub CreateBlock_Modern2024()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSketchMgr As SldWorks.SketchManager
Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
‘ 1. アプリケーションインスタンスの安全な取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbExclamation, “警告”
Exit Sub
End If
‘ ドキュメントタイプがパーツ(Part = 1)であることを担保
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbCritical, “型不一致エラー”
Exit Sub
End If
‘ エラーハンドリングの有効化
On Error GoTo ErrorHandler
‘ 2. サービスの取得(プロキシ・マネージャーのキャッシュ)
Set swSketchMgr = swModel.SketchManager
Set swFeatMgr = swModel.FeatureManager
‘ トランザクション開始(パフォーマンス向上とロールバック担保)
swModel.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, True
‘ 3. ジオメトリ生成処理
swSketchMgr.InsertSketch True
‘ 中心矩形の作成(明示的な型指定による安全な座標渡し)
Dim boolstatus As Boolean
boolstatus = swSketchMgr.CreateCenterRectangle(0#, 0#, 0#, 0.1, 0.1, 0#)
If Not boolstatus Then
Err.Raise vbObjectError + 1000, “Sketch”, “スケッチの作成に失敗しました。”
End If
‘ スケッチ終了
swSketchMgr.InsertSketch False
‘ 4. フィーチャ作成 (FeatureExtrusion3 またはモダンな定義を使用)
‘ ※引数の数が肥大化したレガシーメソッドは、可能な限り最新のAPIラッパーに置き換える
Set swFeat = swFeatMgr.FeatureExtrusion3( _
DraftOutward:=False, _
Revise:=False, _
Merge:=True, _
Dir1Type:=swEndCondBlind, _
Dir2Type:=swEndCondBlind, _
Depth1:=0.05, _
Depth2:=0#, _
DraftAngle1:=0#, _
DraftAngle2:=0#, _
Draft samtidigt:=False, _
RevDir1:=False, _
RevDir2:=False, _
IsThin:=False, _
KeepBody:=False, _
UseFeatScope:=True, _
UseAutoSelect:=True, _
AssemblyFeatureScope:=False, _
TaperOutward1:=False, _
TaperOutward2:=False, _
StartCondition:=0, _
OffsetReverse:=False)
If swFeat Is Nothing Then
Err.Raise vbObjectError + 1001, “Feature”, “押し出しフィーチャの生成に失敗しました。”
End If
MsgBox “パーツの生成が正常に完了しました。”, vbInformation, “成功”
CleanUp:
‘ 5. メモリの明示的解放 (COMオブジェクトの参照カウントを確実にデクリメント)
Set swFeat = Nothing
Set swFeatMgr = Nothing
Set swSketchMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“説明: ” & Err.Description, vbCritical, “システムエラー”
Resume CleanUp
End Sub
—
4. チーフアーキテクトが教える「移行時の極意」
単なるコードの書き換えに留まらない、組織的かつアーキテクチャレベルでの移行戦略を授けよう。
Ⅰ. 早期バインディング(Early Binding)への完全移行
プロジェクトの「参照設定」から `SolidWorks 20xx Type Library` および `SolidWorks Constants Type Library` を必ず追加し、型推論に頼らないコードを書け。これにより、IDEのIntelliSense(入力補完)が完全に効くようになり、廃止予定のメソッドはその場で検知できる。
Ⅱ. COMオブジェクトの解放(Garbage Collectionのハック)
VBAはVB.NETやC#と異なり、ガベージコレクションが極めて怠惰である。特にループ内でSolidWorksのAPIを叩く場合、以下のようにスコープを細かく区切り、明示的に `Set xxx = Nothing` を挟まない限り、メモリは肥大化し続け、数千回の処理でSolidWorksが沈黙する。
Dim i As Long
For i = 0 To 1000
Dim swBody As SldWorks.Body2
Set swBody = …
‘ 処理
Set swBody = Nothing ‘ ← これをサボるプログラマーは即座に解任すべきだ
Next i
Ⅲ. システム間連携(外部DB・PLM連携)への備え
レガシーマクロの多くは、ハードコードされたファイルパスやローカルINIファイルに依存している。SolidWorks 2024環境への移行を機に、外部データベースやREST API、あるいは社内PLMシステムとの連携を見据え、データ入出力層(IOレイヤー)をクラスモジュールとしてカプセル化せよ。UI層とビジネスロジック層を分離しないコードは、将来的に必ず破綻する。
—
結論
レガシーマクロの近代化は、単なる「動くようにする作業」ではない。それは、組織の設計資産を次の10年へ継承するための戦略的投資である。
古いSolidWorks 2010時代の呪縛を断ち切り、型安全で、メモリリークのない、洗練されたVBAアーキテクチャを構築すること。それこそが、真の業務自動化エンジニアに課された使命である。妥協するな。コードを極限まで研ぎ澄ませ。
