【入門編】【中級者向け】部品表(BOM:Bill of Materials)の図面内自動配置と列幅・並び順の完全制御 – SolidWorks VBA解析バイブル

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

【中級者向け】BOM(部品表)を完全制御する:SolidWorks VBAの極意

こんにちは。設計業務の自動化、楽しんでいますか?

「マクロの記録」ボタンを押して、記録されたコードを眺めては「……で、これをどうやって実務で使える形に組み上げるんだ?」と頭を抱える。そんな経験がある方も多いはずです。

マクロの記録は、いわば「足跡」を辿る作業です。しかし、私たちが目指すべきは「地図」を描き、自ら道を切り拓くエンジニアリングです。特に図面作成におけるBOM(部品表)の自動配置と制御は、設計者の工数を劇的に削減できる、極めて価値の高い領域です。

今日は、単に「BOMを出す」だけではなく、「列の幅を整え、不要な列を隠し、理想のフォーマットをコードから完璧に作り上げる」という、一歩上のステップへ皆さんをご案内します。

ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。さあ、一緒に見ていきましょう。

1. 思考のプロセス:オブジェクトの「階層」を理解する

コードを書く前に、まず頭の中に「SolidWorksの設計図」を描いてください。
BOMを操作する際、多くの人が陥るミスは「いきなりテーブルを操作しようとすること」です。SolidWorksのAPIは厳格な階層構造を持っています。

BOMを制御するためのルートは、以下の通りです。

1. DrawingDoc (図面ドキュメント)
2. View (BOMを紐付ける「図」)
3. TableAnnotation (図の中に存在する「テーブル」という概念)
4. BomTableAnnotation (テーブルの中でも、特に「BOM」としての性質を持つもの)

この階層を一段ずつ降りていくイメージを持ってください。この「オブジェクトのライフサイクル」を意識できるかどうかが、プロとアマチュアの分かれ目です。

2. 実践:BOMの自動生成と完全制御コード

では、実際に「アセンブリ図面の特定のビューに対してBOMを挿入し、列の表示・非表示・幅を制御する」コードを見てみましょう。

このコードは、単なるコピペ用ではありません。コメントを読みながら、「なぜこのオブジェクトが必要なのか」を咀嚼してください。

Option Explicit

''' <summary>
''' アセンブリ図面にBOMを挿入し、列のフォーマットを制御するメインルーチン
''' </summary>
Sub ControlBOMAutomation()
    ' --- 1. 変数宣言 (型を明示することが、エラーを防ぐ第一歩です) ---
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swView As SldWorks.View
    Dim swTable As SldWorks.TableAnnotation
    Dim swBomTable As SldWorks.BomTableAnnotation
    Dim vTableData As Variant
    Dim i As Integer
    Dim colName As String
    
    ' --- 2. 初期設定 ---
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' 図面が開かれているかチェック
    If swModel Is Nothing Or swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いた状態で実行してください。", vbCritical
        Exit Sub
    End If
    
    Set swDraw = swModel
    
    ' --- 3. 配置対象のビューを取得 ---
    ' ここでは「最初のビュー(シートそのものではなく、配置された図)」を取得します
    Set swView = swDraw.GetFirstView ' シート自体を取得
    Set swView = swView.GetNextView  ' 最初の実際の図を取得
    
    If swView Is Nothing Then
        MsgBox "配置されているビューが見つかりません。", vbExclamation
        Exit Sub
    End If

    ' --- 4. BOMの挿入 ---
    ' InsertBomTableAnnotation(構成要素, 挿入位置[X,Y], 構成要素の表示設定...)
    ' ここではシンプルに、ビューの基準位置に挿入します
    ' 第1引数はアセンブリを指定する必要がありますが、ビューから取得するのが確実です
    Dim swModelFromView As SldWorks.ModelDoc2
    Set swModelFromView = swView.ReferencedDocument
    
    ' BOMを挿入 (第1引数: 参照モデル, 第2引数: X座標, 第3引数: Y座標, 第4引数: 構成要素のタイプ)
    ' ※座標はメートル単位です。0.1 = 100mm
    Set swBomTable = swView.InsertBomTableAnnotation(swModelFromView, 0.1, 0.1, swBomConfigurationSection_e.swBomConfigurationSection_Configuration)

    If swBomTable Is Nothing Then
        MsgBox "BOMの挿入に失敗しました。アセンブリ図面であることを確認してください。", vbCritical
        Exit Sub
    End If
    
    ' TableAnnotationとしてキャスト(型変換)して、詳細な操作を可能にする
    Set swTable = swBomTable

    ' --- 5. 列の制御(ここが本番です!) ---
    ' 列の数を取得してループ処理を行います
    Dim colCount As Integer
    colCount = swTable.ColumnCount
    
    For i = 0 To colCount - 1
        ' 列の見出し(カスタムプロパティ名)を取得
        colName = swTable.GetColumnName(i)
        
        ' 条件分岐による列の制御
        Select Case colName
            Case "Material" ' 材質の列
                swTable.SetColumnVisible i, False ' 不要な列は非表示に
                
            Case "PartNo" ' 品番の列
                swTable.SetColumnWidth i, 0.05 ' 幅を50mmに設定
                
            Case "Description" ' 品名の列
                swTable.SetColumnWidth i, 0.08 ' 幅を80mmに設定
                
            Case "Weight" ' 重量
                ' 重量列は幅を広めに取る、といった制御も可能
                swTable.SetColumnWidth i, 0.04
        End Select
    Next i

    ' --- 6. 仕上げ ---
    ' 図面を再描画して変更を反映
    swModel.ForceRebuild3 True
    
    MsgBox "BOMの自動整形が完了しました!", vbInformation
End Sub

3. 伝説のアーキテクトが教える「陥りやすい3つの罠」

このコードを動かす際、あるいは自分で拡張する際に、初心者が必ずと言っていいほど躓くポイントがあります。

罠その1:座標系の勘違い(メートル vs ミリ)

SolidWorks APIの世界は、「常にメートル(m)」です。
「100mmにしたいから `100` と書いた」……これだけで、あなたのBOMは図面の遥か彼方、宇宙の果てまで飛んでいってしまいます。必ず `0.1` のように、メートル単位で記述してください。

罠その2:オブジェクトの「型」の壁

`InsertBomTableAnnotation` メソッドが返すのは、実は `BomTableAnnotation` という非常に強力な型です。しかし、多くのプロパティ(列の幅など)を操作する際は、より汎用的な `TableAnnotation` として扱う必要があります。
コード内の `Set swTable = swBomTable` という部分は、「BOMという特殊な機能を、テーブルという一般的な道具として扱えるようにする」という重要な橋渡し(キャスト)を行っています。

罠その3:ビューの選択ミス

`swDraw.GetFirstView` を実行した直後のオブジェクトは、実は「シートそのもの」を指しています。その次に `GetNextView` を呼ばないと、図の中に描かれた「部品の投影図」にアクセスできません。
「BOMが入らない!」と悩む人の半分は、この「シートとビューの区別」がついていないことが原因です。

4. まとめ:自動化のその先へ

いかがでしたでしょうか?

単に「BOMを出す」という動作を、「列の名前を見て、不要なものを消し、適切な幅に整える」というロジックに昇華させる。これが、実務で「使える」マクロを作るための思考法です。

この技術をマスターすれば、次は「特定のカスタムプロパティが空欄の場合に警告を出す」といった、より高度なバリデーション(検証)機能を追加することもできます。

プログラミングは、魔法ではありません。「論理的な手順を、コンピュータが理解できる言葉で書き並べる作業」です。

一歩ずつ、確実に。
このコードが、あなたの設計業務を劇的に変える第一歩になることを願っています。

「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。次はもっと面白いことをしましょう!」

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