【脱・スパゲッティ】SolidWorks VBAのレガシーコードを「クラスモジュール」で洗練させる極意
こんにちは。SolidWorksの自動化という深淵に足を踏み入れた皆さん、ようこそ。
「マクロの記録」から卒業し、独自の自動化ツールを書き始めた頃、誰もが一度は通る道があります。「変数がどこで定義されているか分からない」「別のプロジェクトで部品を読み込むたびに、コードの書き換えに追われる」……そう、悪名高き「スパゲッティ・コード」です。
今日は、グローバル変数に頼り切った脆弱なコードを、堅牢で再利用可能な「クラスモジュール」へと昇華させる、アーキテクト流のリファクタリング術を伝授します。
—
1. なぜ「クラスモジュール」なのか?
初心者の方は、「標準モジュールだけで十分では?」と思うかもしれません。しかし、アセンブリへの部品配置や合致(Mate)設定は、複雑な依存関係の塊です。
- 標準モジュールのみ: 状態(アセンブリのポインタや部品のパス)がグローバル変数に散らばり、少し修正するだけで全体が動かなくなる。
- クラスモジュール活用: アセンブリを「一つのオブジェクト(インスタンス)」として扱い、メソッド(機能)を隠蔽する。
つまり、「あなたのアセンブリ操作を『部品』としてカプセル化する」ということです。
—
2. 実践:アセンブリ作成をクラス化する
まずは、部品を追加し、合致を定義する機能を `CAssemblyManager` というクラスに集約してみましょう。
ステップ①:クラスモジュール `CAssemblyManager` を作成
VBAエディタで「挿入」→「クラスモジュール」を選択し、名前を `CAssemblyManager` に変更します。
‘ CAssemblyManager クラスモジュール
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 Sub CreateNewAssembly()
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\…\Assembly.asmdot”, 0, 0, 0)
End Sub
‘ 部品を追加して合致させる(これが保守性の核!)
Public Sub AddComponentAndMate(filePath As String, mateEntityName As String)
‘ 1. 部品を読み込む
Dim swComp As SldWorks.Component2
Set swComp = swModel.AddComponent5(filePath, 0, “”, False, “”, 0, 0, 0)
‘ 2. ここに合致処理(Mate)を記述
‘ ※本来は選択処理などを挟むが、概念としてシンプルに
Debug.Print “部品追加完了: ” & filePath
End Sub
—
3. メイン処理を劇的にシンプルにする
クラスを作ると、メインとなる標準モジュールは驚くほどスッキリします。これが「保守性が極限まで高まる」理由です。
‘ 標準モジュール(Main)
Sub ExecuteAssemblyAutomation()
Dim asmManager As New CAssemblyManager
‘ クラスの初期化
asmManager.Initialize Application.SldWorks
‘ 命令的に処理を実行
asmManager.CreateNewAssembly
asmManager.AddComponentAndMate “C:\Parts\Bracket.sldprt”, “Face1”
MsgBox “アセンブリ生成が完了しました。”
End Sub
—
4. 陥りやすい罠:ここだけは注意!
初学者がこの段階で詰まるポイントが2つあります。
1. オブジェクトの解放(メモリ管理):
SolidWorksのAPIは強力ですが、メモリにゴミが残りやすいです。クラスモジュール内で `Set swModel = Nothing` を適切に行う「終了処理(Terminate)」を意識しましょう。
2. 型指定の徹底:
`Dim swApp As Object` のように曖昧な型を使わず、`SldWorks.SldWorks` と明示してください。これだけで、VBAエディタの「IntelliSense(入力補完)」が効くようになり、タイプミスが激減します。
—
先輩エンジニアからのアドバイス
コードをクラス化することは、単に綺麗にする作業ではありません。「未来の自分へのメンテナンスコストを投資する行為」です。
「この処理、別のプロジェクトでも使いたいな」と思ったとき、クラスモジュールならそのファイルをエクスポートするだけで、魔法のように再利用できます。
さあ、皆さんのコードを、単なる「動くもの」から「資産」へと進化させましょう。ここをクリアすれば、自動化の景色は確実に変わります。
もし途中で「クラスの使い方がどうしても分からない!」という壁にぶつかったら、いつでも戻ってきてください。皆さんのエンジニアリングが、より創造的で楽しいものになることを心から応援しています!
