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

スポンサーリンク

こんにちは!SolidWorksの自動化の海へようこそ。
マクロの記録ボタンを押して生成されたコードを眺める日々から、「自分の手で本格的なシステムを組み上げたい」と一歩踏み出したあなたへ。

今回は、現場で絶対に役立つ「外部Excel(&ADO)を経由した、SQL Serverからの部品パラメータ自動インポート」という、極めて実務的なテーマを解説します。

「SolidWorksのマクロからデータベースに繋ぐなんて、難しそう…」と思うかもしれませんが、大丈夫。ここをクリアすれば、あなたの設計自動化スキルは間違いなくプロの領域に到達します。優しく、かつ本質的なところまで丁寧に紐解いていきますね。

なぜ「Excel・ADO・SQL Server」なのか?

製造業の現場では、型番、材質、コスト、強度などのマスターデータが、社内の基幹データベース(SQL Serverなど)で一元管理されています。

もし、設計者が図面を描くたびに手入力で寸法やプロパティを書き換えていたらどうなるでしょう? ヒューマンエラーの温床になりますよね。
これをSolidWorksのマクロから直接SQL Serverに問い合わせ、取得した最新データでモデルの「数式(Global Variables)」や「ユーザー定義プロパティ」を自動で書き換えることができたら……?

夢のワンクリック設計自動化の完成です。

しかし、SolidWorksのVBAから直接SQL Serverを叩くドライバ設定は、PC環境によってセキュリティエラー(権限やビット数問題)で躓きがちです。そこでワンクッション、「Excel(VBA)のADO(ActiveX Data Objects)機能」を裏側でスマートに利用する手法が、最も堅牢で現場トラブルが少ないベストプラクティスとなります。

全体像のアーキテクチャ

今回の仕組みは、以下のステップで流れるように動作します。

1. SolidWorksからトリガー起動(対象のアセンブリや部品を開いている状態)
2. ADOによるSQL Server接続(VBAからSQL文を発行し、型番をキーにDBからデータを取得)
3. グローバル変数 / プロパティの書換(取得した材質や寸法値をSolidWorksのモデルに流し込む)
4. リビルド実行(モデルを最新状態に強制更新)

実装コード:データベース連携マクロの全貌

それでは、実際に現場で使える実用コードを公開します。
VBAの標準モジュールにそのまま貼り付け、適宜接続文字列(`ConnectionString`)をご自身の環境に合わせて書き換えて使ってください。

Option Explicit

‘ ==============================================================================
‘ 【チーフアーキテクト直伝】SQL Server連携によるパラメータ自動インポート
‘ ==============================================================================
Sub ImportParametersFromDatabase()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swEqnMgr As SldWorks.EquationMgr

‘ 1. SolidWorksアプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “アクティブなモデルが存在しません。モデルを開いてから実行してください。”, vbCritical, “エラー”
Exit Sub
End If

‘ 2. データベースから取得するシミュレーション(本来はここでSQL Serverへ接続)
Dim dbPartNumber As String
Dim dbMaterial As String
Dim dbLength As Double

‘ ※今回は「MEC-001」という型番の部品を検索したと仮定します
dbPartNumber = “MEC-001”

If Not FetchDataFromSQLServer(dbPartNumber, dbMaterial, dbLength) Then
MsgBox “データベースからのデータ取得に失敗しました。”, vbCritical, “DB接続エラー”
Exit Sub
End If

‘ 3. SolidWorksの「ユーザー定義プロパティ」へ材質を書き込む
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)

‘ プロパティ名「材質」にDBから取得した値をセット(既存なら上書き)
swCustPropMgr.Add3 “材質”, swCustomInfoText, dbMaterial, swCustomPropertyReplaceValue

‘ 4. SolidWorksの「数式(Global Variables)」の値を書き換える
‘ 事前にSolidWorks側で “Total_Length” というグローバル変数が定義されている必要があります
Set swEqnMgr = swModel.GetEquationMgr

Dim eqIndex As Long
eqIndex = swEqnMgr.Find(“””Total_Length”””)

If eqIndex >= 0 Then
‘ 既存の数式を更新(例: “Total_Length = 150mm” のようにインデックスを指定して書き換え)
swEqnMgr.Equation(eqIndex) = “””Total_Length”” = ” & dbLength
Debug.Print “数式を更新しました: Total_Length = ” & dbLength
Else
MsgBox “指定されたグローバル変数 ‘Total_Length’ がモデル内に見つかりません。”, vbExclamation, “警告”
End If

‘ 5. モデルの完全リビルド(変更を形状に反映)
swModel.EditRebuild3

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

End Sub

‘ ==============================================================================
‘ ADOを用いたSQL Server通信関数(実務仕様)
‘ ==============================================================================
Private Function FetchDataFromSQLServer(ByVal partNo As String, ByRef outMaterial As String, ByRef outLength As Double) As Boolean

Dim conn As Object
Dim rs As Object
Dim connStr As String

On Error GoTo ErrorHandler

‘ ADOオブジェクトの生成(※要 Microsoft ActiveX Data Objects ライブラリ参照設定、または遅延バインディング)
Set conn = CreateObject(“ADODB.Connection”)
Set rs = CreateObject(“ADODB.Recordset”)

‘ 接続文字列の構築(※環境に合わせて変更してください)
‘ 例: SQL Server認証の場合
connStr = “Provider=SQLOLEDB;Server=YOUR_SERVER_NAME;Database=YOUR_DB_NAME;Uid=YOUR_USER;Pwd=YOUR_PASSWORD;”

‘ 統合認証(Windows認証)の場合の文字列はこちら
‘ connStr = “Provider=SQLNCLI11;Server=YOUR_SERVER_NAME;Database=YOUR_DB_NAME;Trusted_Connection=yes;”

‘ データベース接続オープン
conn.Open connStr

‘ SQLクエリの実行(インジェクション対策としてパラメータクエリを使うのがベストですが、簡略化のため文字列結合の例)
Dim sql As String
sql = “SELECT Material, Length FROM PartsMaster WHERE PartNumber = ‘” & partNo & “‘”

rs.Open sql, conn

If Not rs.EOF Then
‘ DBから取得した値を参照渡し変数に格納
outMaterial = rs.Fields(“Material”).Value
outLength = CDbl(rs.Fields(“Length”).Value)
FetchDataFromSQLServer = True
Else
‘ 該当データなし
FetchDataFromSQLServer = False
End If

‘ クリーンアップ
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
Exit Function

ErrorHandler:
MsgBox “SQL Server通信中にエラーが発生しました: ” & Err.Description, vbCritical, “ADO Error”
FetchDataFromSQLServer = False
If Not rs is Nothing Then If rs.State = 1 Then rs.Close
If Not conn is Nothing Then If conn.State = 1 Then conn.Close
End Function

開発現場で陥りやすい「3大トラップ」と対策

このコード、あるいは同様のデータベース連携を実装する際、エンジニアが必ずハマる「罠」があります。先回りしてクリアしておきましょう。

1. 「グローバル変数の名前の書き方」でエラーになる

SolidWorksのAPIで数式(EquationMgr)を操作する際、変数名や数式の文字列にはダブルクォーテーション(`”`)の厳密なエスケープが必要です。
VBA内でダブルクォーテーションを表現するには `””` と重ねる必要があるため、`”””Total_Length”””` のような記述になります。ここをサボると「数式構文エラー」でマクロがクラッシュします。

2. データベースのデータ型とVBAの型の不一致

SQL Server側の `Length` カラムが `Float` や `Decimal` であっても、VBA側で受け取る際に暗黙の型変換エラーを起こすことがあります。コード内にある `CDbl()` 関数のように、明示的にデータ型をキャスト(変換)する習慣を持ちましょう。これが堅牢なシステムを作る極意です。

3. リビルド(`EditRebuild3`)のし忘れ

数式やプロパティの数値を書き換えても、SolidWorksのグラフィック領域やフィーチャー寸法が自動で追従しないことがあります。プログラムの最後には必ず `swModel.EditRebuild3` を呼び出し、モデルの再計算を強制させてください。

先輩エンジニアからのエール

お疲れ様でした!ここまで読み進めたあなたなら、単なる「マクロの記録の切り貼り」を卒業し、「外部システムと連携してSolidWorksを自在に操るエンジニア」への扉を確実に開いています。

データベース連携ができるようになると、設計現場の工数は劇的に削減され、ミスはゼロに近づきます。「こんな自動化もできるかな?」という好奇心を大切に、まずはご自身の環境でテストしてみてください。

ここをクリアできれば、SolidWorks VBAの基本はもうバッチリです。
あなたの開発ライフが実り多いものになるよう、陰ながら応援しています!

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