マクロ記録から「システム」へ。SolidWorks VBAで構築する、図面・DB双方向同期ファクトリーの設計思想
こんにちは。設計自動化の荒波を共に渡るエンジニアの皆さん。
今日、皆さんに伝えたいのは「単なるマクロの書き方」ではありません。
多くの人が「マクロの記録」ボタンを押し、生成されたコードを眺めては「なぜ動かないのか?」「なぜ重いのか?」と頭を抱えています。それは、皆さんが「操作の記録」をしているだけで、「オブジェクトの生命(ライフサイクル)」を理解していないからです。
今日、私たちが挑むテーマは、単なる図面作成ではありません。
「外部SQLデータベースやPDM(製品データ管理)と、SolidWorks図面をリアルタイムで同期させる、双方向のデータ・ファクトリー(工場)」の構築です。
「そんなの、プロの領域じゃないか……」と怖がる必要はありません。
この記事では、初学者が一歩踏み出すための「考え方の型」と、プロが現場で使う「コードの魂」を、丁寧に、かつ極限まで深く解説していきます。
1. 設計図(アーキテクチャ)を理解する:なぜ「同期」が必要なのか?
まず、私たちが作ろうとしているものの全体像をイメージしましょう。
通常、図面内の「図番」や「設計ステータス」は、図面ファイルの中に閉じ込められています。しかし、エンタープライズ(企業)の現場では、情報は常に「マスターデータベース(SQL)」が正解です。
従来のやり方(脆弱な設計)
- 設計者が手入力で図面を書き換える $\to$ DBを更新し忘れる $\to$ 製造部門が古い図面で部品を作る(大事故)
私たちが目指す「同期ファクトリー」(強固な設計)
1. インポート: VBAがSQLから最新の「図番・属性」を読み取り、図面のシートフォーマットやプロパティへ自動流し込み。
2. 監視: 図面上でプロセスの進捗(例:検図完了)が変更されたら、VBAがそれを検知。
3. 書き戻し: 変更されたステータスを即座にSQLへ`UPDATE`文で書き戻す。
この「CADとDBの循環」こそが、自動化エンジニアが目指すべき真のゴールです。
2. SolidWorksオブジェクトの「階層構造」を掌握する
コードを書く前に、SolidWorksという巨大な宇宙の「地図」を理解してください。ここを間違えると、どんなに優れたSQL文も意味をなしません。
図面(Drawing)を操作する場合、オブジェクトは以下のピラミッド構造で成り立っています。
[SldWorks] (アプリケーション全体)
└── [ModelDoc2] (現在開いているドキュメント)
└── [DrawingDoc] (図面特有の機能を持つオブジェクト)
├── [Sheet] (シート:サイズ、向き、シートフォーマット)
│ └── [SheetFormat] (枠線、表題欄などのテンプレート)
└── [View] (図面ビュー:投影図、詳細図)
└── [CustomPropertyManager] (図面やビューに紐づく属性情報)
ここがプロの視点:
初心者は「図面の中身」を変えようとしますが、プロは「CustomPropertyManager(カスタムプロパティマネージャー)」を操作します。図面上のテキストを書き換えるのではなく、「データ(属性)」を書き換え、そのデータがテキストに反映される仕組みを利用するのです。これが、エラーを防ぎ、パフォーマンスを最大化する秘訣です。
3. 実践:SQLと連携する同期エンジンのプロトタイプ
それでは、実際に「図面のプロパティを読み取り、DBへ反映させる」ためのコードの骨格を見ていきましょう。ここでは、データベース接続に標準的な`ADODB`を使用します。
※事前に、VBAエディタの [ツール] $\to$ [参照設定] で “Microsoft ActiveX Data Objects x.x Library” にチェックを入れてください。
' ======================================================================================
' プロジェクト名: Drawing-DB Sync Factory
' 機能: 図面のカスタムプロパティを読み取り、SQL Serverへステータスを書き戻す
' ======================================================================================
Option Explicit
Sub SyncDrawingStatusToDB()
' --- 1. オブジェクト変数の宣言 ---
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim partNumber As String
Dim designStatus As String
' DB接続用
Dim conn As ADODB.Connection
Dim strConn As String
Dim sql As String
' --- 2. SolidWorksオブジェクトの取得 ---
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' エラーチェック:図面が開かれているか?
If swModel Is Nothing Then
MsgBox "図面ファイルを開いてから実行してください。", vbCritical
Exit Sub
End If
If swModel.GetType <> swDocDRAWING Then
MsgBox "これは図面ファイルではありません。", vbExclamation
Exit Sub
End If
Set swDraw = swModel
' --- 3. 図面属性(カスタムプロパティ)の抽出 ---
' 図面全体(General)のプロパティマネージャーを取得
Set swCustPropMgr = swModel.Extension.CustomPropertyManager("")
' プロパティの値を取得(引数: プロパティ名, 取得先変数, 評価済み値変数)
' ここで「図番」と「現在の進捗ステータス」を抜き出す
swCustPropMgr.Get4 "PartNumber", False, partNumber, ""
swCustPropMgr.Get4 "DesignStatus", False, designStatus, ""
' デバッグ用:イミディエイトウィンドウに表示
Debug.Print "取得した図番: " & partNumber
Debug.Print "取得したステータス: " & designStatus
' 図番が空の場合は処理を中断(データの整合性を守る)
If partNumber = "" Then
MsgBox "図面から図番を取得できませんでした。プロパティを確認してください。", vbCritical
Exit Sub
End If
' --- 4. データベースへの書き戻し処理 (ADODB) ---
' ※接続文字列は社内環境に合わせて書き換えてください
strConn = "Provider=SQLOLEDB;Data Source=YOUR_SERVER;Initial Catalog=YOUR_DB;User ID=YOUR_USER;Password=YOUR_PASSWORD;"
Set conn = New ADODB.Connection
On Error GoTo ErrorHandler ' DB接続エラーに備える
conn.Open strConn
' SQL文の構築 (SQLインジェクションを防ぐため、実際の実装ではパラメータ化クエリを推奨)
' 今回は分かりやすさのため直接埋め込み形式で記述します
sql = "UPDATE PartMaster SET Status = '" & designStatus & "' " & _
"WHERE PartNumber = '" & partNumber & "';"
' SQLの実行
conn.Execute sql
MsgBox "同期完了: " & partNumber & " のステータスを [" & designStatus & "] に更新しました。", vbInformation
CleanUp:
' --- 5. 後処理(リソースの解放) ---
' オブジェクトをメモリから解放するのは、プロの作法です
If Not conn Is Nothing Then
If conn.State = adStateOpen Then conn.Close
End If
Set conn = Nothing
Set swCustPropMgr = Nothing
Set swDraw = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbCritical
Resume CleanUp
End Sub
4. ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ
このコード、ただのコピペで終わらせてはいけません。プロとして成長するために、以下の3つのポイントを深く噛み砕いてください。
① 「エラーハンドリング」は愛である
コード内の `On Error GoTo ErrorHandler` を見てください。
DB連携のような外部システムを扱う際、ネットワークの瞬断や権限不足でエラーは必ず起きます。エラーが起きた時に、「なぜ止まったのか」をユーザーに伝え、かつ「接続を安全に閉じる(CleanUp)」。これが、現場で「使い物になる」ツールと「壊れるマクロ」の決定的な差です。
② 「カスタムプロパティ」はデータの心臓
図面のテキスト(文字)を直接書き換えようとしてはいけません。
テキストはあくまで「表示用」です。「データ(Property)」を書き換えれば、図面内の「表示(Annotation)」は自動的に追従します。 この「データの分離」こそが、大規模システムを構築する際の黄金律です。
③ 「オブジェクトの解放」は礼儀である
`Set swApp = Nothing` のような後処理。
VBAのガベージコレクション(メモリ自動掃除)を過信してはいけません。特にAPIを多用する場合、オブジェクトを適切に解放しないと、SolidWorksが「ゾンビプロセス」としてバックグラウンドでメモリを食いつぶし続ける原因になります。
最後に:エンジニアとしての第一歩
マクロの記録から脱却する瞬間は、「操作を自動化すること」から「情報を同期させること」へと、視点が切り替わった時です。
今回紹介した「図面・DB同期ファクトリー」は、まだ入り口に過ぎません。これをベースに、図面のビュー配置を自動化したり、PDMのワークフローと連動させたりと、あなたの設計思想次第で、システムは無限に拡張していきます。
一歩ずつ、確実に。
SolidWorks VBAという強力な武器を、あなたの手で「設計の革命」へと変えていってください。応援していますよ!
