【入門編】【上級プロ向け】レガシーSolidWorks APIバージョン差異(2018〜2024+)を動的バインディングで完全に吸収するラッパーアーキテクチャ – SolidWorks VBA解析バイブル

スポンサーリンク
スポンサーリンク

SolidWorks VBAを掌握する極限の知見:バージョン差異を無効化する「ラッパーアーキテクチャ」の構築

こんにちは。設計自動化の荒波を共に渡る同志の皆さん。

「マクロの記録」ボタンを押し、生成されたコードを眺めては「これ、どういう意味だろう?」と首を傾げたことはありませんか? あるいは、自分のPCでは完璧に動いた図面自動生成マクロが、隣の席の先輩(新しいバージョンのSolidWorksを使っている)のPCに持っていった途端、無慈悲な「実行時エラー」を吐いて止まってしまった経験はありませんか?

もしそうなら、おめでとうございます。あなたは今、「プログラミング初学者」から「業務自動化エンジニア」へと脱皮するための、最も重要な壁に突き当たっています。

今日は、世界中の設計現場で発生する「SolidWorksのバージョン差異によるエラー」という地獄を、エレガントに、そして完全に解決するための、最強の防御策「ラッパーアーキテクチャ」について伝授しましょう。

1. なぜ、あなたのマクロは「壊れる」のか?

まず、敵の正体を知ることから始めましょう。

SolidWorks VBAには、大きく分けて2つの「結びつき方(バインディング)」があります。

① 早期バインディング(Early Binding)

VBAエディタの「ツール」→「参照設定」で、特定のバージョンのSolidWorksライブラリにチェックを入れる方法です。

  • メリット: コードを書いている最中に「入力補完(インテリセンス)」が効く。動作が速い。
  • デメリット: 「特定のバージョン」に依存する。 2020版で参照設定したマクロを2024版で動かそうとすると、参照が外れたり、メソッドの仕様変更によってエラーになったりします。

② 遅延バインディング(Late Binding)

参照設定をあえて行わず、変数の型を `Object` として宣言する方法です。

  • メリット: 実行時にSolidWorksを探しに行くため、バージョンが違ってもエラーになりにくい。
  • デメリット: 入力補完が効かない。コードが読みづらくなる。動作が(極めて僅かに)遅い。

「じゃあ、全部 `Object` で書けばいいじゃないか!」と思ったあなた。鋭い。しかし、それではコードがスパゲッティ状態になり、メンテナンスが不可能になります。

プロの仕事は、「開発時は早期バインディングの恩恵を受け、実行時は遅延バインディングの柔軟性を享受する」ことなのです。

2. 解決策:ラッパーアーキテクチャの概念図

ここで登場するのが、「ラッパー(包み紙)」という考え方です。

直接SolidWorksのAPI(生身の命令)をあちこちで叩くのではなく、「自分たちが使いやすい専用の窓口(クラス)」を一つ作り、その中だけでバージョンの違いを吸収させるのです。

アーキテクチャの構造

1. メインロジック層: 「図面を作れ」「ビューを配置せよ」という、純粋な業務命令だけを書く。
2. ラッパー層(Wrapper Class): SolidWorksのAPIを呼び出す唯一の窓口。ここで `Object` を使い、バージョンの差異を吸収する。
3. SolidWorks API層: 実際のSolidWorks本体。

こうすることで、万が一SolidWorksの仕様が変わっても、修正が必要なのは「ラッパー層」だけになります。メインの業務ロジックには一切手を触れなくて済むのです。

3. 実践:堅牢な図面自動生成ラッパーの構築

では、実際に「図面ファイルの生成とシートフォーマット制御」を行うための、プロ仕様のコードを見ていきましょう。

ステップ1:ラッパー用クラスモジュールの作成

VBAエディタで「クラスモジュール」を挿入し、名前を `clsSWWrapper` としてください。

' ==========================================================
' クラス名: clsSWWrapper
' 目的: SolidWorks APIのバージョン差異を吸収するラッパー
' ==========================================================
Option Explicit

Private swApp As Object ' SolidWorks Application (Late Binding)
Private swModel As Object ' 現在のモデル

' SolidWorksへの接続を確立する
Public Function Connect() As Boolean
    On Error Resume Next
    ' 実行中のSolidWorksを取得、なければ新規起動
    Set swApp = GetObject(, "SldWorks.Application")
    If swApp Is Nothing Then
        Set swApp = CreateObject("SldWorks.Application")
    End If
    On Error GoTo 0
    
    If Not swApp Is Nothing Then
        Connect = True
    Else
        Connect = False
    End If
End Function

' プロパティ: SolidWorks Applicationオブジェクトの取得
Public Property Get App() As Object
    Set App = swApp
End Property

' 図面ドキュメントを新規作成するメソッド
' バージョンによるメソッドの挙動差異をここに閉じ込める
Public Function CreateNewDrawing(templatePath As String) As Object
    Dim swDrawing As Object
    
    ' 遅延バインディングにより、どのバージョンのSolidWorksでも動作を試みる
    ' NewDocument(テンプレート名, ドキュメントタイプ, 幅, 高さ)
    Set swDrawing = swApp.NewDocument(templatePath, 0, 0, 0)
    
    If Not swDrawing Is Nothing Then
        Set CreateNewDrawing = swDrawing
    Else
        Set CreateNewDrawing = Nothing
    End If
End Function

' シートフォーマットを制御するメソッド
' ここで「シート名」や「サイズ」の複雑な操作を隠蔽する
Public Sub SetSheetFormat(swDrawing As Object, sheetName As String)
    Dim swDrawDoc As Object
    Dim swSheet As Object
    
    Set swDrawDoc = swDrawing
    ' GetSheet はバージョンが変わっても比較的安定しているが、
    ' ここでエラーハンドリングを完備しておくのがプロの流儀
    Set swSheet = swDrawDoc.GetCurrentSheet()
    
    If Not swSheet Is Nothing Then
        swSheet.SetName sheetName
    End If
End Sub

ステップ2:メインロジックでの利用

次に、標準モジュールに、このラッパーを使った「メインプログラム」を書きます。見てください、この「美しさ」を。

' ==========================================================
' 標準モジュール: MainModule
' 目的: 業務ロジックの記述(ラッパーを利用)
' ==========================================================
Option Explicit

Sub ExecuteDrawingAutomation()
    Dim swWrapper As New clsSWWrapper ' 自作ラッパーを呼び出し
    Dim swDrawing As Object
    Dim templatePath As String
    
    ' 1. SolidWorksへの接続(ここが失敗したら即終了)
    If Not swWrapper.Connect() Then
        MsgBox "SolidWorksを起動できませんでした。", vbCritical
        Exit Sub
    End If
    
    ' 2. 設定(テンプレートパスなどは本来設定ファイル等から読み込む)
    templatePath = "C:\ProgramData\SolidWorks\templates\Drawing.drwdot"
    
    ' 3. 図面の作成(ラッパーに任せる)
    Set swDrawing = swWrapper.CreateNewDrawing(templatePath)
    
    If swDrawing Is Nothing Then
        MsgBox "図面の作成に失敗しました。テンプレートパスを確認してください。", vbExclamation
        Exit Sub
    End If
    
    ' 4. シート操作(ラッパーに任せる)
    ' メインロジック側は「何をするか」に集中できる
    swWrapper.SetSheetFormat swDrawing, "A3_Standard_Sheet"
    
    MsgBox "図面生成プロセスが正常に完了しました!", vbInformation
End Sub

4. ここがプロの分かれ道:陥りやすい罠と回避策

このアーキテクチャを運用する上で、皆さんに覚えておいてほしい「極限の知見」が3つあります。

① `Object` 型の使い分け

ラッパー内部では `Object` を使い倒して構いません。しかし、ラッパーから外に出すオブジェクト(今回の `swDrawing` など)は、「そのオブジェクトが何であるか」を明確に意識してください。遅延バインディングを使う以上、型チェックは自分で行う必要があります。

② エラーハンドリングの「二段構え」

ラッパー内部では `On Error Resume Next` を戦略的に使い、エラーが発生しても「止まらずに、かつエラーを検知できる」ように設計します。一方で、メインロジックでは `If swDrawing Is Nothing Then` のように、「戻り値が有効かどうか」を必ずチェックしてください。

③ パフォーマンスの「重み」

「遅延バインディングは遅い」と言われますが、図面生成のような「ファイルを開く」「描画する」といった重い処理に比べれば、API呼び出しのオーバーヘッドは無視できるレベルです。「速度のために堅牢性を捨てる」のは、設計自動化においては最大の悪手です。

結びに:一歩先へ進むあなたへ

いかがでしたか?
「マクロの記録」で出力されたコードは、いわば「動けばいい」というレベルの、剥き出しの命令です。しかし、今回紹介したラッパーアーキテクチャは、将来の変更に耐えうる「設計されたソフトウェア」です。

最初はクラスを作るのが面倒に感じるかもしれません。しかし、一度この仕組みを作ってしまえば、あなたは数年後、SolidWorksのメジャーアップデートが来た際も、コーヒーを飲みながら優雅にラッパーを数行修正するだけで済むのです。

ここをクリアすれば、SolidWorks VBAの基本、そして「設計自動化エンジニア」としての基礎はバッチリですよ。

さあ、次はあなたの手で、世界で最も堅牢な自動化ツールを作り上げてください。応援しています!

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