【SolidWorks VBA極限解説】図面リビジョン自動同期と版管理の全自動化アーキテクチャ
SolidWorksのAPIを活用した自動化において、最もフラストレーションが溜まる領域の筆頭が「図面(Drawing)の改訂管理」である。
設計変更のたびに、Excelの管理台帳を開き、SolidWorksの図面を開き、リビジョンテーブル(改訂履歴表)に手動で新しい行を追加し、ゾーンを指定し、説明文を打ち込み、必要であれば図面ビュー上のリビジョン記号(Revision Symbol)の位置を微調整する――。
この泥臭い手作業は、エンジニアの創造的な時間を奪うだけでなく、ヒューマンエラーによる「台帳と図面上のリビジョンの不整合」という致命的な品質リスクを生み出す。
今回は、Excel等の外部管理台帳からデータを取得し、SolidWorks図面のリビジョンテーブルの行追加、パラメータ設定、そして背後で稼働するAPIのメモリ管理の罠までを完全網羅した、実戦投入可能な最高峰のVBAコードと設計思想を授ける。
—
1. 現場が陥るSolidWorks APIの罠とメモリ管理の鉄則
中級者が最初に直面する壁が、「COMオブジェクトの解放漏れによるメモリリークとSolidWorksのフリーズ」だ。
SolidWorks VBAにおいて、`SldWorks.ModelDoc2` や `SldWorks.RevisionTableAnnotation` などのオブジェクトを安易に変数チェーンで呼び捨てにすると、背後で参照カウンタが保持され続け、プロセスがメモリ上に残留する。
特に図面データ(DrawingDoc)はメモリ消費量が激しい。以下の鉄則をコードの全域で遵守せよ。
1. すべての取得オブジェクトは明示的に変数に受ける
2. 処理の終了時には必ず `Set xxx = Nothing` で解放する
3. エラーハンドリング(`On Error GoTo`)内でも確実に解放処理を通す
—
2. リビジョンテーブル自動更新システムのアーキテクチャ
今回のシステムは、以下のフローで動作する。
1. 外部データソース(例:Excelの改訂指示データ)の読み込み
2. 対象図面(.slddrw)のサイレントオープン(またはアクティブドキュメントの取得)
3. 既存のリビジョンテーブル(RevisionTableAnnotation)の存在確認と取得
4. 新規リビジョン行の追加(`AddRevision` メソッド)
5. 各セル(改訂、説明、日付、承認者など)への値の書き込み
6. ドキュメントの強制再構築(Rebuild)と保存・クローズ
—
3. 実装コード:リビジョン自動同期エンジン
以下のVBAコードは、アクティブな図面ドキュメントに対して、外部から渡されたリビジョン情報(改訂記号、説明、承認者)を動的に追加するプロシージャである。実務では、ここをExcel連携のループ構造に組み込んで使用する。
Option Explicit
‘ =========================================================================
‘ プロジェクト名: SolidWorks Drawing Revision Automation Engine
‘ 概要 : 図面のリビジョンテーブルへ安全かつ確実に改訂履歴を追加する
‘ 著者 : 伝説のチーフアーキテクト
‘ =========================================================================
Public Sub ExecuteRevisionUpdate()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swRevTable As SldWorks.RevisionTableAnnotation
Dim swRevFeat As SldWorks.RevisionTableFeature
Dim success As Boolean
‘ — 入力データ(本来はExcelやDBから動的に取得する) —
Const REV_SYMBOL As String = “A”
Const REV_DESC As String = “設計変更:取付穴PCD修正”
Const REV_ZONE As String = “B-3”
Const REV_APPROVED As String = “T.K.”
Dim revDate As String
revDate = Format(Date, “YYYY/MM/DD”)
‘ 1. SolidWorks アプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing {
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
}
‘ 2. アクティブドキュメントの取得と型チェック
Set swModel = swApp.ActiveDoc
If swModel Is Nothing {
MsgBox “アクティブなドキュメントが存在しません。”, vbExclamation
Exit Sub
}
If swModel.GetType <> swDocDRAWING Then
MsgBox “アクティブなドキュメントは図面ではありません。”, vbCritical
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
End If
Set swDraw = swModel
‘ 3. エラーハンドリングの有効化(メモリリーク防止のため)
On Error GoTo ErrorHandler
‘ 4. 既存のリビジョンテーブルを取得、または新規作成
‘ ※SolidWorks図面には通常1つのリビジョンテーブルが存在する前提
Set swRevTable = swDraw.GetCurrentRevisionTable()
If swRevTable Is Nothing {
‘ テーブルが存在しない場合は新規作成(テンプレートのデフォルト位置に依存)
Set swRevFeat = swDraw.CreateRevisionTable2(True, 0, 0, “REV”, “REVISION TABLE”)
If Not swRevFeat Is Nothing {
Set swRevTable = swRevFeat.GetRevisionTableAnnotation()
}
}
If swRevTable Is Nothing {
Err.Raise vbObjectError + 1000, “RevisionUpdate”, “リビジョンテーブルの取得または作成に失敗しました。”
}
‘ 5. 新規リビジョン行の追加
‘ RevisionTableAnnotation::AddRevision メソッドを使用
Dim newRowIndex As Long
‘ 引数:改訂記号(省略時は自動インクリメントされる場合あり)
success = swRevTable.AddRevision(REV_SYMBOL)
If Not success {
Err.Raise vbObjectError + 1001, “RevisionUpdate”, “リビジョン行の追加に失敗しました。既に同じ改訂が存在する可能性があります図面を確認してください。”
}
‘ 6. 追加された最新行(最下行)のインデックスを取得
Dim totalRows As Long
totalRows = swRevTable.TotalRowCount
newRowIndex = totalRows – 1 ‘ 0-indexed
‘ 7. 各セルへのデータ書き込み
‘ カラムインデックスの定義(テーブルの列構成に依存)
‘ 一般的な構成: 0=REV, 1=DESCRIPTION, 2=DATE, 3=APPROVED, 4=ZONE 等
Call swRevTable.Text(newRowIndex, 1, REV_DESC)
Call swRevTable.Text(newRowIndex, 2, revDate)
Call swRevTable.Text(newRowIndex, 3, REV_APPROVED)
Call swRevTable.Text(newRowIndex, 4, REV_ZONE)
‘ 8. 強制再構築とビューの更新
swModel.ForceRebuild3 True
swModel.GraphicsRedraw2
MsgBox “リビジョンテーブルの更新が正常に完了しました。”, vbInformation
CleanUp:
‘ — オブジェクトの明示的解放(メモリ最適化の極意) —
Set swRevTable = Nothing
Set swRevFeat = Nothing
Set swDraw = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub
—
4. コードの深層解説:なぜこの実装でなければならないのか
`GetCurrentRevisionTable` とテーブルのライフサイクル
SolidWorksの図面ファイルにおいて、リビジョンテーブルは単なる「文字の塊」ではなく、`RevisionTableFeature` というフィーチャー構造に紐づいている。
ドキュメントによっては、過去のレガシーなマクロで作成された古いテーブル構造(一般のアノテーションテーブル扱いになっているもの)が存在することがある。
そのため、単に `GetCurrentRevisionTable()` を叩くだけでなく、取得できなかった場合のフォールバックとして `CreateRevisionTable2` を安全に呼び出す防御的プログラミングが実務では必須となる。
セルインデックス(`Text` プロパティ)の罠
SolidWorksのAPIにおける `Text(Row, Column)` メソッドは、0始まり(0-indexed)である。
さらに注意すべきは、社内の図面枠テンプレート(`.slddrt`)のカスタマイズ状況によって、列の並び順(REV, DESCRIPTION, DATE, APPROVED, ZONE 等)が微妙に異なる点だ。
ハードコーディングでカラム番号を指定するのではなく、実行前にヘッダー文字列を走査して動的に列インデックスを特定するロジックを組み込むのが、真に堅牢なエンタープライズシステムの設計思想と言える。
—
5. シニアエンジニアへの提言:さらなる高みへ
このVBAマクロ単体でも十分実用的一品だが、真の自動化システムを目指すのであれば、これを VBAからCOMコンポーネント(VB.NET / C#製のアドイン、あるいは外部Console App)へ昇華させる べきだ。
VBAは開発スピードに優れる一方で、例外処理の限界やマルチスレッド処理の欠如という構造的な制約を抱えている。
外部アプリケーションから SolidWorksを `SldWorks.Application` のヘッドレス(あるいはバックグラウンド)モードで起動し、数千枚の図面群に対してバッチ処理でリビジョン同期を流し込む。それこそが、現代のデジタルエンジニアリング環境に求められる真のアーキテクチャである。
妥協のないコードと厳格なメモリ管理で、あなたの設計プロセスのボトルネックを完全破壊せよ。
