【入門編】【中級者向け】複数コンフィギュレーションを持つパーツの各状態をマルチシート図面に自動展開するVBA – SolidWorks VBA解析バイブル

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

「マクロの記録」を卒業しよう。複数コンフィギュレーションをマルチシート図面に自動展開する、真の自動化設計。

こんにちは。設計自動化の世界へようこそ。

「マクロの記録」ボタンを押して、自分の操作をコードに変換する。そこから一歩踏み出し、「自分でロジックを組み立てて、複雑な業務を丸ごと自動化したい」……そう思った瞬間、あなたはエンジニアとして大きな転換期を迎えています。

今日お話しするのは、単なるコードの書き方ではありません。SolidWorksの「オブジェクトの繋がり」を理解し、複数のコンフィギュレーション(設定)を持つ部品を、まるで魔法のように複数の図面シートへ自動展開する、実戦的なテクニックです。

「Standard」「Short」「Long」……。部品の設定が変わるたびに、手作業でシートを増やし、ビューを配置し、設定を切り替える。そんな作業は、今日で終わりにしましょう。

1. 核心:図面とモデルの関係性を「掌握」する

まず、コードを書く前に、SolidWorksの内部構造を頭の中に描いてください。ここを間違えると、どんなに優れたコードも動かない「迷宮」に入り込んでしまいます。

多くの初学者が陥る罠があります。それは、「図面(Drawing)を操作しているのか、モデル(Part)を操作しているのか」の境界線が曖昧になることです。

図面ファイルは、いわば「窓」です。窓の向こう側にある「モデル」を、特定の角度から、特定のコンフィギュレーション(設定)で覗き込んでいる状態です。

  • Part(モデル): コンフィギュレーションの集合体。
  • Drawing(図面): モデルを「参照」する入れ物。
  • View(図面ビュー): モデルの特定の「設定」を、特定の「向き」で表示するフィルター。

今回のゴールは、「モデル内の全コンフィギュレーションをスキャンし、図面側に新しいシートを作り、そのシートのビューに対して『君は、このコンフィギュレーションを表示しなさい』と命令を送る」ことです。

2. 実装:マルチシート自動展開マクロ

それでは、魂を込めて書いたコードを見ていきましょう。このコードは、現在開いている図面が参照しているモデルを自動検知し、そのすべての設定を別々のシートに展開します。

' **
' Title: Multi-Configuration Drawing Generator
' Description: 参照モデルの全コンフィギュレーションを、個別のシートに自動展開します。
' Author: Legendary Chief Architect
' **

Option Explicit

Sub main()
    ' --- オブジェクトの宣言 ---
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swRefModel As SldWorks.ModelDoc2
    Dim swPart As SldWorks.PartDoc
    
    Dim configNames As Variant
    Dim i As Integer
    Dim currentConfig As String
    
    Dim swSheet As SldWorks.Sheet
    Dim swView As SldWorks.View
    Dim vPos As Variant
    
    ' --- 初期化 ---
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' 1. 図面が開かれているかチェック
    If swModel Is Nothing Then
        MsgBox "図面ファイルを開いてから実行してください。", vbCritical
        Exit Sub
    End If
    
    If swModel.GetType <> swDocDRAWING Then
        MsgBox "このマクロは図面ファイル専用です。", vbCritical
        Exit Sub
    End If
    
    Set swDraw = swModel
    
    ' 2. 図面が参照しているモデル(パーツ)を取得
    ' ここが重要!図面自身ではなく、その「中身」を操作対象にします。
    Set swRefModel = swDraw.GetReferencedModelView.ReferencedModel
    
    If swRefModel Is Nothing Then
        MsgBox "図面が参照しているモデルが見つかりません。", vbCritical
        Exit Sub
    End If
    
    ' 3. モデルのコンフィギュレーション一覧を取得
    configNames = swRefModel.GetConfigurationNames
    
    ' 画面更新を止めてパフォーマンスを向上させる(エンジニアの嗜み)
    swApp.ScreenUpdating = False
    
    ' --- メインループ:各コンフィギュレーションを処理 ---
    For i = LBound(configNames) To UBound(configNames)
        currentConfig = configNames(i)
        
        ' A. 新しいシートを追加
        ' 引数: シート名, テンプレートパス(空なら現在の設定), 投影法, 幅, 高さ
        ' ここではシンプルに、既存のシート形式を引き継ぐ形で追加します。
        swDraw.NewSheet currentConfig, "", swIsometric, 0, 0
        
        ' B. ビューを配置する座標を設定 (中心付近)
        ' 0,0 はシートの原点付近です。
        vPos = Array(0.1, 0.1) 
        
        ' C. ビューを作成
        ' 引数: モデル, 表示するビュー名(Front等), X座標, Y座標, Z座標
        ' ここで「どのモデルの」「どのビュー」を使うかを指定します。
        Set swView = swDraw.CreateDrawViewFromModelView3(swRefModel.GetPathName, "*Front", vPos(0), vPos(1), 0)
        
        If Not swView Is Nothing Then
            ' D. 【最重要】ビューが参照するコンフィギュレーションを書き換える
            ' これを忘れると、すべてのシートが「アクティブな設定」を表示してしまいます。
            swView.ReferencedConfiguration = currentConfig
            
            ' ビューのスケールを調整したい場合はここで行う
            ' swView.ScaleRatio = Array(1, 1)
        End If
        
    Next i
    
    ' 画面更新を再開
    swApp.ScreenUpdating = True
    
    MsgBox "完了しました! " & UBound(configNames) + 1 & " 個のシートを展開しました。", vbInformation
End Sub

3. プロの視点:なぜこのコードが「動く」のか

マクロの記録で作ったコードと、このコードの決定的な違いを解説します。ここを理解すれば、あなたはもう「記録」に頼る必要はありません。

① `GetReferencedModel` の魔法

マクロの記録では、自分自身(図面)を操作することしか想定していません。しかし、我々は「図面の中にあるモデル」を操作したい。`swDraw.GetReferencedModelView.ReferencedModel` を使うことで、図面からモデルへと「アクセス権」を渡しているのです。

② ライフサイクルの管理:`ReferencedConfiguration`

ここが最大の急所です。
`CreateDrawViewFromModelView3` メソッドを実行した直後のビューは、モデルの「現在アクティブな設定」を表示しています。
もし、ループの中で設定を切り替えていないなら、すべてのシートが同じ見た目になってしまいます。
「ビューを作った後に、そのビューに対して `ReferencedConfiguration` を個別に指定する」。このステップこそが、マルチシート展開の心臓部です。

③ パフォーマンスへの配慮:`ScreenUpdating`

大量のシートを生成する際、SolidWorksが毎回画面を書き換えると、処理時間は数倍に膨れ上がります。`swApp.ScreenUpdating = False` は、エンジニアが現場で必ず使う「おまじない」ではなく、「リソース管理」という名のプロの技術です。

4. 陥りやすいエラーと対策(トラブルシューティング)

実戦では、必ず予期せぬ事態が起こります。以下のポイントをチェックしてください。

  • 「ビューが真っ白になる!」
  • 原因:コンフィギュレーション名が正しく渡っていないか、モデルが完全にロードされていない可能性があります。
  • 対策:`swView.ReferencedConfiguration` に代入する文字列が、`swRefModel.GetConfigurationNames` から取得したものと完全に一致しているか確認してください。
  • 「シートが重なってしまう!」
  • 原因:`vPos`(座標)がすべて同じです。
  • 対策:ループ変数 `i` を使って、配置する座標を少しずつずらすロジックを追加しましょう。
  • 「マクロが途中で止まる」
  • 原因:参照しているモデルが「読み取り専用」であったり、ファイルパスが壊れている場合に発生します。
  • 対策:`If swRefModel Is Nothing Then` のようなエラーハンドリングを徹底しましょう。

結びに代えて

いかがでしたでしょうか。
「マクロの記録」は、素晴らしい第一歩です。しかし、その先にある「オブジェクトの構造を理解し、ロジックで制御する」世界は、あなたの設計業務を劇的に、そしてエレガントに変えてくれます。

今回紹介したコードは、あくまで基礎です。ここから「シートのサイズをコンフィギュレーションごとに変える」「特定のビューだけ配置する」といったカスタマイズを加えていってください。

コードを書き、エラーに悩み、それを解決したとき、あなたのエンジニアとしての筋肉は確実に鍛えられています。

さあ、次はあなたが、世界を自動化する番です。

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