【SolidWorks VBA入門】NewDocumentメソッドでカスタムテンプレートを強制適用した新規パーツ作成の自動化
設計現場における最大の無駄は、環境の不整合に起因する手戻りである。
「社内標準の単位系(mm・g・s)になっていない」「カスタムプロパティのスキーマが欠落している」「図枠やレイヤー定義がバラバラのままモデリングが開始された」。これらは、SolidWorksのデフォルト設定や、オペレータの偶発的な操作ミスを野放しにしている組織的敗北に他ならない。
VBAによる自動化の第一歩は、この「揺らぎ」を完全に排除することから始まる。
今回は、`SldWorks.ISldWorks.NewDocument` メソッドを使用し、社内標準カスタムテンプレート(`.prtdot`)をプログラム側から強制適用して新規パーツを立ち上げる、実戦投入可能なアーキテクチャを解説する。
—
1. 根源的課題:なぜ `NewDocument` なのか?
単に「新しいパーツを開く」だけであれば、`SldWorks.ISldWorks.NewPart` メソッドという簡易的なAPIが存在する。しかし、シニアエンジニアやシステム管理者であれば、このメソッドの本番環境での使用は直ちに禁忌とするべきだ。
`NewPart` は、SolidWorksの「デフォルトの」パーツテンプレートをハードコードされたパス、あるいはシステムオプションのデフォルト値に依存して呼び出す。そのため、PCの環境やユーザープロファイルが異なるだけで、意図しない単位系や図面枠を持つファイルが生成される。
一方、`NewDocument` メソッドは以下のシグネチャを持つ。
Set swModel = swApp.NewDocument(TemplateName, PaperSize, Width, Height)
このメソッドを用いることで、完全に制御された任意のテンプレートパス(`.prtdot`)を明示的に指定し、環境に依存しない同一の初期状態を担保したパーツドキュメントを強制生成することが可能となる。
—
2. 実装アーキテクチャ:堅牢なVBAコード
以下のコードは、単にAPIを叩くだけの脆弱なサンプルではない。ファイルシステムの存在チェック、API戻り値の厳密な型評価、そしてCOMオブジェクトのメモリ管理(ライフサイクル管理)のベストプラクティスを網羅したプロダクションコードである。
Option Explicit
‘ ==============================================================================
‘ 担当: チーフアーキテクト
‘ 概要: 社内標準テンプレートを指定したセキュアな新規パーツ生成プロシージャ
‘ ==============================================================================
Sub CreateNewPartWithStandardTemplate()
‘ 1. オブジェクト変数の宣言(強型付けによるバインディング最適化)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim templatePath As String
Dim lErrors As Long
Dim lWarnings As Long
‘ 2. アプリケーションインスタンスの取得(既起動プロセスへのアタッチ)
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If
‘ 3. 社内標準パーツテンプレートのパス定義
‘ ※環境に応じてネットワークパスや共有ストレージのパスに変更すること
templatePath = “C:\SolidWorks_Standards\Templates\CompanyStandard_Part.prtdot”
‘ 4. ファイルシステムの存在チェック(極めて重要:APIの例外暴発を防ぐ)
If Not CheckFileExists(templatePath) Then
MsgBox “指定された社内標準テンプレートが存在しません。” & vbCrLf & _
“パス: ” & templatePath, vbCritical, “テンプレート欠落エラー”
Exit Sub
End If
‘ 5. NewDocumentによるパーツの強制生成
‘ 引数説明:
‘ TemplateName : テンプレートのフルパス
‘ PaperSize : 用紙サイズ(パーツの場合は通常 0 固定)
‘ Width : 幅(パーツの場合は 0 固定)
‘ Height : 高さ(パーツの場合は 0 固定)
Set swModel = swApp.NewDocument(templatePath, 0, 0, 0)
‘ 6. 生成結果の検証(メモリリーク・ヌルポインタ例外対策)
If swModel Is Nothing Then
MsgBox “NewDocumentメソッドの実行に失敗しました。” & vbCrLf & _
“テンプレートのバージョン不整合、またはファイル破損の可能性があります。”, vbCritical, “API実行エラー”
Exit Sub
End If
‘ 7. 後続処理(必要に応じてプロパティの設定や初期ビュー調整などを行う)
‘ 例: 単位系の強制再確認(必要であればここでAPIを叩く)
MsgBox “社内標準テンプレートに基づくパーツの生成が完了しました。”, vbInformation, “自動化完了”
‘ 8. オブジェクトの明示的解放(VBAのガベージコレクションの非力さを補う)
Set swModel = Nothing
Set swApp = Nothing
End Sub
‘ ==============================================================================
‘ 補助関数: ファイル存在確認 (FileSystemObjectを使用)
‘ ==============================================================================
Private Function CheckFileExists(ByVal fullPath As String) As Boolean
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
CheckFileExists = fso.FileExists(fullPath)
Set fso = Nothing
End Function
—
3. チーフアーキテクトが指摘する「死角」と最適化の知見
実務でこのコードを展開する際、ジュニアプログラマが陥りがちな罠と、それを回避するための極限の知見を共有する。
① COMオブジェクトのライフサイクルとメモリ最適化
VBAのランタイムは、参照カウント方式のCOMオブジェクト管理において決して優秀ではない。特にSolidWorks VBAでは、`ModelDoc2` や `SelectionMgr` などのインターフェースを保持したままプロシージャを抜けると、バックグラウンドでCOM参照が残り、SolidWorksのプロセスがゾンビ化(メモリリーク)する原因となる。
プロシージャの最後では必ず `Set swModel = Nothing` および `Set swApp = Nothing` を明示的に実行し、即座にメモリ解放を行うこと。
② ネットワークパス(UNC)遅延への耐性
社内標準テンプレートをローカルではなく `\\fileserver\standards\..` のようなネットワーク共有に置く場合、DNSの名前解決やセッション確立のレイテンシによって、`NewDocument` 実行時にフリーズあるいはタイムアウトが発生することがある。
運用時は、社内システムの起動時タスク等で、ローカルの特定フォルダ(例: `C:\SolidWorks_Standards\`)へ最新のテンプレートを同期・キャッシュする仕組み(ロバストなファイル同期機構)を併せて実装するのが、エンタープライズアーキテクチャの鉄則である。
③ テンプレートのバージョン非互換エラー
SolidWorksは上位互換性はあるものの、下位互換性はない。つまり、SolidWorks 2024で保存されたカスタムテンプレートを、SolidWorks 2022の環境で `NewDocument` に渡すと、サイレントクラッシュまたは予期せぬエラーを引き起こす。
テンプレートファイルを配布・管理するシステムにおいては、全クライアントのSolidWorksバージョンとテンプレートの作成バージョンの整合性を一元管理するバリデーションレイヤーを前段に設けるべきである。
—
総括
「テンプレートを強制適用して新規パーツを作る」という一見枯れた処理であっても、エンタープライズの現場においては、例外処理、パス検証、メモリ管理、そしてバージョン統制というエンジニアリングの基本原則がすべて詰まっている。
手作業による「おまじない」や「慣例」をコードによって駆逐し、完全無欠の自動化基盤を構築することこそが、我々業務自動化エンジニアの存在意義である。
