【SolidWorks VBA極限活用】SQL Server直結!フルオーダーメイド・パーツ自動生成システムの設計と実装
こんにちは。チーフアーキテクトの私だ。
これまで数多くの製造業の現場を見てきたが、依然として「受注仕様書を見ながら、CADオペレータが手作業で3Dモデルの寸法を打ち替え、図面を修正する」という不毛なプロセスを放置している企業があまりにも多い。
手作業によるモデリングは、ヒューマンエラーの温床であり、リードタイムの無駄だ。
今回テーマにするのは、「SQL Server上の製品仕様データベースと完全連動し、受注データから一瞬でカスタムパーツをフルスクラッチ生成する自動化システム」の構築手法だ。
単に動くだけのコード片ではない。大規模アセンブリやデータベース連携において、なぜ多くのマクロがクラッシュするのか。その原因と、実務の現場で生き残る「堅牢な設計思想」を余すところなく伝授しよう。
—
1. 非効率な設計の排除:なぜ「場当たり的なマクロ」は破綻するのか?
現場のエンジニアが独学で作ったVBAコードによくあるのが、次のような悪手だ。
1. アクティブドキュメントへの依存 (`SldWorks.ActiveDoc`)
今何が開いているかに依存したコードは、ユーザーがうっかり別のウィンドウをクリックした瞬間に暴走し、意図しないモデルの寸法を破壊する。
2. エラーハンドリングの欠如
DB接続切れや、仕様値が許容範囲外(例:マイナスの寸法、ゼロ除算を引き起こす数値)だった場合に、SolidWorksごとフリーズする。
3. トランザクション管理の不在
ジオメトリ生成の途中でエラーが発生した際、中途半端なゴミファイルやエラーフィーチャだけが残り、後始末に膨大な時間がかかる。
我々が目指すべきは、「完全なステートレス、かつトランザクションを意識した堅牢なアーキテクチャ」である。
—
2. システムアーキテクチャと全体像
今回のシステムは、以下のフローで動作する。
1. DB接続 & データ取得:ADO(ActiveX Data Objects)を用いてSQL Serverへ接続し、最新の受注IDに紐づくパラメータ(外径、長、穴数など)を取得。
2. 事前バリデーション:取得した値が物理的に成立するものかプログラム側で厳密に検証。
3. パーツの新規生成(またはテンプレートからの派生):完全なゼロベース、もしくは最適化されたマスターパーツから、バックグラウンドに近い状態で安全に生成。
4. パラメータの流し込み & リビルド:API経由で寸法駆動し、確実に再構築を実行。
5. 保存とクリーンアップ:指定フォルダへ構造化して保存し、メモリを適切に解放。
—
3. プロダクションコード:SQL Server連携・自動生成モジュール
実務でそのまま組み込める、エラーハンドリングとリソース管理を徹底したVBAコードを公開する。
※実行には、参照設定に `Microsoft ActiveX Data Objects 6.x Library` を追加しておくこと。
Option Explicit
‘ ==============================================================================
‘ 外部DB連携・カスタムパーツ自動生成メインプロシージャ
‘ ==============================================================================
Sub GenerateCustomPartFromDB()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim dbConn As Object
Dim dbRs As Object
Dim connStr As String
Dim query As String
‘ パラメータ用変数
Dim partName As String
Dim outerDiameter As Double
Dim length As Double
Dim holeCount As Long
‘ 1. SolidWorks アプリケーションのインスタンス取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
‘ 2. SQL Server 接続文字列の設定(環境に合わせて変更してください)
connStr = “Provider=SQLOLEDB;Server=YOUR_SERVER_NAME;Database=YOUR_DB_NAME;Uid=YOUR_USER;Pwd=YOUR_PASSWORD;”
On Error GoTo ErrorHandler
‘ 3. ADOによるデータベース接続
Set dbConn = CreateObject(“ADODB.Connection”)
dbConn.Open connStr
‘ 未処理の最新受注データを取得するクエリ
query = “TOP 1 PartNumber, OuterDiameter, Length, HoleCount FROM T_OrderSpecifications WHERE Status = ‘Pending’ ORDER BY OrderDate ASC”
‘ ※実際のSQL方言(SQL Serverなら SELECT TOP 1 …)に合わせて調整してください
query = “SELECT TOP 1 PartNumber, OuterDiameter, Length, HoleCount FROM T_OrderSpecifications WHERE Status = ‘Pending’ ORDER BY OrderDate ASC”
Set dbRs = CreateObject(“ADODB.Recordset”)
dbRs.Open query, dbConn
If dbRs.EOF And dbRs.BOF Then
MsgBox “処理対象の受注データがありません。”, vbInformation
GoTo CleanUp
End If
‘ パラメータの取得
partName = dbRs.Fields(“PartNumber”).Value
outerDiameter = dbRs.Fields(“OuterDiameter”).Value
length = dbRs.Fields(“Length”).Value
holeCount = dbRs.Fields(“HoleCount”).Value
‘ 4. データの物理的妥当性検証(バリデーション)
If outerDiameter <= 0 Or length <= 0 Or holeCount < 0 Then
Err.Raise vbObjectError + 1000, "Validation", "無効な寸法値が検出されました。処理を中断します。"
End If
' 5. 新規パーツドキュメントの作成(部品テンプレートを指定)
' ※環境にあわせたデフォルトの部品テンプレートパスを指定してください
Dim templatePath As String
templatePath = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
Set swModel = swApp.NewDocument(templatePath, swDwgPaperSizes_e.swDwgPaperA4size, 0, 0)
If swModel Is Nothing Then
Err.Raise vbObjectError + 1001, "SolidWorks", "パーツドキュメントの新規作成に失敗しました。"
End If
' 6. ジオメトリ生成・寸法駆動ロジックの呼び出し
Call BuildGeometry(swModel, outerDiameter, length, holeCount)
' 7. ファイルの保存
Dim savePath As String
savePath = "C:\GeneratedParts\" & partName & ".sldprt"
Dim saveError As Long
Dim saveWarning As Long
swModel.Extension.SaveAs savePath, swSaveAsVersion_e.swSaveAsCurrentVersion, swSaveAsOptions_e.swSaveAsOptions_Silent, Nothing, saveError, saveWarning
If saveError <> 0 Then
Err.Raise vbObjectError + 1002, “SolidWorks”, “ファイルの保存に失敗しました。Error Code: ” & saveError
End If
‘ 8. データベース側のステータスを「処理済み」に更新
Dim updateQuery As String
updateQuery = “UPDATE T_OrderSpecifications SET Status = ‘Completed’ WHERE PartNumber = ‘” & partName & “‘”
dbConn.Execute updateQuery
MsgBox “パーツの自動生成が完了しました: ” & savePath, vbInformation
CleanUp:
‘ 9. リソースの確実な解放
On Error Resume Next
If Not dbRs Is Nothing Then
If dbRs.State = 1 Then dbRs.Close
Set dbRs = Nothing
End If
If Not dbConn Is Nothing Then
If dbConn.State = 1 Then dbConn.Close
Set dbConn = Nothing
End If
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub
‘ ==============================================================================
‘ ジオメトリ構築プロシージャ(フィーチャ操作)
‘ ==============================================================================
Private Sub BuildGeometry(ByVal swModel As SldWorks.ModelDoc2, ByVal outerDia As Double, ByVal length As Double, ByVal holes As Long)
Dim swPart As SldWorks.PartDoc
Set swPart = swModel
‘ 画面描画をロックしてパフォーマンスを最大化(チラつき防止と高速化)
swModel.Visible = False
‘ — ここにスケッチおよびフィーチャ生成のAPIコードを記述 —
‘ (実務ではあらかじめ用意したマスターモデルの寸法コンフィギュレーション切替、
‘ またはボス押し出し・カットフィーチャのAPI制御をここに実装します)
‘ 例:寸法変数の書き換え(あらかじめ名前を付けた寸法を操作する場合)
‘ swModel.Parameter(“D1@Boss-Extrude1”).SystemValue = outerDia
‘ swModel.Parameter(“D1@Extrude1”).SystemValue = length
‘ 強制リビルドの実行
swModel.EditRebuild3
‘ 画面描画のロック解除
swModel.Visible = True
End Sub
—
4. プロジェクトを成功させるためのアーキテクチャ上の注意点
このシステムを現場に導入し、運用を安定させるための「プロの知見」をいくつか共有しよう。
① 画面描画のロック (`swModel.Visible = False`) の徹底
APIで大量のスケッチやフィーチャをいじる際、SolidWorksが毎フレーム画面を描画していると、処理速度が何倍にも低下する。バッチ処理的に裏でモデルを構築し、最後に `Visible = True` に戻す手法をとることで、パフォーマンスを極限まで引き上げることができる。
② フルスクラッチか「コンフィギュレーション切替」か
ゼロから押し出しやカットをAPIで積み上げていくフルスクラッチ手法は、形状が劇的に変わる場合には有効だが、コード量が膨れ上がり、メンテナンスが難しくなる。
「トポロジー(形状のトレス構造)が変わらない製品群であれば、マスターモデルのパラメータ(寸法)やコンフィギュレーションをDB値で駆動させる方式」の方が圧倒的に堅牢である。要件に応じた適切なアプローチを選択せよ。
③ トランザクションの整合性
データベース側のステータス更新と、ファイル保存のタイミングには細心の注意を払え。
もし「ファイル保存に失敗したのに、DB側が『処理済み』になる」というバグが起きると、データがロストする。必ず「SolidWorks側の処理が100%成功したことを確認してから、DBのステータスを書き換える」という順序を守ること。
—
5. おわりに
外部データベースとSolidWorksを直結させた自動化は、単なる「マクロによる時短」にとどまらず、「受注から製造データ出力までのリードタイムをゼロにする」というビジネス上の圧倒的な武器になる。
泥臭い手作業のモデリングはロボット(VBA)に任せ、エンジニアは「より高度な設計・クリエイティブな業務」に集中すべきだ。
今回のコードと設計思想をベースに、ぜひ自社の生産性を極限まで引き上げてほしい。健闘を祈る。
