【入門編】【上級プロ】レガシーマクロのモダンリファクタリング:グローバル変数依存のコードをクラスモジュール化して保守性を極限まで高める – SolidWorks VBA解析バイブル

スポンサーリンク

【脱・スパゲッティ】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(入力補完)」が効くようになり、タイプミスが激減します。

—

先輩エンジニアからのアドバイス

コードをクラス化することは、単に綺麗にする作業ではありません。「未来の自分へのメンテナンスコストを投資する行為」です。

「この処理、別のプロジェクトでも使いたいな」と思ったとき、クラスモジュールならそのファイルをエクスポートするだけで、魔法のように再利用できます。

さあ、皆さんのコードを、単なる「動くもの」から「資産」へと進化させましょう。ここをクリアすれば、自動化の景色は確実に変わります。

もし途中で「クラスの使い方がどうしても分からない!」という壁にぶつかったら、いつでも戻ってきてください。皆さんのエンジニアリングが、より創造的で楽しいものになることを心から応援しています!

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