SolidWorks VBAを掌握する極限の知見へようこそ。
開発プロジェクトのリーダーである私から、現場で明日から使える「本物の自動化手法」を授けよう。
世の中に溢れる「何番煎じかの入門記事」は忘れなさい。ネットのサンプルコードをそのままコピペして、現場の巨大なアセンブリや複雑なパーツテンプレートで「なぜか動かない」「SolidWorksがフリーズする」と頭を抱えた経験はないだろうか?
今回は、パーツファイル(.sldprt)の新規作成という最もプリミティブな処理を題材に、「なぜそのコードでは実務で破綻するのか」「どう設計すれば100%堅牢なツールになるのか」をロジカルかつシャープに解説する。3分で読めるこの知見が、あなたのマクロ開発のパラダイムシフトになるはずだ。
—
1. なぜ「ただ新しいドキュメントを開くだけ」のコードでは実務で破綻するのか?
初心者が最初に書くコード、あるいはネットによくあるサンプルは、大抵このようなものだ。
‘ 【非推奨】よくある安易なコード
Dim swApp As Object
Set swApp = CreateObject(“SldWorks.Application”)
swApp.NewDocument “C:\ProgramData\SolidWorks\…\part.prt”, 0, 0, 0
この書き方は、実務の現場においては「地雷原でダンスをするようなもの」だ。
なぜ非効率で危険なのか、理由は3つある。
1. 環境依存のパス直書き: テンプレートのパスはPCのユーザー名やSolidWorksのバージョン、社内標準テンプレートの保存場所によって刻々と変わる。ハードコーディングは部署異動やバージョンアップで即座にエラーを吐く。
2. エラーハンドリングの欠如: SolidWorksのプロセスが裏で死んでいる場合や、ライセンスが取得できない場合の考慮がない。
3. 戻り値(ドキュメントオブジェクト)の軽視: 新規作成した後に「そのドキュメントに対して何かをする」ための参照を保持していないため、実用的な処理に繋げられない。
プロのエンジニアであれば、「環境の変化に強く、確実にインスタンスを制御し、戻り値のオブジェクトを正確にキャッチする」コードを書く。これを実現するのが、これから解説するプロダクションコードだ。
—
2. 【実践】環境差異を吸収する堅牢なパーツ生成コード
以下のコードは、私が実際の現場で標準採用している、エラー耐性の高いテンプレート指定パーツ生成のテンプレートだ。VBE(Visual Basic Editor)にそのまま貼り付け、参照設定(後述)を済ませれば即座に稼働する。
Option Explicit
‘ ==============================================================================
‘ 処理名: 既定テンプレートを使用した新規パーツファイル作成
‘ 概要 : SolidWorksのシステムオプションから標準テンプレートパスを取得し、
‘ 安全に空のパーツドキュメントを生成する。
‘ 著者 : チーフアーキテクト
‘ ==============================================================================
Sub CreateNewPartWithTemplate()
‘ 1. 変数の宣言(型を明示し、実行時バインディングのオーバーヘッドを防ぐ)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim templatePath As String
Dim documentType As Long
Dim errors As Long
Dim warnings As Long
On Error GoTo ErrorHandler
‘ 2. SolidWorksアプリケーションの取得(起動していなければ新規起動)
Set swApp = GetObject(, “SldWorks.Application”)
If swApp Is Nothing Then
Set swApp = New SldWorks.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksの起動に失敗しました。”, vbCritical, “致命的エラー”
Exit Sub
End If
End If
‘ 可視化(バックグラウンド起動によるプロセス残留を防ぐため明示的に表示)
swApp.Visible = True
‘ 3. 既定のパーツテンプレートパスをSolidWorksのシステムから動的取得
‘ ※ハードコーディングを絶対に行わないのがプロの鉄則
documentType = swDocPART ‘ 定数: パーツドキュメント (1)
templatePath = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
‘ テンプレートパスが取得できたか(空文字でないか)のバリデーション
If templatePath = “” Then
MsgBox “既定のパーツテンプレートが設定されていません。” & vbCrLf & _
“SolidWorksのオプションを確認してください。”, vbExclamation, “テンプレートエラー”
Exit Sub
End If
‘ 4. 新規ドキュメントの生成(ここでModelDoc2オブジェクトを確実につかむ)
Set swModel = swApp.NewDocument(templatePath, swDwgPaperA4size, 0#, 0#)
‘ 生成成否のチェック
If swModel Is Nothing Then
MsgBox “パーツドキュメントの生成に失敗しました。”, vbCritical, “生成エラー”
Exit Sub
End If
‘ 5. 成功時の処理(例:ビューの更新やメッセージ)
‘ ここにスケッチ作成やフィーチャ操作のコードを繋ぎ込んでいく
Debug.Print “新規パーツ作成成功: ” & swModel.GetPathName
CleanUp:
‘ オブジェクトの解放(メモリリーク防止の定石)
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “例外トラップ”
Resume CleanUp
End Sub
—
3. チーフアーキテクトが教える「保守性の高い設計」の核心
上記のコードがなぜ「プロダクション品質」なのか、3つの視点からその核心を解説しよう。
① `GetObject` と `New` の使い分けによるプロセス制御
`CreateObject` を安易に毎回呼ぶと、裏で無駄なSolidWorksのタスクが複数立ち上がり、ライセンスを消費し尽くしたりPCがクラッシュする原因になる。
すでに立ち上がっていればそれを掴み(`GetObject`)、なければ新規生成する(`New SldWorks.SldWorks` または `CreateObject`)という二段構えのロジックが、実務では絶対不可欠だ。
② ハードコーディングの排除と動的パス取得
`”C:\ProgramData\SolidWorks\…”` とパスを決め打ちする開発者は二流だ。社内PCのマスターイメージ変更やバージョンアップ(2023から2024へ等)で即座にコードが腐敗する。
SolidWorks APIの `GetUserPreferenceStringValue` を用いて、そのPCに設定されている「既定のテンプレートパス」を動的に引っこ抜くこと。これが環境差異を吸収する唯一の解である。
③ 戻り値オブジェクトの適切なスコープ管理とメモリ解放
VBAはガベージコレクションが強力ではない。COMオブジェクトを大量に扱うSolidWorksマクロにおいて、`Set swModel = Nothing` や `Set swApp = Nothing` による明示的なメモリ解放を行わないと、ExcelやSolidWorksのメモリリーク(メモリ食い潰し)を引き起こす。
「使ったら捨てる」、このライフサイクル管理を徹底してほしい。
—
4. おわりに:ここから先の実務自動化へ向けて
今回マスターした「テンプレートを指定して安全に空のパーツを開く」という手順は、すべての自動化スクリプトの「第0歩」である。
この `swModel` (`ModelDoc2` オブジェクト)を手に入れた瞬間から、あなたはAPIを通じて自由自在にスケッチを描き、押し出し、フィレットをかけ、属性情報を書き込むことができるようになる。
安易なコピペプログラミングを卒業し、構造化された「読める・壊れないコード」で、あなたの設計現場を真の自動化へと導いてほしい。健闘を祈る。
