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

スポンサーリンク

【SolidWorks VBA × SQL Server】外部DB連携によるオンデマンド・3Dモデル動的生成の極意

こんにちは。開発プロジェクトの現場を率いるチーフアーキテクトの私だ。

これまで、ローカルのExcelやCSVを読み込んでSolidWorksのパラメータを駆動させるマクロを散々と書いてきたことだろう。しかし、その手法に限界を感じていないか?
「設計変更のたびにExcelが乱立する」「バージョンの整合性が取れない」「複数人での同時利用でファイルロックが発生する」。

業務効率化のフェーズが上がれば上がるほど、単なるファイルベースの自動化は破綻する。
今、我々が目指すべきは「外部データベース(SQL Server)をシングルソース・オブ・トュルース(単一の真実)とし、SolidWorksがオンデマンドで形状を自動生成する堅牢なエンジニアリング・パイプラインの構築」だ。

今回は、ADODBを用いたSQL Server連携の極意と、SolidWorks APIを安全に操るためのプロダクションコードをロジカルかつシャープに伝授する。

なぜ「ファイル連携」を捨て、SQL Serverと直接繋ぐべきなのか?

多くのエンジニアは、VBAからExcelを中間マージンとして挟みたがる。だが、考えてみてほしい。データベースサーバが社内LANやクラウド(Azure SQL Database等)にあるなら、ADO(ActiveX Data Objects)を使って直接クエリを投げた方が圧倒的に高速かつ安全だ。

1. トランザクションの整合性と排他制御

Excelファイルを開いたままにして他の人が保存できない、といったロック競合はデータベースでは起きない。ACID特性に守られたSQL Serverであれば、複数ユーザーが同時に異なるパラメータでSolidWorksをキックしても、データの整合性は完全に担保される。

2. クエリによる強力なフィルタリング

数万件のマスターデータから、必要な製品コード(Product Code)のパラメータだけをピンポイントでメモリ上に引き抜く。Excelの`VLOOKUP`や`Range.Find`で泥臭く探す処理とは、パフォーマンスの次元が違う。

堅牢なDB連携における3つの鉄則

実務で動くコードを書く前に、プロとして絶対に押さえておかなければならない設計思想を共有する。

1. 接続文字列(Connection String)の適切な管理
ハードコーディングは厳法。認証情報は別シートや環境変数、あるいはセキュアな設定ファイルに逃がす設計にせよ。(今回は解説の都合上、コード内に記述するが本番では注意すること)
2. 早期解放(Early Disposal)の徹底
`ADODB.Connection`や`ADODB.Recordset`は、メモリリークの温床になりやすい。エラーハンドリング(`On Error Goto`)を必ず実装し、異常終了時でも確実にオブジェクトを破棄(`Close` & `Set = Nothing`)しろ。
3. SolidWorksのサイレント実行とイベント抑制
モデル生成中に画面描画(Graphics)やフィーチャーの再構築(Rebuild)を毎回行っていると、処理速度が致命的に落ちる。`SldWorks.UserControl`や`ModelDoc2.Visible`、コンフィギュレーションの切り替え制御を適切に行うこと。

プロダクションコード:SQL Server連携 & 動的生成モジュール

以下のコードは、SQL Serverから製品仕様(寸法値: Length, Width, Height)をADODBで取得し、アクティブなSolidWorksパーツの寸法駆動変数(グローバル変数または寸法名)を書き換えてリビルドする実用的なVBAモジュールだ。

Option Explicit

‘ ==============================================================================
‘ 処理名: SQL Server連携によるSolidWorksモデル動的生成エンジン
‘ 依存関係: Microsoft ActiveX Data Objects 2.x Library (要参照設定)
‘ ==============================================================================
Sub GenerateModelFromDatabase()

‘ — 1. 変数宣言 —
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDimension As SldWorks.Dimension

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim connString As String
Dim query As String

Dim productCode As String
Dim paramLength As Double
Dim paramWidth As Double
Dim paramHeight As Double

Dim longstatus As Long

‘ — 2. ユーザー入力の取得 —
productCode = InputBox(“生成する製品コード(Product Code)を入力してください:”, “DB連携モデル生成”, “PROD-001”)
If Trim(productCode) = “” Then Exit Sub

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

If swModel Is Nothing Then
MsgBox “対象となるSolidWorksのドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイル(Part)でのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If

‘ — 4. ADODBによるSQL Server接続とデータ取得 —
‘ ※接続文字列は実際の環境(SQL ServerのIP、DB名、認証方式)に合わせて書き換えてください
connString = “Provider=SQLOLEDB;Server=192.168.1.50;Database=EngineeringDB;Uid=sw_user;Pwd=SecurePassword123;”

Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset

On Error GoTo ErrorHandler

conn.CursorLocation = adUseClient
conn.Open connString

‘ パラメータ化クエリでSQLインジェクションを防止
query = “SELECT SpecLength, SpecWidth, SpecHeight FROM ProductMasters WHERE ProductCode = ‘” & Replace(productCode, “‘”, “””) & “‘”
rs.Open query, conn, adOpenStatic, adLockReadOnly

If rs.EOF Then
MsgBox “指定された製品コード [” & productCode & “] はデータベースに存在しません。”, vbExclamation, “データなし”
GoTo CleanUp
End If

‘ パラメータの抽出
paramLength = rs.Fields(“SpecLength”).Value
paramWidth = rs.Fields(“SpecWidth”).Value
paramHeight = rs.Fields(“SpecHeight”).Value

‘ データベース接続の早期クローズ
rs.Close
conn.Close

‘ — 5. SolidWorks モデルの動的更新 —
‘ 画面描画を一時停止し、処理速度を劇的に向上させる
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, True

‘ 注: あらかじめSolidWorks側で寸法名(”D1@Boss-Extrude1″など)またはグローバル変数名を設定しておくこと
‘ ここでは寸法名を直接指定して駆動させる例
Set swDimension = swModel.Parameter(“Length@Sketch1”)
If Not swDimension Is Nothing Then
swDimension.SystemValue = paramLength / 1000# ‘ mmをmに変換(APIの基本単位系はメートル)
End If

Set swDimension = swModel.Parameter(“Width@Sketch1”)
If Not swDimension Is Nothing Then
swDimension.SystemValue = paramWidth / 1000#
End If

Set swDimension = swModel.Parameter(“Height@Boss-Extrude1”)
If Not swDimension Is Nothing Then
swDimension.SystemValue = paramHeight / 1000#
End If

‘ モデルの強制リビルド(変更を形状に反映)
longstatus = swModel.EditRebuild3()

‘ 画面描画の復元
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, False
swModel.ViewZoomtofit2 ‘ 全体表示にズーム

MsgBox “データベースからのパラメータ適用が完了しました。” & vbCrLf & _
“Length: ” & paramLength & “mm” & vbCrLf & _
“Width: ” & paramWidth & “mm” & vbCrLf & _
“Height: ” & paramHeight & “mm”, vbInformation, “処理成功”

CleanUp:
‘ — 6. オブジェクトの確実な解放(メモリリーク防止) —
On Error Resume Next
If Not rs Is Nothing Then
If rs.State = adStateOpen Then rs.Close
Set rs = Nothing
End If
If Not conn Is Nothing Then
If conn.State = adStateOpen Then conn.Close
Set conn = Nothing
End If
Exit Sub

ErrorHandler:
‘ 異常時のクリーンアップとエラーハンドリング
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, False
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & “Error Description: ” & Err.Description, vbCritical, “致命的エラー”
Resume CleanUp
End Sub

チーフアーキテクトからの実践的アドバイス

このコードを現場に導入する際、以下のポイントに気をつけてほしい。

1. 単位系(Unit System)の罠
SolidWorks APIの `SystemValue` は、ドキュメントの設定に関わらず「メートル法(m, kg, s)」を基準として受け付ける。データベース側が「mm」で保持している場合、コード内にあるように `1000#` で割るスケーリングを忘れると、モデルが暴走して巨像(あるいはミクロの微粒子)が生成されるので注意せよ。
2. 参照設定の自動化(LATE BINDINGの検討)
複数台のクライアントPCにこのマクロを配る場合、VBAの「参照設定(Microsoft ActiveX Data Objects)」のバージョン違いでコンパイルエラーが起きることがある。よりロジક્તに配布したい場合は、`CreateObject(“ADODB.Connection”)` を使ったレイトバインディング(遅延バインディング)へ書き換えることを推奨する。

まとめ

外部データベースとSolidWorksの直結は、単なる「手間の削減」ではない。設計データと製造マスターの乖離を防ぎ、エンジニアリングプロセス全体の信頼性を底上げする強力なアーキテクチャだ。

プログラミングは、ただ動くだけの玩具を作ることではない。「壊れにくく、保守しやすく、ビジネスに直結する仕組み」をコードで表現することだ。
今回の知見をあなたの現場の自動化基盤に組み込み、圧倒的な開発スピードを手に入れてほしい。

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