こんにちは!SolidWorks VBAの自動化開発へようこそ。
「3Dモデルは完成したけれど、ここからA3の全体図を作って、A4で詳細図のシートを追加して、尺度の設定を変えて……」と、手作業で何枚ものシートをセットアップする作業に疲れていませんか?
「マクロの記録」ボタンを押して作られたコードは、操作の足跡を記録しただけに過ぎず、そのままでは別のモデルに応用したり、シートを動的に増減させたりすることはできません。
ここを突破すれば、SolidWorks VBAの基本とオブジェクトモデルの取り扱いはバッチリです!
今回は、単一の3Dモデルから異なる用紙サイズ(A3・A4など)や尺度を持つ複数シート(マルチシート)図面をプログラムで華麗に自動生成する「本物」のテクニックを伝授します。
焦らず、先輩エンジニアと一緒に一つずつ紐解いていきましょう!
—
1. 概念をつかむ:SolidWorks APIの「シート管理」階層構造
コードを書く前に、SolidWorksの頭の中(オブジェクトモデル)を視覚的に理解しておきましょう。ここを理解しておくと、エラーが出たときの原因特定が格段に早くなります。
[ SldWorks (アプリケーション) ]
│
▼
[ ModelDoc2 (アクティブなドキュメント) ]
│ ※図面の場合、内部的には DrawingDoc オブジェクト
▼
[ DrawingDoc (図面独自の機能) ]
│
├─► Sheet 1 (1枚目のシート: A3横 / 尺度 1:2)
├─► Sheet 2 (2枚目のシート: A4縦 / 尺度 1:1)
└─► Sheet 3 …
マクロの記録から脱却する第一歩は、「今触っているドキュメントが何者で、どのシートを操作しているのか」を明確に指し示す(オブジェクト変数に代入する)ことです。
今回使用する最重要APIメソッド
1. `DrawingDoc.NewSheet4`: 新しい図面シートを追加します。
2. `Sheet.SetProperties2`: 既存または新規シートの「用紙サイズ」「尺度」「投影法(第三角法など)」を一括設定します。
—
2. コピペで動く!マルチシート自動生成VBAコード
まずは、実際に動作する実用的なコードをご覧ください。
アクティブな3Dモデル(パーツまたはアセンブリ)が開いている状態から、「A3横(全体図用シート)」と「A4縦(詳細図用シート)」の2枚のシートを持つ図面を自動作成するスクリプトです。
‘ ==============================================================================
‘ 機能: 3DモデルからA3/A4異種サイズのマルチシート図面を自動生成するマクロ
‘ 動作条件: パーツまたはアセンブリモデルが開いていること
‘ ==============================================================================
Option Explicit
Sub Main()
‘ — 1. SolidWorksオブジェクトの宣言 —
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim modelPath As String
Dim drawTemplate As String
Dim boolStatus As Boolean
‘ SolidWorksアプリケーションへの接続
Set swApp = Application.SldWorks
‘ アクティブな3Dモデルを取得
Set swModel = swApp.ActiveDoc
‘ モデルが開かれていない場合は安全に終了
If swModel Is Nothing Then
MsgBox “3Dモデルが開かれていません。パーツまたはアセンブリを開いて実行してください。”, vbExclamation, “エラー”
Exit Sub
End If
‘ ドキュメントタイプのチェック (パーツまたはアセンブリか)
If swModel.GetType = swDocDRAWING Then
MsgBox “3Dモデルを開いた状態で実行してください。”, vbExclamation, “エラー”
Exit Sub
End If
modelPath = swModel.GetPathName
‘ — 2. 標準の図面テンプレートパスを取得 —
‘ ※環境に合わせてカスタムテンプレートのパス指定に変更可能です
drawTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplateDrawing)
If drawTemplate = “” Then
MsgBox “既定の図面テンプレートが見つかりません。設定を確認してください。”, vbCritical, “エラー”
Exit Sub
End If
‘ — 3. 新規図面ドキュメントの作成 —
‘ ドキュメント新規作成 (A3テンプレートを想定した新規図面)
Set swModel = swApp.NewDocument2(drawTemplate, swDSIAPE_A3_LANDSCAPE, 0, 0)
Set swDraw = swModel
If swDraw Is Nothing Then
MsgBox “図面の作成に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If
‘ 描画処理の高速化(画面更新の一時停止)
swModel.SetEnableGraphicsUpdate False
On Error GoTo ErrorHandler
‘ — 4. 【シート1】の設定変更 (A3 / 尺度 1:2 / 第三角法) —
Set swSheet = swDraw.GetCurrentSheet()
swSheet.SetName “01_全体図”
‘ SetProperties2のパラメータ設定
‘ PaperSize, TemplateIn, Scale1, Scale2, FirstAngle, Width, Height, PropertyControlMask
‘ ※第一角法(FirstAngle) = False で「第三角法」になります
swSheet.SetProperties2 _
swDSIAPE_A3_LANDSCAPE, _
swDSIAPE_A3_LANDSCAPE, _
1, 2, _ ‘ 尺度 1:2
False, _ ‘ 第三角法
0.42, 0.297, _ ‘ 用紙サイズ(m単位: 420mm x 297mm)
True ‘ プロパティを適用
‘ — 5. 【シート2】の追加 (A4縦 / 尺度 1:1 / 第三角法) —
‘ NewSheet4(SheetName, PaperSize, TemplateIn, Scale1, Scale2, FirstAngle, ZoneName, Width, Height, PropertyControlMask)
boolStatus = swDraw.NewSheet4( _
“02_詳細図”, _
swDSIAPE_A4_PORTRAIT, _
swDSIAPE_A4_PORTRAIT, _
1, 1, _ ‘ 尺度 1:1
False, _ ‘ 第三角法
“”, _ ‘ ゾーン名(空欄)
0.21, 0.297, _ ‘ 用紙サイズ(m単位: 210mm x 297mm)
True)
If boolStatus Then
‘ 追加したシート2を取得してアクティブ化
Set swSheet = swDraw.Sheet(“02_詳細図”)
swDraw.ActivateSheet “02_詳細図”
End If
‘ — 6. 後処理 —
‘ 画面更新の再開と再描画
swModel.SetEnableGraphicsUpdate True
swModel.ForceRebuild3 True
‘ 最初のシートに戻す
swDraw.ActivateSheet “01_全体図”
MsgBox “マルチシート図面の自動生成が完了しました!”, vbInformation, “成功”
Exit Sub
ErrorHandler:
‘ 万一エラーが起きた場合もグラフィック更新を復元する安全設計
swModel.SetEnableGraphicsUpdate True
MsgBox “処理中にエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
3. プロの視点で紐解く!重要なコードの解説
コードが無事に動いたら、次は「なぜこのコードで動くのか」の核心部分に迫りましょう。ここを知ることで、自社用の複雑なカスタマイズに応用できるようになります。
(1) 用紙サイズと「メートル単位」の罠
SolidWorks APIの内部処理では、長さや寸法の単位はすべて「メートル (m)」で統一されています。
A3サイズ(420mm × 297mm)を指定する場合は、`0.42` と `0.297` という値を渡す必要があります。ここを「420」と書いてしまうと、巨大な用紙が生成されて画面が真っ白になるので注意してくださいね!
(2) `SetProperties2` と `NewSheet4` の使い分け
- `SetProperties2`: 「すでにあるシート」の設定(名前・尺度・サイズ・投影法)を書き換える。
- `NewSheet4`: 「新しいシートを作成する」と同時に、それらの属性を一括設定する。
特に `FirstAngle` パラメータには注意が必要です。
- `True` = 第一角法(主に欧州)
- `False` = 第三角法(日本のJIS製図規格で標準)
日本の製造業では基本的に `False` を指定することになります。
—
4. 現場で落とし穴にはまらないための「アーキテクトの知見」
マクロ開発の現場で、初心者エンジニアが必ずと言っていいほどぶつかる3つの壁とその回避策を共有します。
① 図面枠(シートフォーマット)が表示されない?
上記のコードでは `swDSIAPE_A3_LANDSCAPE` などの標準定数を使っていますが、これらは「用紙の大きさ」を定義しているだけで、自社の社名ロゴや表題欄(`.slddrt`ファイル)は読み込まれません。
会社のカスタム図面枠を読み込ませたい場合は、以下のようにカスタムテンプレートのパスを明示的に指定します。
‘ カスタムシートフォーマット(.slddrt)を適用する場合の例
Dim customTemplatePath As String
customTemplatePath = “C:\SolidWorks_Templates\弊社指定A3枠.slddrt”
swSheet.SetProperties2 _
swDSIAPE_CUSTOM, _ ‘ 用紙サイズをカスタムに設定
swDSIAPE_CUSTOM, _
1, 2, False, _
0.42, 0.297, True
‘ シートフォーマットのロード
swSheet.SetTemplateName customTemplatePath
swSheet.ReloadTemplate True
② パフォーマンスの重み:画面描画(Graphics Redraw)の制御
図面シートを1枚追加するたびに、SolidWorksは画面全体を再描画しようとします。シート数が5枚、10枚と増えたとき、これが原因でマクロの動作が極端に重くなります。
コード内で使用した以下の手法は、処理速度を跳ね上げるプロの必須テクニックです。
‘ 処理開始時に描画オフ(劇的に速くなります)
swModel.SetEnableGraphicsUpdate False
‘ — 大量のシート生成や図面配置処理 —
‘ 処理終了時に描画オンに戻して一括再描画
swModel.SetEnableGraphicsUpdate True
swModel.ForceRebuild3 True
③ オブジェクトのライフサイクルとエラー処理
マクロの実行中にエラーが発生して途中で止まった場合、`SetEnableGraphicsUpdate False` のままだとSolidWorksの画面が固まった(フリーズした)ように見えてしまいます。
そのため、必ず `On Error GoTo ErrorHandler` を仕込み、エラーが起きても必ず画面更新を再開させてから終了するような安全な構造にしておきましょう。
—
まとめ:マクロ記録の「点」が「線」に繋がる瞬間
今回は、SolidWorks VBAにおける図面シートの操作とマルチシート自動生成の基本をマスターしました。
- `ModelDoc2` から `DrawingDoc` や `Sheet` オブジェクトを正しく取得する
- `NewSheet4` と `SetProperties2` で用紙サイズ・尺度・第三角法をコントロールする
- メートル単位の指定と画面更新の一時停止で、高速かつ安全なプログラムを作る
ここをクリアできれば、次は「3Dモデルの各ボディや構成部品を読み込んで、自動で三面図を配置する」といった本格的な自動化ツールへの道が開けます。
SolidWorks VBAの世界は、仕組みさえわかればあなたの設計業務を何十倍も効率化してくれる最強の武器になります。ぜひ今回のコードをベースに、ご自身の業務に合わせてカスタマイズしてみてくださいね!
応援しています!次回も一緒にVBAの極意を深掘りしていきましょう!
