【実務・中級編】【外部Excel連携の応用】ADOとSQL Serverを用いた社内DBからの部品パラメータ自動インポート – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA × SQL Server】外部DBから部品パラメータを秒速インポートする堅牢な連携アーキテクチャ

設計現場における「図面の数値手入力」ほど、エンジニアの創造的な時間を奪う無駄な作業はない。
エクセルからコピペする、社内基幹システムからCSVをダウンロードする――そんなアナログなワークフローは、今日で終わりにしよう。

今回は、SolidWorksのマクロ(VBA)から直接社内のSQL Server(ADO)へ接続し、型番や材質データを瞬時に取得。モデルの「グローバル変数(Global Variables)」および「寸法」を完全自動で書き換える、プロダクションレベルのシステム構築術を伝授する。

単に動くだけのコードではない。「なぜその書き方では現場で破綻するのか」「数千の部品を扱っても重くならないためのメモリ管理とは何か」
プロのアーキテクトが実務の現場で培った、堅牢な設計思想のすべてをここに公開する。

1. なぜ「生」のVBAコードでは実務で破綻するのか?

多くのエンジニアがやりがちな間違いは、VBAの標準機能だけでデータベースに接続し、エラーハンドリングを一切せずにモデルを更新することだ。

実務の現場では、以下の「地獄」が確実に訪れる。
1. ネットワークの瞬断によるハングアップ:DB接続が切れた瞬間、SolidWorksごとフリーズする。
2. メモリリーク(COMオブジェクトの解放漏れ):`Recordset`や`Connection`をそのまま放置すると、SolidWorksのプロセスが肥大化し、最終的に強制終了する。
3. トランザクションの欠如:途中でエラーが発生した際、中途半端に寸法が書き換わった「ゴミモデル」が保存される。

これらを防ぐため、本アーキテクチャでは 「早期バインド(参照設定)」「厳格なオブジェクトライフサイクル管理(確実な解放)」 を徹底する。

2. 開発環境の準備と前提条件

参照設定の追加

VBAのIDE(Alt + F11)を開き、メニューの「ツール」>「参照設定」から以下にチェックを入れる。

  • `Microsoft ActiveX Data Objects 6.1 Library` (または環境に合わせた最新版)
  • `SolidWorks コマンド タイプ ライブラリ` (SldWorks / ModelDoc2)

※これにより、入力補完(IntelliSense)が効くようになり、タイプミスによるバグを激減させることができる。

3. 【プロダクションコード】SQL Server連携・パラメータ自動インポート実装

以下のコードは、指定した「製品型番(PartNumber)」をキーにしてSQL Serverから材質・寸法値(幅・高さ・厚み)を取得し、SolidWorksの数式(Equations)を一括更新する完全版マクロである。

Option Explicit

‘ =========================================================================
‘ 模块名: clsDbParamImporter
‘ 概要: SQL Serverからパラメータを取得し、SolidWorksモデルを更新する
‘ =========================================================================

Public Sub ImportParametersFromDB()
‘ 1. 接続文字列とクエリの定義(環境に合わせて変更してください)
Const DB_SERVER As String = “192.168.1.100\SQLEXPRESS”
Const DB_NAME As String = “ProductionManagement”
Const DB_USER As String = “sw_reader”
Const DB_PASS As String = “SecurePassword123”

Dim targetPartNumber As String
targetPartNumber = “A-1005-B” ‘ 実際にはユーザーフォームやファイル名から動的に取得する

Dim connString As String
connString = “Provider=MSOLEDBSQL;” & _
“Server=” & DB_SERVER & “;” & _
“Database=” & DB_NAME & “;” & _
“UID=” & DB_USER & “;” & _
“PWD=” & DB_PASS & “;” & _
“TrustServerCertificate=Yes;”

‘ ADO オブジェクトの宣言
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset

‘ SolidWorks オブジェクトの宣言
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swEquationMgr As SldWorks.EquationMgr

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ プリチェック:モデルが開かれているか、かつ部品(Part)か
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType() <> swDocPART Then
MsgBox “このマクロは部品(Part)ドキュメントでのみ実行可能です。”, vbExclamation, “警告”
Exit Sub
End If

On Error GoTo ErrorHandler

‘ 2. データベース接続の確立
conn.ConnectionTimeout = 10
conn.Open connString

‘ 3. パラメータ取得クエリの実行
Dim sql As String
sql = “SELECT MaterialName, ParamWidth, ParamHeight, ParamThickness ” & _
“FROM M_ComponentParameters WHERE PartNumber = ‘” & targetPartNumber & “‘;”

rs.Open sql, conn, adOpenForwardOnly, adLockReadOnly

If rs.EOF And rs.BOF Then
MsgBox “指定された型番 [” & targetPartNumber & “] のデータがDBに存在しません。”, vbExclamation, “データなし”
GoTo Cleanup
End If

‘ 4. 取得データの変数格納
Dim dbMaterial As String
Dim dbWidth As Double
Dim dbHeight As Double
Dim dbThickness As Double

dbMaterial = rs.Fields(“MaterialName”).Value
dbWidth = rs.Fields(“ParamWidth”).Value
dbHeight = rs.Fields(“ParamHeight”).Value
dbThickness = rs.Fields(“ParamThickness”).Value

‘ 5. SolidWorksの数式(Equations)マネージャーの取得
Set swEquationMgr = swModel.GetEquationMgr()

‘ トランザクション的処理の開始(SolidWorksの自動リビルドを一時停止して高速化)
swModel.SetUserPreferenceToggle swUserPreferenceToggle_e.swAutoRebuildModel, False

‘ グローバル変数の更新(存在しない場合は新規追加、存在する場合は値を更新)
Call UpdateOrAddEquation(swEquationMgr, “Width”, dbWidth)
Call UpdateOrAddEquation(swEquationMgr, “Height”, dbHeight)
Call UpdateOrAddEquation(swEquationMgr, “Thickness”, dbThickness)

‘ 材質の適用
Dim status As Boolean
status = swModel.SetMaterialPropertyName2(“”, “CustomMaterials.sldmat”, dbMaterial)

‘ 自動リビルドを戻し、モデルを強制更新
swModel.SetUserPreferenceToggle swUserPreferenceToggle_e.swAutoRebuildModel, True
swModel.ForceRebuild3 False

MsgBox “データベースからのパラメータインポートが正常に完了しました。”, vbInformation, “成功”

Cleanup:
‘ 6. 【極めて重要】オブジェクトの確実な解放(メモリリーク防止)
On Error Resume Next
If Not rs Is Nothing Then
If rs.State Then rs.Close
Set rs = Nothing
End If
If Not conn Is Nothing Then
If conn.State Then conn.Close
Set conn = Nothing
End If
Exit Sub

ErrorHandler:
‘ 異常系処理
swModel.SetUserPreferenceToggle swUserPreferenceToggle_e.swAutoRebuildModel, True
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “システムエラー”
Resume Cleanup
End Sub

‘ =========================================================================
‘ ヘルパー関数: グローバル変数が存在すれば更新、なければ追加する
‘ =========================================================================
Private Sub UpdateOrAddEquation(eqMgr As SldWorks.EquationMgr, varName As String, val As Double)
Dim i As Long
Dim index As Long
index = -1

‘ 既存の数式を走査
For i = 0 To eqMgr.GetCount – 1
Dim eqStr As String
eqStr = eqMgr.Equation(i)
‘ “Width = 100mm” のような文字列から変数名を抽出して比較
If InStr(1, eqStr, “\”” & varName & “\”””, vbTextCompare) > 0 Or _
InStr(1, eqStr, varName & ” =”, vbTextCompare) = 1 Then
index = i
Exit For
End If
Next i

Dim formattedEquation As String
formattedEquation = “\”” & varName & “\” = ” & val & “mm”

If index >= 0 Then
‘ 既存の数式を更新
eqMgr.Equation(index) = formattedEquation
Else
‘ 新規追加
eqMgr.Add -1, formattedEquation
End If
End Sub

4. チーフアーキテクトが教える実装の勘所・注意点

① ADOプロバイダの選定 (`MSOLEDBSQL` を使え)

古いコードでは `Provider=SQLOLEDB` が使われがちだが、これはすでにマイクロソフト社によるサポートが終了している。現行の標準かつ最もパフォーマンスが高い `MSOLEDBSQL`(Microsoft OLE DB Driver for SQL Server) を使用すること。これにより、通信の暗号化やモダンなSQL Serverの機能に対応できる。

② SolidWorksの描画・リビルド抑制による高速化

数千行のパラメータを持つアセンブリや複雑な部品でこれを実行すると、1つの変数を変えるたびにモデルが再構築(Rebuild)され、マシンが数分間フリーズする。
コード内にある通り、`swAutoRebuildModel` を `False` にし、すべての変数を書き換えた最後に `ForceRebuild3` を1回だけ呼ぶ。これだけで処理速度が10倍以上変わる。実務では必須のテクニックだ。

③ COMオブジェクトの「二重解放」トラップ

VBAではガベージコレクションが曖昧であるため、`Recordset`やバッファがメモリに残ったままマクロを何度も実行すると、SolidWorksがメモリ不足でクラッシュする。
必ず `Cleanup:` ラベルを用意し、エラーの有無に関わらず `rs.Close` と `Set rs = Nothing` を通る構造にすること。

5. おわりに:自動化の先にあるもの

このシステムを導入すれば、設計者が図面の数値を手で叩く必要は一切なくなる。基幹システムのデータが正しければ、SolidWorksのモデルも常に絶対に正しい状態に保たれる。

「人が手で入力する作業」を撲滅し、エンジニアを純粋な「設計・創造」に集中させること――それが、我々業務自動化エンジニアの使命だ。
ぜひ自社の環境に合わせて接続文字列を調整し、現場のワークフローを圧倒的に加速させてほしい。

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