こんにちは!SolidWorks自動化の現場で、日々数千・数万の図面と格闘しているチーフアーキテクトの先輩です。
「マクロの記録」ボタンを押して図面を操作する時代はもう卒業しましょう。今回は、実務で絶対に避けて通れない「マルチシート図面の動的生成とプロパティ制御」をテーマに、SolidWorks VBAの核心に迫ります。
「何十ページもある製品図面を、1枚ずつ手作業でサイズや投影法を変えて追加していく……」
そんな地獄のような作業、今日で終わりにしましょう。`IDrawingDoc.NewSheet` と `Sheet.SetProperties` を完全に手なずければ、数秒で完璧な図面ファイルを作り上げることができます。
ここをクリアすれば、あなたのSolidWorks VBAスキルは「初学者」の域を脱し、現場で重宝される「自動化エンジニア」への扉を叩くことになります。一緒にしっかりとマスターしていきましょう!
—
1. 現場の現実:なぜ「図面シートの動的生成」が必要なのか?
大規模なアセンブリや、派生バリエーションが多い部品を扱うとき、図面は必ず「複数シート(マルチシート)」になります。
しかし、標準機能のまま手動でシートを追加していくと、以下のストレスが発生します。
- シートごとに用紙サイズ(A3、A4など)を手動で変更し忘れる。
- 第1角法・第3角法の投影法がシートごとにバラバラになる。
- ページが増えるたびに、図面枠やタイトルの設定が手作業で破綻していく。
これをVBAで完全自動化します。「部品の構成やリストを読み込み、必要なサイズ・投影法のシートを必要な枚数だけ、一瞬で生成する」――これが今回目指すゴールです。
—
2. SolidWorks API オブジェクトモデルの理解
SolidWorksの図面(`DrawingDoc`)を操作するとき、私たちはAPIの階層構造を意識する必要があります。
[SldWorks Ứng dụng]
└── [ModelDoc2] (アクティブなドキュメント)
└── [DrawingDoc] (図面固有の操作: NewSheetなど)
└── [Sheet] (個別のシート: プロパティ設定など)
ここで重要なポイントメトリクスを一つ。
SolidWorks VBAでは、「今どのドキュメントを触っているか(ModelDoc2)」と「図面としての特殊な操作をどこで行うか(DrawingDoc / Sheet)」を混同してはいけません。
特に `IDrawingDoc::NewSheet` メソッドは、新しいシートを作成するだけでなく、作成と同時にそのシートをアクティブにするというライフサイクル上の特徴を持っています。この挙動を知らないと、「プロパティを設定したつもりが、前のシートを書き換えていた!」という罠にハマります。
—
3. 実装コード:マルチシート動的生成マクロ
それでは、実際に動くプロダクションクオリティのコードを公開します。
このコードでは、A3横(第3角法)のシートと、A4縦(第3角法)のシートを動的に切り替えながら、一括で生成するロジックを実装しています。
Option Explicit
‘ メイン処理:マルチシート図面を動的に構築する
Sub CreateDynamicMultiSheets()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
‘ 1. アプリケーションとアクティブドキュメントの取得
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
‘ DrawingDocインターフェースへキャスト(型変換)
Set swDraw = swModel
‘ 2. エラーハンドリングの準備
On Error GoTo ErrorHandler
‘ 処理高速化のための画面描画停止(非常に重要!パフォーマンスが劇的に変わります)
swApp.CommandInProgress = True
swModel.EditRebuild
‘ ==========================================
‘ シート1の生成と設定(例:A3サイズ / 第3角法)
‘ ==========================================
Dim sheetName1 As String
sheetName1 = “MAIN_ASSEMBLY”
‘ NewSheetの引数:
‘ Name, PaperSize, TemplateInches, Scale1, Scale2, FirstAngle(True=第1, False=第3), TemplateName, Width, Height, DataSource
Dim result1 As Boolean
result1 = swDraw.NewSheet( _
sheetName1, _
swDwgPaperA3size, _ ‘ A3用紙
12, _ ‘ 規格 (12 = 標準等)
1, 1, _ ‘ 尺度 1:1
False, _ ‘ 第3角法 (False)
“”, _ ‘ テンプレートパス (空欄でデフォルト)
0, 0, _ ‘ 幅と高さ (カスタムサイズ用、通常0)
True ‘ ユーザー定義名を使用
)
If result1 Then
Set swSheet = swDraw.GetCurrentSheet()
‘ 万全を期して個別にプロパティを再設定する場合
‘ swSheet.SetProperties swDwgPaperA3size, 12, 1, 1, False, 1, 1, True
Debug.Print “シート作成成功: ” & sheetName1
End If
‘ ==========================================
‘ シート2の生成と設定(例:A4縦サイズ / 第3角法)
‘ ==========================================
Dim sheetName2 As String
sheetName2 = “PARTS_LIST”
Dim result2 As Boolean
result2 = swDraw.NewSheet( _
sheetName2, _
swDwgPaperA4size, _ ‘ A4用紙
12, _
1, 1, _
False, _
“”, _
0, 0, _
True
)
If result2 Then
Set swSheet = swDraw.GetCurrentSheet()
Debug.Print “シート作成成功: ” & sheetName2
End If
‘ 3. 終了処理
swApp.CommandInProgress = False
swModel.EditRebuild
MsgBox “すべてのシートの動的生成が完了しました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ 異常終了時も画面描画ロックは必ず解除する(これを行わないとSolidWorksがフリーズしたようになります)
swApp.CommandInProgress = False
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的なエラー”
End Sub
—
4. チーフアーキテクトが教える「陥りやすい罠」と回避テクニック
上記のコードには、実務で必ず直面するトラブルを防ぐための「知見」が散りばめられています。いくつか解説しておきましょう。
① `swApp.CommandInProgress = True` の魔法
シートの追加やモデルの再構築(Rebuild)をVBAから連続して行うと、SolidWorksは裏でGUIの再描画を必死に行おうとし、動作が極端に重くなります。
処理の直前で `CommandInProgress = True` にし、終了時に `False` に戻すことで、余計な画面描画をバイパスし、実行スピードを数倍〜十数倍に跳ね上げることができます。これはプロのエンジニアが必ず使う常套手段です。
② エラー時の安全装置(リソース解放)
もしマクロの途中でエラー(シート名の重複など)が発生した場合、画面描画ロックが解除されないままVBAが停止することがあります。これが起きるとSolidWorksのUIがフリーズしたようになり、ユーザーをパニックに陥れます。
必ず `On Error GoTo ErrorHandler` を仕込み、エラー時でも確実にロックを解除する構造にしてください。
③ シート名の重複エラー
SolidWorksでは、同一図面内に同じ名前のシートが存在することは許されません。もしループ処理などで動的にシートを量産する場合は、事前に `swDraw.GetSheetNames()` などを利用して既存のシート名を配列で取得し、名前の重複チェック(バリデーション)を入れるのが実務での鉄則です。
—
まとめ:ここをクリアすれば、自動化の景色が変わる
今回は、`IDrawingDoc.NewSheet` と `Sheet.SetProperties` を駆使したマルチシート図面の動的生成について解説しました。
「ボタン一つで、何ページもの図面枠とサイズが整然と生成されていく――」
この感動を味わえたなら、あなたのSolidWorks VBAの基礎力はすでに十分です。あとは、Excelや外部データベース(CSV等)からデータを読み込み、このコードのループ回数を動的に変化させるだけで、あなただけの強力な社内専用「図面自動生成システム」が完成します。
ここをクリアしたあなたなら、もうマクロの記録に頼る必要はありません。
自信を持って、次の自動化の領域へ進んでください。応援しています!
