「マクロの記録」を卒業しよう。図面シートの尺度を支配し、設計ミスをゼロにする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!
