【SolidWorks VBA入門】テンプレート指定を伴う新規パーツファイル(.sldprt)のプログラム生成手順
SolidWorks VBA自動化の領域へようこそ。
私は長年、数千・数万点規模の3D CADデータ群を統御する巨大な設計自動化アーキテクチャの構築に携わってきた。
世の中には「SolidWorks マクロの記録」をそのまま貼り付けただけの、脆く、環境依存の塊のようなコードがあふれている。しかし、真に堅牢な社内システムや設計自動化パイプラインを構築したいのであれば、APIの挙動、オブジェクトのライフサイクル、そして背後で稼働するCOMプロセスの摂理を完全に掌握しなければならない。
今回は、すべての自動化の起点となる「テンプレート指定を伴う新規パーツファイル(.sldprt)のプログラム生成」について、単なる入門の枠を超えた「極限の知見」を授けよう。
—
1. なぜ「単なる新規作成」で事故が起きるのか?
初心者が最初に直面する罠、それは `SldWorks.NewDocument` メソッドの挙動の深淵にある。
多くの解説書では、次のようなコードが平然と紹介されている。
‘ 危険なアンチパターン例
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
swApp.NewDocument “”, 0, 0, 0
このコードは、運が良ければ動く。しかし、実務の現場――すなわち英語OS、日本語OSの混在環境や、ユーザーごとに異なるファイルタブ設定、さらには社内標準テンプレートのパスがレジストリからズレている環境においては、確実にハングアップまたは意図しないデフォルトテンプレートでの強制生成を引き起こす。
プロフェッショナルは、「暗黙の前提」を一切置かない。テンプレートのパス、単位系、そしてドキュメントタイプの三者象を完全にコードで制御する。
—
2. 【極限コード】堅牢性を極めた新規パーツ生成スクリプト
以下に提示するのは、実務の現場でそのまま稼働させうる、エラーハンドリングとメモリ管理を極限まで高めた実用コードである。コピペして即座に検証してほしい。
Option Explicit
‘ ==============================================================================
‘ 処理名: テンプレート指定による新規パーツドキュメントの生成
‘ 概要: 既定の検索パスに依存せず、絶対パス指定で確実に指定単位系のパーツを生成する
‘ ==============================================================================
Sub CreateNewPartWithTemplate()
‘ 1. オブジェクト変数の宣言(強型付けによるバインディングの最適化)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim templatePath As String
Dim lngErrors As Long
Dim lngWarnings As Long
‘ 2. SldWorksアプリケーションインスタンスの取得
‘ ※GetObjectではなくCreateObject、あるいは既存インスタンスの安全なフックを行う
On Error Resume Next
Set swApp = GetObject(, “SldWorks.Application”)
On Error GoTo 0
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。プロセスを起動してから実行してください。”, vbCritical, “致命的エラー”
Exit Sub
End If
‘ 3. 組織標準のテンプレート絶対パスを定義
‘ ※実務では環境変数やINIFILEから動的に取得することを強く推奨する
templatePath = “C:\ProgramData\SolidWorks\SolidWorks 2024\templates\Part.prtdot”
‘ 4. テンプレートファイルの存在確認(I/O例外の事前防止)
If Dir(templatePath) = “” Then
MsgBox “指定されたテンプレートが存在しません: ” & vbCrLf & templatePath, vbCritical, “ファイルロストエラー”
Exit Sub
End If
‘ 5. 新規ドキュメントの生成 (NewDocumentメソッドの真価)
‘ 引数構成: NewDocument(TemplateName, PaperSize, Width, Height)
‘ パーツ(.sldprt)の場合は PaperSize, Width, Height は通常 0 でパディングする
Set swModel = swApp.NewDocument(templatePath, 0, 0, 0)
‘ 6. 生成結果の検証とメモリ安全性確保
If swModel Is Nothing Then
MsgBox “パーツドキュメントの生成に失敗しました。APIエラーコードを確認してください。”, vbCritical, “生成失敗”
Exit Sub
End If
‘ 7. ビューポートの強制リフレッシュ(画面描画の同期)
‘ 生成直後のゴースト現象(画面が真っ黒になる等)を防止する極意
swModel.ViewZoomtoFit2
‘ 8. 成功ログの出力(システム連携時のトレース用)
Debug.Print “新規パーツ生成成功: ” & swModel.GetPathName
‘ 9. メモリリーク防止のための参照解放
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
3. チーフアーキテクトが解説する「3つの技術的特異点」
このコードがなぜ「世界最高峰の品質」を誇るのか、その技術的背景を3点に絞って解説する。
① `GetObject` によるプロセス安全フック
`Application.SldWorks` を直接叩くコードは、マルチインスタンス環境やCOMの初期化タイミングによってランタイムエラー(エラー429など)を引き起こしやすい。
`GetObject(, “SldWorks.Application”)` を用いることで、現在アクティブなSolidWorksのメモリ空間を安全に安全にキャッチアップし、不要な二重起動やゾンビプロセスの発生を根絶する。
② 絶対パスによるテンプレート指定の絶対性
`swApp.GetUserPreferenceStringValue` 等からデフォルトテンプレート名を取得する手法は、レジストリの破損やユーザープロファイルの差異によって容易に破綻する。
「テンプレートは絶対パスで明示的に叩く」。これが大規模システム連携における鉄則である。これにより、JIS規格、ANSI規格、社内独自規格などの切り替えをコードベースで自由自在にコントロールできるようになる。
③ 描画バッファとメモリの適正解放 (`Set xxx = Nothing`)
VBAランタイムはガベージコレクションを持たない。COMオブジェクトであるSolidWorks APIを操作した際、変数を解放せずに放置すると、裏でCOM参照カウントが残存し、SolidWorks終了時にプロセスがメモリ上に残留する「ゾンビプロセス問題」を引き起こす。
スクリプトの最後で `Set swModel = Nothing` および `Set swApp = Nothing` を明示的に実行し、即座にメモリの参照を切断することが、自動化サーバーの安定稼働には不可欠である。
—
4. 次のステップへ:システム間連携への布石
今回のスクリプティングにより、VBAから「正しい状態のパーツファイル」を意図通りに生み出す基盤が整った。
実務では、この直後に `IModelDocExtension::CustomPropertyManager` を叩いて外部DB(ERPやPLM)からのメタデータを流し込み、さらにフィーチャ操作へと処理をバトンタッチしていくことになる。
手動作業の自動化に満足するな。
APIの本質を理解し、一寸の狂いもない堅牢なコード群によって、あなたの設計環境を完全なる支配下に置くのだ。
