こんにちは!SolidWorks自動化の現場で泥臭く、かつ優雅に設計効率化を追求しているチーフアーキテクトの先輩です。
「マクロの記録」でコードを出力させてみたものの、図面を開いた途端に動かなくなったり、リビジョンテーブル(改訂履歴表)の操作でオブジェクトが見つからずに頭を抱えたりしていませんか?
図面の自動化は、SolidWorks VBAのなかでも特に「オブジェクトの階層構造」と「ライフサイクル」の理解が試される領域です。ここをクリアすれば、あなたのVBAスキルは間違いなく中級者の域に達し、周囲をあっと言わせる自動化システムを構築できるようになります。
今回は、設計変更のたびに発生する「リビジョンテーブルへの新規行追加」と「外部データ(Excel等)との連携」をテーマに、実戦でそのまま使える極限の知見を授けましょう。
—
1. なぜリビジョン管理の自動化は難しいのか?
SolidWorksの図面には、モデルとは異なる独自の「ビュー」「シート」「テーブル」「アノテーション」という複雑なDOM(ドキュメントオブジェクトモデル)が存在します。
特にリビジョンテーブル(`RevisionTableAnnotation`)は、単なるExcelの表とは異なり、「シートフォーマットに紐づく特殊なオブジェクト」として存在しています。そのため、通常の部品表(BOM)と同じ感覚でコードを書くと、`Object Variable not set`(オブジェクト変数が設定されていません)という、VBAエンジニアお馴染みのエラーに直面することになります。
ここを突破する鍵は、「正しいAPIの階層を辿り、安全にオブジェクトを捕捉すること」です。
—
2. 実装の全体像とアプローチ
今回は、以下のステップをVBAで一気通貫に実行するプログラムを作成します。
1. アクティブな図面ドキュメントの取得
2. 対象シートからリビジョンテーブルの取得(または新規作成)
3. リビジョンテーブルへの新規行の追加
4. 指定したセル(リビジョン記号、説明、承認者など)へのデータ書き込み
それでは、実際のコードを見ていきましょう。開発現場でそのままコピペして検証できるように、丁寧にコメントを仕込んでいます。
—
3. 実用VBAコード:リビジョン自動更新マクロ
以下のコードをSolidWorksのVBAエディタ(VBE)に貼り付けて実行してください。
Option Explicit
‘ ==============================================================================
‘ 【テーマ】図面内のリビジョンテーブル自動更新マクロ
‘ 【解説】アクティブな図面からリビジョンテーブルを安全に取得し、
‘ 新しい改訂行を追加してデータを書き込むプロフェッショナルコード。
‘ ==============================================================================
Sub UpdateDrawingRevision()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDrawing As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim swRevTable As SldWorks.RevisionTableAnnotation
Dim swTableAnnotation As SldWorks.TableAnnotation
Dim newRowIndex As Long
‘ 1. SolidWorksアプリケーションのインスタンスを取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
‘ 2. アクティブなドキュメントを取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “開かれているドキュメントがありません。”, vbExclamation
Exit Sub
End If
‘ 3. 図面ドキュメントであるか型チェック
If swModel.GetType <> swDocDRAWING Then
MsgBox “このマクロは図面(Drawing)ファイルでのみ実行可能です。”, vbCritical
Exit Sub
End If
Set swDrawing = swModel
Set swSheet = swDrawing.GetCurrentSheet
‘ 4. 現在のシートからリビジョンテーブルを取得
‘ ※注意: リビジョンテーブルが存在しない場合、ここでNothingが返ります
Set swRevTable = swSheet.Extension.GetRevisionTableAnnotation()
‘ もしリビジョンテーブルがまだ配置されていない場合は新規作成する
If swRevTable Is Nothing Then
‘ 引数: 基準コーナ(SWフォント等), X座標, Y座標, テンプレートパス(空文字でデフォルト)
Set swTableAnnotation = swSheet.AddRevisionTable2(True, 0, 0, “”)
Set swRevTable = swTableAnnotation.GetSpecificTableAnnotation
If swRevTable Is Nothing Then
MsgBox “リビジョンテーブルの作成に失敗しました。”, vbCritical
Exit Sub
End If
End If
‘ TableAnnotationインターフェースを取得(セル操作に必須)
Set swTableAnnotation = swRevTable.GetAnnotation.GetSpecificAnnotation
‘ 5. 新規行をテーブルの末尾に追加
‘ AddRowメソッドは追加された行のインデックスを返す
newRowIndex = swTableAnnotation.AddRow(swTableRowInsertion_Last, -1)
If newRowIndex < 0 Then MsgBox "リビジョン行の追加に失敗しました。", vbCritical Exit Sub End If ' 6. 追加した行の各セルに設計変更データを書き込む ' 列インデックスの定義(一般的な構成:0=REV, 1=DESCRIPTION, 2=DATE, 3=APPROVED 等) Dim revText As String Dim descText As String Dim dateText As String Dim authorText As String ' 【実務ではここでExcelや外部DBからデータを取得します】 revText = "B" ' リビジョン記号 descText = "図面寸法の一部修正および公差の見直し" ' 変更理由・内容 dateText = Format(Date, "YYYY/MM/DD") ' 本日の日付 authorText = "CHIEF ARCHITECT" ' 承認者 ' セルへのテキスト代入 (RowIndex, ColumnIndex, Text) ' ※SolidWorksのバージョンやテーブルテンプレートにより列番号が異なるため注意 Call swTableAnnotation.Text(newRowIndex, 0, revText) Call swTableAnnotation.Text(newRowIndex, 1, descText) Call swTableAnnotation.Text(newRowIndex, 2, dateText) Call swTableAnnotation.Text(newRowIndex, 3, authorText) ' 7. ビューの再描画と変更の確定 swModel.WindowRedraw MsgBox "リビジョンテーブルの更新が正常に完了しました!", vbInformation, "自動化完了" End Sub ---
4. 陥りやすいエラーと回避のための知見(ここが重要!)
現場でこのコードを運用する際、中級者が必ずハマる「罠」がいくつかあります。あらかじめ知っておくことで、無駄なデバッグ時間を削減できます。
① 「シートフォーマットのロック」によるエラー
SolidWorksの図面では、リビジョンテーブルが「シートフォーマット(編集不可の背景レイヤー)」側にあるか、「シート(通常の作図レイヤー)」側にあるかによって、APIの振る舞いが変わります。
- 対策: リビジョンテーブルの取得や追加を行う前に、マクロ内で明示的にシートフォーマットの編集状態を切り替えるか、`GetRevisionTableAnnotation()` が正しく機能するコンテキストであることを確認してください。
② 列インデックス(ColumnIndex)のズレ
企業やプロジェクトごとに、図枠(テンプレート)のカスタマイズ内容は異なります。
- デフォルトでは `0` がリビジョン(REV)、`1` が説明(DESCRIPTION)ですが、会社によっては「承認欄」が先頭にあるなど、インデックスがずれることがあります。
- 対策: コードを書く前に、対象の図面で手動でリビジョンを追加し、マクロで `swTableAnnotation.ColumnCount` や各セルのテキストをループでイミディエイトウィンドウに出力させて、構造をマッピングする「探索コード」を一度挟むのがプロのやり方です。
③ 外部Excel連携時のパスとセルのロック
今回はコード内に直接テキストを記述していますが、実務ではExcelの設計変更管理台帳(CSVやxlsx)と連携させることがほとんどです。
- 注意点: Excelファイルを読み込む際は、該当ファイルが他の設計者によって開かれていてロック(排他制御エラー)されていないか、エラーハンドリング(`On Error Resume Next` の適切な使用と解除)を必ず組み込んでください。
—
5. まとめと次のステップ
今回は、図面自動化の核心である「リビジョンテーブルの制御」について解説しました。
- オブジェクトの階層(DrawingDoc → Sheet → RevisionTableAnnotation → TableAnnotation)を正しく辿ること。
- AddRowメソッドを使用して安全に新規行を確保し、インデックスを指定してデータを流し込むこと。
ここをマスターすれば、次は「図面内の指定した座標にリビジョンシンボル(三角形のマーク)を自動配置するAPI(`CreateRevisionSymbol`)」への応用もスムーズにできるようになります。
ここをクリアすれば、SolidWorks VBAの基本はバッチリです!
日々の面倒な定型作業はマクロにすべて任せて、あなたにしかできないクリエイティブな設計業務に集中していきましょう。それでは、次の自動化の現場でお会いしましょう!
