【入門編】【外部データベース(SQL Server)連携】ADODBを用いた社内DBからのパラメータ取得とSolidWorksモデルの動的生成 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の世界へようこそ。
マクロの記録ボタンを押してカタカタ図形を描かせるだけのVBAは、もう卒業しましょう。

今回は、一歩進んで「外部データベース(SQL Server)と連動し、社内の製品仕様データからオンデマンドで3Dモデルを生成・更新するシステム連携基盤」の作り方を解説します。

「VBAからデータベース? なんか難しそう…」と思うかもしれませんが、安心してください。ここをクリアすれば、あなたの設計業務のスピードは文字通り「桁違い」になります。先輩エンジニアとして、実務でそのまま使える極上のコードと知見を優しく、徹底的に伝授しますね。

1. なぜSQL Server × SolidWorksなのか?

多くの現場では、型式ごとの寸法表をExcelで管理し、それをVBAで読み込ませてモデルを更新していると思います。しかし、Excelは「複数人で同時に編集できない」「データが散在しやすい」「マスタ管理に向かない」という弱点があります。

これをSQL Serverに置き換えることで、以下のような圧倒的なメリットが生まれます。

  • 一元管理された真実のデータ(Single Source of Truth): 社内の誰もが同じ最新の仕様マスタを参照できる。
  • オンデマンド生成: 注文が入った瞬間に、データベースの受注番号(ID)をキーにして、一瞬で専用の3Dパーツ・アセンブリを自動生成できる。
  • トレーサビリティ: どの仕様でどのモデルが生成されたかの履歴を完全に追跡できる。

それでは、この仕組みを実現するための全体像を見ていきましょう。

2. システムの全体像とアーキテクチャ

今回構築するVBAマクロのワークフローは以下の通りです。

1. 入力: ユーザーがフォームやインプットボックスで「製品ID(例: `PROD-001`)」を入力する。
2. 通信 (ADODB): VBAからSQL Serverへ接続し、該当する製品の寸法パラメータ(長、幅、高さなど)をSQLクエリで取得する。
3. 検証 (ModelDoc2): SolidWorksの親玉オブジェクトである `SldWorks.Application` と `ModelDoc2` を経由して、アクティブなモデル(またはテンプレート)を操作する。
4. 駆動 (Parameter API): 取得したデータベースの値を、SolidWorksの寸法(Dimension)に流し込み、モデルをリビルドする。

3. 実装コード:SQL Server連携型・動的生成マクロ

それでは、VBAのエディタを開いて、以下のコードを標準モジュールに貼り付けてみてください。
実務でそのまま使えるよう、エラーハンドリングとデータベース接続の作法をしっかりと盛り込んでいます。

Option Explicit

‘ ==============================================================================
‘ 【チーフアーキテクト直伝】SQL Server 連携 & SolidWorks 動的生成エンジン
‘ ==============================================================================
Sub GenerateModelFromDatabase()

‘ 1. 変数の宣言とオブジェクトのライフサイクル管理
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDimension As SldWorks.Dimension

‘ ADODBオブジェクト(データベース接続用)
Dim conn As Object
Dim rs As Object

‘ 接続文字列とSQLクエリ
Dim connectionString As String
Dim sqlQuery As String

‘ データベースから取得するパラメータ用変数
Dim paramLength As Double
Dim paramWidth As Double
Dim paramHeight As Double
Dim targetProductCode As String

‘ ユーザーからの入力を取得
targetProductCode = InputBox(“生成する製品コード(例: PROD-001)を入力してください:”, “SQL Server連携ジェネレータ”, “PROD-001”)
If targetProductCode = “” Then Exit Sub

‘ 2. SolidWorks アプリケーションの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ モデルが開かれているかチェック
If swModel Is Nothing Then
MsgBox “SolidWorksで対象のモデル(またはテンプレート)を開いてから実行してください。”, vbCritical, “エラー”
Exit Sub
End If

‘ 3. ADODBを用いたSQL Serverへの接続設定
‘ ※環境に合わせて Server名、Database名、UID、PWD を変更してください
connectionString = “Provider=SQLOLEDB;Server=YOUR_SERVER_NAME;Database=YOUR_DB_NAME;Uid=YOUR_USER;Pwd=YOUR_PASSWORD;”

Set conn = CreateObject(“ADODB.Connection”)
Set rs = CreateObject(“ADODB.Recordset”)

On Error GoTo ErrorHandler

‘ データベースオープン
conn.Open connectionString

‘ 4. パラメータ取得用SQLの実行
sqlQuery = “SELECT Length, Width, Height FROM ProductMasters WHERE ProductCode = ‘” & targetProductCode & “‘”
rs.Open sqlQuery, conn

‘ 該当データが存在するか確認
If rs.EOF And rs.BOF Then
MsgBox “指定された製品コードが見つかりませんでした: ” & targetProductCode, vbExclamation, “データなし”
GoTo CleanUp
End If

‘ データベースから値を変数に格納
paramLength = rs.Fields(“Length”).Value
paramWidth = rs.Fields(“Width”).Value
paramHeight = rs.Fields(“Height”).Value

‘ データベース接続を閉じる(リソースの解放)
rs.Close
conn.Close

‘ 5. SolidWorksの寸法駆動(API操作)
‘ ※あらかじめモデル側に “D1@Boss-Extrude1” などの寸法名が存在している必要があります

‘ 長さ(Length)の変更
Set swDimension = swModel.Parameter(“Length@Sketch1”)
If Not swDimension Is Nothing Then
‘ 値の設定 (SolidWorksの内部単位はメートル法(MKS)のため、ミリメートルなら 0.001 が必要になる場合があります。文書単位系に注意)
swDimension.SystemValue = paramLength 0.001 ‘ 例: mmをmに換算する場合
End If

‘ 幅(Width)の変更
Set swDimension = swModel.Parameter(“Width@Sketch1”)
If Not swDimension Is Nothing Then
swDimension.SystemValue = paramWidth 0.001
End If

‘ 高さ(Height)の変更
Set swDimension = swModel.Parameter(“Height@Boss-Extrude1”)
If Not swDimension Is Nothing Then
swDimension.SystemValue = paramHeight 0.001
End If

‘ 6. モデルのリビルド(再構築)
swModel.EditRebuild3

MsgBox “製品コード [” & targetProductCode & “] のモデル更新が完了しました!”, vbInformation, “成功”

CleanUp:
‘ 7. オブジェクトの確実な解放(メモリリーク防止)
Set rs = Nothing
Set conn = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
Resume CleanUp

End Sub

4. コードの深掘り:ここがエンジニアの腕の見せ所

上記のコードで、特に重要なポイントをいくつか解説します。ここを理解しておけば、どんな複雑なカスタマイズも怖くありません。

① ADODBによる安全なリソース管理

VBAで外部DBを叩く際、`CreateObject(“ADODB.Connection”)` を使うことで、参照設定(COMコンポーネントの追加の手間)を省略しつつ、SQL Serverと通信できます。
処理が終わったら必ず `rs.Close` と `conn.Close` を行い、`Set conn = Nothing` でメモリを解放する。これがプロのメモリマネジメントです。

② `swModel.Parameter` の魔力

マクロの記録では「どのフィーチャーをどうクリックしたか」というUI操作が記録されますが、実務では `ModelDoc2.Parameter(“寸法名@スケッチ名”)` を使います。
寸法名に「名前(ユーザー定義寸法)」をつけておく(例: `Length` や `Width`)のが、保守性の高いマクロを作る絶対のコツです。フィーチャー名が変わっても寸法名が維持されれば、コードが壊れません。

③ 単位系(SystemValue vs SetValue)の罠

SolidWorksのAPIで数値を代入するとき、最もハマりやすいのが単位系(Unit System)です。

  • `SetValue` は、ドキュメントの現在の表示単位(mmやinch)に依存します。
  • `SystemValue` は、SolidWorksの内部標準単位である「メートル(m)」で値を扱います。

今回のコードでは安全性を考慮し、` 0.001` としてメートルに変換して `SystemValue` に代入しています。ここを間違えると、部品が画面から消え去るほどの巨大な(あるいはミクロな)モデルが生成されるので注意してくださいね。

5. 陥りやすいエラーと対策

1. 「実行時エラー ‘-2147467259 (80004005)’: オペレータまたは データベースが不十分です」

  • 原因: SQL Serverの接続文字列(Server名や認証情報)が間違っているか、SQL Server側でTCP/IP接続が許可されていません。SSMS(SQL Server Management Studio)等で接続確認を先に行ってください。

2. 「寸法が見つかりません(`swDimension` が `Nothing` になる)」

  • 原因: SolidWorks側のモデルに、指定した名前の寸法(例: `Length@Sketch1`)が存在しません。モデルのフィーチャーマネージャで寸法を右クリックし、「プロパティ」から寸法名を明示的にリネームしてください。

まとめ

今回は、一歩進んだ実務レベルの知見として、「SQL Server × SolidWorks VBA」による動的モデル生成基盤を解説しました。

ここをクリアできれば、単なる「マクロの自動化」から、企業の基幹システム(ERP/PDM)と3D CADを繋ぐ「エンジニアリング・オートメーション(EA)」の領域へ足を踏み入れることができます。

「ここをもっとこうしたい」「こういうアセンブリの自動化はどう書くの?」といった疑問があれば、いつでも聞いてください。
あなたのSolidWorksライフが、より知的でエキサイティングなものになることを応援しています!バッチリ使いこなしてくださいね!

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