【入門編】【中級者向け】図面リビジョンテーブルの改訂履歴をExcelの変更通知書から読み込んで自動同期するVBA – SolidWorks VBA解析バイブル

スポンサーリンク
スポンサーリンク

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があなたに送っている「もっとこうすれば動くよ」というアドバイスなのです。

このコードをベースに、自分なりの改良(例えば、書き込み前に重複チェックを入れる、など)を加えてみてください。その積み重ねが、あなたを「単なるユーザー」から「設計自動化のプロフェッショナル」へと変えていきます。

応援していますよ。次回の記事でお会いしましょう!

タイトルとURLをコピーしました