こんにちは!SolidWorks自動化の現場で泥臭く、かつ優雅にシステムを作り続けている先輩エンジニアです。
「マクロの記録」ボタンを押して図形をポチポチ…。「お、VBAのコードが吐き出されたぞ!」と感動したのも束の間、いざそれを別のデータで動かそうとすると「エラー 9: インデックスが有効ではありません」の荒波に飲み込まれて絶望する。……うんうん、誰もが通る通過儀礼です。安心してください、私も昔はそこで盛大に爆死していました。
今回は、そんな「記録マクロの呪縛」を完全に断ち切り、外部の頭脳である SQL Server(データベース) とSolidWorksを直結させ、受注データに応じて 「フルオーダーメイドのパーツ」を一瞬でフルスクラッチ生成する究極の自動化システム を解説します。
ここをクリアすれば、あなたのVBAスキルはただの「お絵描きツール」から、現場を救う「最強のエンジニアリング武器」へと進化します。さあ、一緒に扉を開けましょう!
—
1. なぜ「SQL Server × SolidWorks VBA」なのか?
製造業の現場でよくある光景:
> 「顧客から特注サイズのブラケットの注文が入った。幅、高さ、板厚が毎回違う。CADオペレーターが図面と3Dモデルを毎日何十件も手動で修正している……」
これ、エンジニアの仕事として面白くないですよね。ミスも起きる。
だったら、「データベースに受注データが登録された瞬間、あるいはVBAのボタン一つで、SQLから寸法の数値をごっそり引っこ抜き、SolidWorksが勝手にゼロから3Dモデルを構築する」 仕組みを作ってしまいましょう。
これが実現すると、人間は「データを入力するだけ(あるいは何もしない)」。あとはVBAが数秒で完璧なパーツを作り上げます。
—
2. 全体像:システムが動くメカニズム
今回のアーキテクチャは以下の通りです。
1. SQL Server接続: ADO(ActiveX Data Objects)を使い、VBAから直接データベースへSQLクエリを投げる。
2. パラメータ取得: 該当する製品の「幅($W$)」「高さ($H$)」「板厚($T$)」などの数値を変数に格納。
3. 新規パーツ作成: テンプレートに頼らず、完全な白紙の状態(`NewDocument`)からパーツドキュメントを生成。
4. ジオメトリ生成: 基準平面の選択、スケッチの描画、フィーチャ(押し出しなど)の実行をAPIで命令。
—
3. 実装コード:データベース連動パーツ自動生成エンジン
開発現場でそのままコピペして、データベースの接続情報だけ書き換えれば動く実用コードを用意しました。VBAの標準モジュールに貼り付けて実行してください。
Option Explicit
‘ =================================================================================
‘ 外部RDB(SQL Server)連携 & 3Dパーツ自動生成メインプロシージャ
‘ 前提条件: 参照設定に「Microsoft ActiveX Data Objects x.x Library」を追加してください
‘ =================================================================================
Sub GenerateCustomPartFromDB()
‘ — 1. データベースから仕様パラメータを取得 —
Dim conn As Object
Dim rs As Object
Dim connectionString As String
Dim sql As String
‘ パラメータ格納用変数
Dim partWidth As Double
Dim partHeight As Double
Dim partThickness As Double
‘ SQL Server 接続文字列(環境に合わせて変更してください)
connectionString = “Provider=SQLOLEDB;Server=YOUR_SERVER_NAME;Database=ProductDB;Uid=your_user;Pwd=your_password;”
‘ 最新の受注データを取得するSQL
sql = “SELECT TOP 1 Width, Height, Thickness FROM Orders WHERE Status = ‘Pending’ ORDER BY OrderDate DESC”
Set conn = CreateObject(“ADODB.Connection”)
Set rs = CreateObject(“ADODB.Recordset”)
On Error GoTo ErrorHandler
conn.Open connectionString
rs.Open sql, conn
If rs.EOF And rs.BOF Then
MsgBox “処理対象のデータがSQL Serverに存在しません。”, vbExclamation, “連携エラー”
GoTo CleanUp
End If
‘ データベースから値を変数にバインド (単位はミリメートルを想定し、Metersに変換する場合はここで調整)
partWidth = rs.Fields(“Width”).Value / 1000# ; ‘ SolidWorks内部単位は「メートル」!ここ超重要!
partHeight = rs.Fields(“Height”).Value / 1000#
partThickness = rs.Fields(“Thickness”).Value / 1000#
rs.Close
conn.Close
‘ — 2. SolidWorks API によるパーツのフルスクラッチ生成 —
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim boolstatus As Boolean
Set swApp = Application.SldWorks
‘ 完全な新規パーツドキュメントを作成 (引数は ユーザー定義テンプレートパス、今回は空の標準パーツ)
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\SOLIDWORKS 2023\templates\Part.prtdot”, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “パーツドキュメントの新規作成に失敗しました。”, vbCritical
Exit Sub
End If
Set swPart = swModel
‘ — 3. ジオメトリ構築(フロント平面にベースプレートを描画して押し出す) —
‘ フロント平面を選択してスケッチモードに入る
boolstatus = swModel.Extension.SelectByID2(“フロント”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
swModel.SketchManager.InsertSketch True
‘ 中心矩形を描画 (原点を中心に Width × Height の長方形)
‘ ※SolidWorks APIの座標系はすべて「メートル(m)」です!
Dim skRect As Object
Set skRect = swModel.SketchManager.CreateCenterRectangle(0, 0, 0, partWidth / 2, partHeight / 2, 0)
‘ スケッチを終了
swModel.SketchManager.InsertSketch False
‘ 押し出しフィーチャの作成(板厚分だけ押し出す)
Dim swFeatMgr As SldWorks.FeatureManager
Set swFeatMgr = swModel.FeatureManager
‘ BossExtrusion2(d1, revDir, d1EndCond, d2EndCond, d1Draft, d2Draft, d1Rev, d2Rev, …)
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatMgr.FeatureExtrusion2( _
True, _ ‘ 押し出し方向を反転するか
False, _ ‘ ディープサーフェス等
0, _ ‘ 終了条件 (0: 押し出し、ブラインド)
0, _ ‘ 2方向目の終了条件
partThickness, _ ‘ 押し出し深さ (メートル)
0, 0, _ ‘ テーパー角
False, False, _ ‘ ドラフト等
False, False, _ ‘ ゼロ厚み等
0, 0, 0, _ ‘ オフセット等
True, False, _ ‘ マージするかどうか
True, _ ‘ 自動フィレットなど
1, 0, 0 ‘ 方向
)
‘ — 4. 自動保存とクリーンアップ —
Dim savePath As String
savePath = “C:\AutomatedParts\CustomPart_” & Format(Now, “YYYYMMDD_HHNNSS”) & “.sldprt”
Dim errors As Long
Dim warnings As Long
boolstatus = swModel.Extension.SaveAs2(savePath, 0, 1, 0, 0, True, errors, warnings)
MsgBox “SQL Serverからのデータ連動によるパーツ生成が完了しました!” & vbCrLf & “保存先: ” & savePath, vbInformation, “成功”
CleanUp:
Set rs = Nothing
Set conn = Nothing
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
Resume CleanUp
End Sub
—
4. 陥りやすい罠と「プロの知見」
このコードを動かすにあたり、SolidWorks APIの「知る人ぞ知る鉄則」をいくつか共有しておきます。ここを知っているだけで、バグに悩む時間が劇的に減ります。
① 単位系の罠:APIは「メートル(m)」で喋る
UI画面上(画面の右下)で「mmGS(ミリメートル・グラム・秒)」に設定していても、SolidWorks APIの内部演算はすべて「メートル(m)」で行われます。
データベースから取得した「幅 500」をそのままコードに突っ込むと、「500メートル(東京タワーよりデカい)」の怪物パーツが出来上がり、グラフィック画面が真っ白になってフリーズします。必ずコード内で `1000#` で割ってメートルに変換してください。
② 新規作成の作法:テンプレートのパス問題
`swApp.NewDocument` を使う際、指定するテンプレートパス(`.prtdot`)がPC環境によって異なったり、存在しないとモデルが `Nothing`(空っぽ)を返し、その後の `SelectByID2` で盛大にヌルポインター例外(エラー 91)を叩き出します。
必ず自社のSolidWorks環境にある正しいテンプレートのフルパスを指定してください。
③ オブジェクトのライフサイクル管理
VBAにおけるADO(データベース接続)やSolidWorksのドキュメントオブジェクトは、メモリをたくさん食います。処理の最後には必ず `Set rs = Nothing`, `Set conn = Nothing` と明示的に解放し、メモリリークを防ぐのが一流のエンジニアの作法です。
—
最後に:ここをクリアすれば、あなたはもう初心者ではない
外部データベースと連動し、一瞬で3Dジオメトリを錬成する――。
ここまで出来れば、もはや「マクロの記録」の面影はありません立派なCADインテグレーション・エンジニアです。
現場の面倒なルーティンワークはプログラムにすべて押し付け、あなたしか作れないクリエイティブな設計業務に没頭しましょう。
SolidWorks VBAの深淵へ、ようこそ!
