【入門編】【初心者向け】図面シートの「プロパティ」から投影図のデフォルト尺度を一括変更するVBAマクロ – SolidWorks VBA解析バイブル

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

「マクロの記録」を卒業しよう。図面シートの尺度を支配し、設計ミスをゼロにするVBAの極意

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

SolidWorksを使って図面を作成しているとき、「あ、このビューの尺度がバラバラだ」「シートの尺度を変えたのに、配置したビューが連動してくれない」といった経験はありませんか?

手動で一つずつプロパティを開き、数値を打ち込む作業……。それは、エンジニアとしての創造的な時間を、単純な「確認作業」に奪われている状態です。

今日は、そんな日常の小さなストレスを解消し、「図面シートの尺度をプログラムで一括制御する」という、実務で即戦力となる技術を伝授します。これをマスターすれば、あなたは「マクロの記録」ボタンをポチポチ押すだけのユーザーから、「システムを構築するエンジニア」への第一歩を踏み出すことになります。

準備はいいですか? 仕組みの本質を、一緒に解き明かしていきましょう。

1. 核心:SolidWorks図面の「階層構造」を理解する

プログラミングにおいて、最も大切なのは「コードの書き方」ではなく、「操作対象がどのような構造をしているか」を知ることです。

SolidWorksの図面(Drawing)は、以下のような親子関係(階層構造)になっています。

1. DrawingDoc (図面ドキュメント):ファイル全体を統括する親
2. Sheet (シート):図面用紙。ここに「シート尺度」という概念があります。
3. View (ビュー):投影図や詳細図。ここには個別の「ビュー尺度」があります。

ここで初心者が陥りやすい罠があります。それは、「シートの尺度を変えれば、自動的に全てのビューの尺度も変わる」と思い込んでしまうことです。

実は、ビューには「シートの尺度に従う(Use Sheet Scale)」という設定と、「個別の尺度を持つ」という設定の2通りが存在します。今回のマクロでは、この「ビューの振る舞いを制御する」という制御を行います。

2. 実践:尺度を一括変更する魔法のコード

それでは、実際に使えるコードを見てみましょう。
このマクロは、「現在開いているシートの尺度を(例:1:2)に設定し、さらにそのシート上にある全てのビューの尺度を、そのシートの尺度に強制的に同期させる」という動きをします。

Option Explicit

''' <summary>
''' 図面シートの尺度を一括設定し、ビューをシート尺度に同期させるマクロ
''' </summary>
Sub SetSheetScaleAndSyncViews()
    ' --- 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
    
    ' 尺度設定用の変数 (例: 1/2 尺度)
    Dim targetScale1 As Double ' 分子
    Dim targetScale2 As Double ' 分母
    
    ' --- 2. オブジェクトの取得 ---
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' 図面ファイルが開かれていない場合は終了
    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
    
    ' --- 3. 尺度設定の準備 ---
    ' ここを書き換えることで、好きな尺度に変更可能です
    targetScale1 = 1#  ' 1
    targetScale2 = 2#  ' 2 (結果として 1:2 になります)

    ' --- 4. アクティブなシートの操作 ---
    Set swSheet = swDraw.GetCurrentSheet
    
    ' シートの尺度を設定
    ' SetSheetScale(分子, 分母)
    swSheet.SetSheetScale targetScale1, targetScale2
    
    ' --- 5. ビューのループ処理 (ここが自動化の肝!) ---
    ' GetFirstView は「シートそのもの」を指す特殊な挙動があるため注意が必要です
    Set swView = swDraw.GetFirstView
    
    ' ループで全てのビューを走査
    Do While Not swView Is Nothing
        ' swView が「シート自体」を指している場合はスキップして次のビューへ
        ' (図面上の最初のビューは、実はシートそのものを表しています)
        If swView.Type <> swViewType_e.swDrawingViewDrawingView Then
            
            ' ビューの尺度を「シートの尺度を使用する」設定に変更
            ' これにより、手動で尺度を変えてしまったミスも一括修正できます
            swView.ScaleRatio targetScale1, targetScale2
            
            ' デバッグ用:どのビューを処理したかイミディエイトウィンドウに表示
            Debug.Print "Processed View: " & swView.Name
        End If
        
        ' 次のビューへ進む
        Set swView = swView.GetNextView
    Loop

    ' --- 6. 画面の更新 ---
    ' 変更を反映させるために再構築(リビルド)を行います
    swModel.ForceRebuild3 True
    
    MsgBox "シートの尺度を " & targetScale1 & ":" & targetScale2 & " に設定し、" & vbCrLf & _
           "全てのビューを同期しました。", vbInformation
End Sub

3. ここがポイント!エンジニアの思考プロセス

コードをただ貼り付けるだけでは、あなたの成長は止まってしまいます。このコードの「なぜ」を解説します。

① 「型(Type)」を意識する

コードの冒頭で `Dim swDraw As SldWorks.DrawingDoc` と書いていますよね。これは「この変数は図面専用ですよ」とコンピュータに教えているのです。これを怠ると、SolidWorksは「今触っているのが部品なのか、図面なのか、それともただのメモなのか」を判断できず、エラーを吐いて止まってしまいます。

② `GetFirstView` の「罠」を回避する

ここが一番の難所です。SolidWorks APIの仕様で、`GetFirstView` を実行した直後のオブジェクトは、「図面上のビュー」ではなく「シートそのもの」を返します。
そのため、`If swView.Type <> …` という条件文を入れて、「シートそのものに対して『尺度を適用せよ』という命令を出してエラーになる」のを防いでいるのです。これは、APIの癖を知っている熟練者だけが書ける「守りのコード」です。

③ `ForceRebuild3` の重要性

プログラムで数値を書き換えても、画面上の見た目が変わらないことがあります。これは、コンピュータが「計算は終わったけど、画面を書き換えるのは後でいいや」とサボっている状態です。`ForceRebuild3` を呼ぶことで、「今すぐ描き直せ!」と強制的に命令し、ユーザーに正しい結果を見せることができます。

4. よくあるエラーと対策

もし動かなかったら、以下の3点を確認してください。

1. 「実行時エラー ‘424’: オブジェクトが必要です」

  • 原因:図面ファイルを開かずにマクロを実行していませんか? または、部品ファイル(.sldprt)を開いた状態で実行していませんか?

2. 「尺度が変わらない!」

  • 原因:ビューが「シート尺度を使用」になっておらず、個別の値が強制されている可能性があります。上記のコードのように `swView.ScaleRatio` を明示的に使うことで解決します。

3. 「マクロが途中で止まる」

  • 原因:ビューの中に、特殊な要素(注釈など)が含まれていて、それに対して尺度設定ができない場合があります。

最後に:一歩先へ進むあなたへ

今回のマクロは、あくまで「図面の尺度」という一つの要素に焦点を当てたものです。

しかし、この「オブジェクトを取得し(Get)」「ループで回して(Do While)」「プロパティを書き換える(Set)」という流れは、SolidWorks VBAにおける「黄金のパターン」です。このパターンさえマスターすれば、次は「全ての部品の材質を一括変更する」「全ての図面のタイトルブロックを書き換える」といった、より高度な自動化へと、あなたの翼は広がっていきます。

大丈夫、一歩ずつ進んでいきましょう。エラーは失敗ではなく、仕様を知るための貴重なヒントです。

Happy Automating!

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