こんにちは!SolidWorks自動化の現場で泥臭く、かつ優雅にシステムを組み上げている先輩エンジニアです。
マクロの記録ボタンを押して「動いた!」と喜んでいた時期は、もう卒業しましょう。今回は、実務で必ず直面する「開いている、あるいはフォルダにある膨大な図面を、プリンター設定も含めて一網打尽に一括印刷する」というテーマに挑みます。
ここをクリアすれば、SolidWorks VBAのオブジェクトモデルの機微と、マルチドキュメント管理の基本はバッチリですよ。
さあ、手作業の地獄から抜け出すための極限の知見を授けましょう。
—
1. 現場の現実:なぜ「一括印刷」でつまずくのか?
何十枚、何百枚という図面(`.slddrw`)を1枚ずつ開いて、「ファイル > 印刷」とポチポチクリックしていく……。想像しただけで腱鞘炎になりそうな作業ですね。
VBAを使えば一瞬ですが、単にコードを書くだけでは以下の「現場の罠」にハマります。
- メモリの暴力: 多くの図面を不用意に開きっぱなしにして、SolidWorksがフリーズする(メモリリーク)。
- プリンターの反逆: デフォルトプリンターが勝手に変わり、A3で出てほしい図面がA4で縮小印刷される。
- アクティブドキュメントの迷子: 今、どの図面を操作しているのかVBA自身がロストしてしまう。
これらをスマートに解決するのが、今回紹介する「Documentsコレクションの巡回と適切なドキュメント管理」です。
—
2. SolidWorks APIオブジェクトモデルの基本構造
SolidWorks VBAを語る上で絶対に外せないのが、頂点に君臨する2つのオブジェクトです。ここを直感的に理解しておきましょう。
1. `SldWorks`(アプリケーション自身)
- SolidWorksという「巨大な母艦」です。現在開いているすべてのドキュメントのリスト(`GetDocuments`)を持っています。
2. `ModelDoc2`(開かれている図面や部品のデータ)
- 母艦の中にある個別の「ファイル(ドキュメント)」です。図面なら `DrawingDoc` という専門のインターフェースに「キャスト(変身)」させて詳細を操作します。
この構造を頭に入れた上で、実際のコードを見ていきましょう。
—
3. 実装:複数図面の一括印刷マクロ(完全版)
以下のコードは、「現在SolidWorksで開いているすべての図面ファイル」を対象に、プリンターの設定を保ったまま一括印刷し、不要になったらメモリから綺麗に解放(クローズ)する実務仕様のスクリプトです。
VBAの標準エディタ(Alt + F11)を開き、標準モジュールに貼り付けてください。
Option Explicit
‘ メイン処理:開いている全図面の一括印刷
Sub BatchPrintAllOpenDrawings()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim docList As Variant
Dim i As Long
Dim printedCount As Long
‘ 1. SldWorksアプリケーションの取得
Set swApp = Application.SldWorks
If swApp is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
‘ 2. 現在開いているすべてのドキュメントの配列を取得
docList = swApp.GetDocuments
If IsEmpty(docList) Then
MsgBox “現在開かれているドキュメントはありません。”, vbExclamation
Exit Sub
End If
printedCount = 0
‘ 3. ドキュメントの配列をループ処理
For i = LBound(docList) To UBound(docList)
Set swModel = docList(i)
‘ 4. 「図面ファイル(.slddrw)」であるかを判定 (文書タイプが swDocDRAWING の場合)
If swModel.GetType = swDocDRAWING Then
‘ 5. ウィンドウをアクティブにして確実に操作対象にする
Dim foundTitle As String
foundTitle = swModel.GetTitle()
swApp.ActivateDoc3 foundTitle, False, 0, 0
‘ 6. 印刷実行(※ここでは簡易的に標準設定でプリントアウト)
‘ 実際の現場では PageSetup オブジェクトで用紙サイズや向きを制御します
Call PrintCurrentDrawing(swModel)
printedCount = printedCount + 1
‘ 【重要】メモリ管理:自動処理では開きっぱなしにせず、必要に応じて閉じる設計にする
‘ 今回は「すでに開いていたもの」を対象にしているので閉じませんが、
‘ フォルダから開く場合は swApp.CloseDoc foundTitle をループ内に入れます。
End If
Next i
‘ 完了通知
MsgBox “処理が完了しました。” & vbCrLf & “印刷された図面数: ” & printedCount & ” 枚”, vbInformation
End Sub
‘ 印刷ロジックを切り出したサブプロシージャ
Private Sub PrintCurrentDrawing(ByVal swModel As SldWorks.ModelDoc2)
Dim pageSetup As SldWorks.PageSetup
Set pageSetup = swModel.PageSetup
‘ — プリンター設定のカスタマイズ例 —
‘ pageSetup.Orientation = 2 ‘ 2: 横向き (Landscape), 1: 縦向き (Portrait)
‘ pageSetup.PrinterPaperSize = 8 ‘ 用紙サイズ指定 (例: A3なら対応する定数)
‘ 印刷の実行 (引数はプリンター名、部数、範囲など。空欄の場合はデフォルト設定)
‘ ※実際のAPI仕様に合わせて調整してください
Dim errors As Long
Dim warnings As Long
‘ ダイアログを出さずにサイレント印刷する場合のメソッド
‘ 注: 実行環境のプリンタードライバーに強く依存するため、テスト印刷を必ず行ってください。
swModel.Extension.PrintOut2 1, 1, True, “”, “”
Debug.Print “印刷実行: ” & swModel.GetTitle()
End Sub
—
4. コードの深掘り解説:ここがプロの技
初心者のうちは、「開く・印刷する」だけでコードがごちゃごちゃしがちですが、上記のコードにはプロならではの設計思想が隠されています。
① `swApp.GetDocuments` による安全なコレクション巡回
`Documents` カウンタを直接いじるループは、処理中にドキュメントが開閉されるとインデックスがズレてバグの温床になります。一度 `Variant` 型の配列(`docList = swApp.GetDocuments`)にスナップショットを撮ってからループを回すのが、クラッシュを防ぐための鉄則です。
② `swModel.GetType` での型フィルター
SolidWorksの世界には、部品(`.sldprt`)、アセンブリ(`.sldasm`)、図面(`.slddrw`)が混在しています。部品を印刷しようとしてエラーを吐かないよう、`swDocDRAWING`(値は3)であるかを必ずフィルタリングしています。
③ ユーザー体験とデバッグへの配慮
`Debug.Print` を仕込むことで、イミディエイトウィンドウに「どの図面が何枚目に処理されたか」のログが残ります。「動いているけれど何が起きているか分からない」という不安を消し去る、エンジニアの優しさです。
—
5. 陥りやすいエラーと回避の極意
最後に、このマクロを実務に導入した際によくあるトラブルと、その対策をシェアしておきます。
- エラー:「型が一致しません」 (Type Mismatch)
- 原因: `swModel` に格納されたオブジェクトが、想定外のステータスになっている場合におきます。
- 対策: `If swModel Is Nothing Then GoTo NextDoc` のように、オブジェクトが正しく取得できているかのガード節を必ず挟みましょう。
- プリンターの用紙サイズが勝手に変わる問題
- 原因: 図面側のシートプロパティ(A3やA4)と、プリンタードライバーのデフォルト設定が喧嘩をしています。
- 対策: コード内の `PageSetup` オブジェクトを操作し、用紙サイズや向きをプログラム側から強制的に上書き指定するのがプロの現場のやり方です。
—
まとめ
今回は、SolidWorks VBAにおけるマルチドキュメント管理の基本と、複数図面の一括印刷自動化について解説しました。
- `GetDocuments` で現在の全ドキュメントを安全に取得する
- `GetType` で図面だけを的確にフィルタリングする
- オブジェクトのライフサイクル(メモリ管理とアクティブ化)を意識する
ここさえクリアすれば、あなたももう「マクロの記録の呪縛」から完全に解放されたSolidWorks自動化エンジニアです。ぜひ、明日の業務からこの知見を組み込んで、圧倒的な効率化を叩き出してください!
