Excelの変更通知書をSolidWorks図面へ。リビジョン同期の自動化で「転記作業」を過去のものにする
こんにちは。設計自動化の荒波を共に乗り越えていく同志の皆さん。
設計の現場で、こんな「虚しい時間」を感じたことはありませんか?
「Excelの変更通知書に書いたリビジョン内容を、わざわざ図面の改訂テーブルに手打ちで写していく作業……。これ、機械がやってくれればいいのに」と。
マクロの記録機能を使って、ボタンをポチポチ押す動作を記録する。それは第一歩としては素晴らしいですが、実務で使える「ツール」にするには、もう一段階上の視点が必要です。
今日は、「Excelのデータを読み取り、SolidWorks図面の改訂テーブルへ自動的に同期する」という、実務直結のプログラムに挑戦しましょう。単なるコードの書き方だけでなく、「なぜそのオブジェクトを操作するのか」という、エンジニアとして一生モノの考え方を伝授します。
1. 「マクロの記録」の壁を越える:オブジェクトモデルの理解
多くの人が「マクロの記録」で挫折します。なぜなら、記録されたコードは「画面上のどこをクリックしたか」という『動作』を記録しているだけで、『データ構造』を理解していないからです。
例えば、図面の改訂テーブルを更新する場合、記録されたコードは「テーブルの〇行目の〇列目を選択する」という命令になります。しかし、もし図面のレイアウトが少し変わってテーブルの位置がズレたら? そのマクロは即座に壊れます。
プロのエンジニアは、「オブジェクト(物体)」を直接指定します。
- Excelファイルというオブジェクトから、セル(値)を取り出す。
- SolidWorks図面というオブジェクトから、改訂テーブル(TableAnnotation)を見つけ出す。
この「モノを特定して、その中身を操作する」という感覚こそが、SolidWorks VBAを掌握する鍵です。
2. 実装の設計図(アーキテクチャ)
今回のプログラムは、大きく分けて3つのステップで構成します。
1. Excelへの接続: 指定したExcelファイルを開き、最新のリビジョン情報を変数に格納する。
2. SolidWorksへの接続: 現在開いている図面ドキュメントを特定する。
3. テーブルの探索と書き込み: 図面内の「改訂テーブル」を探し出し、末尾の行にデータを書き込む。
ここで重要なのが、「改訂テーブルは図面のどこにあるのか?」という問題です。改訂テーブルは特定の「ビュー」に紐付いた「Annotation(注記)」の一種として存在します。これを見つけ出すロジックを組み込みます。
3. 実践:リビジョン同期プログラム
さあ、準備はいいですか? 以下のコードは、そのままあなたの開発環境のベースとして使えます。
【事前準備】
VBAエディタのメニューから `ツール` -> `参照設定` を開き、以下の項目にチェックを入れてください。
- `Microsoft Excel 16.0 Object Library` (バージョンは環境により異なります)
Option Explicit
''' <summary>
''' Excelの変更通知書からリビジョン情報を読み取り、
''' SolidWorks図面の改訂テーブルへ自動転記するメインルーチン
''' </summary>
Sub SyncRevisionFromExcel()
' --- 1. 変数宣言 ---
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim swView As SldWorks.View
Dim swTable As SldWorks.TableAnnotation
Dim swAnn As SldWorks.Annotation
Dim xlApp As Excel.Application
Dim xlWB As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim targetExcelPath As String
Dim revNo As String, revDesc As String, revDate As String, revReason As String
Dim nextRow As Long
Dim foundTable As Boolean
' --- 2. 初期設定 ---
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' 図面が開いているかチェック
If swModel Is Nothing Then
MsgBox "SolidWorksの図面を開いてから実行してください。", vbCritical
Exit Sub
End If
If swModel.GetType <> swDocDRAWING Then
MsgBox "アクティブなドキュメントが図面ではありません。", vbCritical
Exit Sub
End If
Set swDraw = swModel
Set swSheet = swDraw.GetCurrentSheet
' Excelファイルのパス(ここを実際の運用に合わせて変更してください)
targetExcelPath = "C:\Work\ChangeNotice.xlsx"
' --- 3. Excelからデータの取得 ---
On Error Resume Next
Set xlApp = GetObject(, "Excel.Application") ' 起動中のExcelを取得
If xlApp Is Nothing Then
Set xlApp = New Excel.Application ' 起動していなければ新規作成
End If
On Error GoTo 0
Set xlWB = xlApp.Workbooks.Open(targetExcelPath)
Set xlSheet = xlWB.Sheets(1) ' 1番目のシートを対象とする
' Excelの構成例: A2=リビジョン, B2=内容, C2=日付, D2=理由
revNo = xlSheet.Range("A2").Value
revDesc = xlSheet.Range("B2").Value
revDate = xlSheet.Range("C2").Value
revReason = xlSheet.Range("D2").Value
' 読み取り失敗のチェック
If revNo = "" Then
MsgBox "Excelからリビジョン情報を読み取れませんでした。", vbExclamation
xlWB.Close SaveChanges:=False
Exit Sub
End If
' --- 4. 図面内の改訂テーブルを探索 ---
' 図面の最初のビュー(シート自体を含む)から注記を辿る
Set swView = swDraw.GetFirstView ' Sheet View
foundTable = False
Do While Not swView Is Nothing
Set swAnn = swView.GetFirstAnnotation
' ビュー内の注記を一つずつ確認
Do While Not swAnn Is Nothing
' 注記が「テーブル(TableAnnotation)」であるか判定
If swAnn.GetType = swAnnotationType_e.swTableAnnotation Then
Set swTable = swAnn.GetSpecificAnnotation
' ここでは「改訂テーブル」を特定するため、
' テーブル名や特定の列数などで判定するのが実務的です
' 今回は「最初に見つかったテーブル」を改訂テーブルとみなします
foundTable = True
Exit Do
End If
Set swAnn = swAnn.GetNext
Loop
If foundTable Then Exit Do
Set swView = swView.GetNextView
Loop
' --- 5. テーブルへの書き込み ---
If foundTable Then
' 次の空行を特定 (現在の行数 + 1)
' ※ヘッダー行があることを想定。実務では swTable.RowCount を利用
nextRow = swTable.RowCount + 1
' データの書き込み (列番号はテーブルの設計に合わせて調整してください)
' swTable.Text(行, 列)
swTable.Text(nextRow, 1) = revNo ' 1列目: リビジョン
swTable.Text(nextRow, 2) = revDate ' 2列目: 日付
swTable.Text(nextRow, 3) = revDesc ' 3列目: 改訂内容
swTable.Text(nextRow, 4) = revReason ' 4列目: 変更理由
MsgBox "リビジョン [" & revNo & "] の同期が完了しました。", vbInformation
Else
MsgBox "図面内に改訂テーブルが見つかりませんでした。", vbExclamation
End If
' --- 6. 後片付け ---
xlWB.Close SaveChanges:=False
' xlApp.Quit ' Excel自体を終了させる場合は有効にする
Set swTable = Nothing
Set swView = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
4. 伝説のエンジニアが教える「ここが落とし穴!」
コードを書いただけで満足してはいけません。現場でこのマクロを動かしたとき、必ず直面する「壁」をあらかじめ教えておきます。
① テーブルの「列番号」は絶対ではない
上記のコードでは `swTable.Text(nextRow, 1)` のように列番号を直書きしています。しかし、設計変更で「日付の列を左にずらした」だけで、マクロは全く別の場所にデータを書き込みます。
【プロの対策】:テーブルの1行目(ヘッダー)をループで回し、「”Revision” という文字列が入っている列はどこか?」を検索して、列番号を変数として保持するロジックを加えると、鉄壁のツールになります。
② ライフサイクルの管理(メモリリーク)
Excelオブジェクトを操作したあと、`Set xlWB = Nothing` や `xlWB.Close` を忘れると、マクロが終わってもバックグラウンドに「見えないExcel」が残り続けます。これが積み重なるとPCの動作が重くなり、最悪フリーズします。「開いたら必ず閉じる」。これは鉄則です。
③ エラーハンドリングの重要性
もしExcelファイルが他の人に開かれていたら? パスが間違っていたら?
`On Error Resume Next` を多用しすぎるのは初心者の証です。どこでエラーが起きたのかを特定するために、重要な箇所では適切なエラー処理を行い、ユーザーに「何がダメだったのか」を優しく教えてあげるのが、一流の設計者です。
最後に:一歩先へ進むあなたへ
いかがでしたか?
「マクロの記録」という魔法の杖を捨てて、「オブジェクトモデル」という設計図を手に入れたとき、あなたの見える世界は劇的に変わります。
最初はエラーが出て当たり前です。でも、そのエラーメッセージこそが、SolidWorks APIがあなたに送っている「もっとこうすれば動くよ」というアドバイスなのです。
このコードをベースに、自分なりの改良(例えば、書き込み前に重複チェックを入れる、など)を加えてみてください。その積み重ねが、あなたを「単なるユーザー」から「設計自動化のプロフェッショナル」へと変えていきます。
応援していますよ。次回の記事でお会いしましょう!
