【SolidWorks VBA入門】NewDocumentメソッドでカスタムテンプレートを強制適用した新規パーツ作成の自動化
開発プロジェクトのリーダーである私から、現場のエンジニアたちによくある悲劇の話をしよう。
「昨日作成した図面のモデリング、またデフォルトのミリメートル設定が狂っていた……」
「新人が作ったパーツのプロパティ情報が空っぽで、BOM(部品表)出力時に全社システムでエラーが出た……」
こうしたヒューマンエラーや、バラバラの初期設定に起因する手戻りは、マクロによる標準化で完全かつ一瞬に根絶できる。
世の中の入門書は「とりあえず `SldWorks.NewDocument` を使えば新しいファイルが開きます」としか書かない。だが、実務の現場でそれをやると、社内標準から外れた野良ファイルが量産され、後工程の地獄を生むことになる。
今回は、カスタムテンプレート(.prtdot)のパスを確実に解決し、環境依存のエラーを完全に封じ込めた堅牢な新規パーツ作成の自動化手法を伝授する。
—
1. なぜ「デフォルト作成」では実務で使い物にならないのか?
VBAで新規パーツを立ち上げる際、よく見かけるのが以下のコードだ。
‘ 【アンチパターン】これでは実務で使えない
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
swApp.NewDocument “”, 0, 0, 0 ‘ 引数が曖昧すぎる
このコードの何が問題か?
1. テンプレートの強制力がない: SolidWorksのシステムオプションで設定されている「デフォルト」に依存するため、PC環境が違う設計者の端末では、インチ系や独自の設定で立ち上がってしまう。
2. エラーハンドリングの欠如: テンプレートのパスが存在しない場合、あるいはSolidWorksがビジー状態のときに沈黙するか、容赦なく実行時エラーでマクロがクラッシュする。
プロのエンジニアであれば、「どの端末で実行しても、必ず特定の社内標準テンプレートを読み込ませる」という絶対的な制御をコードに組み込まなければならない。
—
2. 堅牢な設計:NewDocumentメソッドの正しい理解と要件定義
`ISldWorks::NewDocument` メソッドの構文は以下の通りだ。
Debug = swApp.NewDocument(FileName, PaperSize, Width, Height)
パーツ(Part)ファイルを新規作成する場合、`PaperSize`、`Width`、`Height` は基本的には無視される(図面ファイルで用紙サイズを指定する際に使用するため)。重要なのは第1引数の `FileName` である。ここに「社内標準パーツテンプレート(.prtdot)の絶対パス」を正確に渡してやる必要がある。
実務で必須となる3つのガード条件
1. SolidWorksが確実に起動・稼働しているかの確認
2. 指定したテンプレートファイルが物理的に存在するか(ファイルI/Oエラーの事前回避)
3. 新規ドキュメント生成後のオブジェクトが正しく取得できているかの検証
これらをすべて満たすプロダクションコードを次に提示する。
—
3. コピペで使えるプロダクションコード
以下のコードは、エラーハンドリング、ファイル存在チェック、そして実務で即座に組み込めるモジュール構造を持った完成版だ。
Option Explicit
‘ =========================================================================
‘ モジュール名: modCreatePart
‘ 概要: 社内標準テンプレートを強制適用した新規パーツ作成の自動化
‘ =========================================================================
Public Sub CreateNewStandardPart()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
‘ 1. アプリケーションインスタンスの取得
Set swApp = GetObject(, “SldWorks.Application”)
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If
‘ 2. 社内標準テンプレートのパス定義
‘ ※実運用ではネットワーク上の共通ドライブや、アドインのインストール先を指定
Dim templatePath As String
templatePath = “C:\CompanyStandard\Templates\Company_Standard_Part.prtdot”
‘ 3. ファイル存在チェック(極めて重要)
If Not CheckFileExists(templatePath) Then
MsgBox “指定された社内標準テンプレートが見つかりません。” & vbCrLf & _
“パスを確認してください: ” & templatePath, vbCritical, “ファイル不存在”
Exit Sub
End If
‘ 4. NewDocumentによる新規パーツ作成
‘ パパーツの場合、PaperSize(第2引数)等は 0 でよい
Dim dummy1 As Double, dummy2 As Double
Set swModel = swApp.NewDocument(templatePath, 0, dummy1, dummy2)
‘ 5. 生成結果の検証
If swModel Is Nothing Then
MsgBox “新規パーツの生成に失敗しました。テンプレートが破損している可能性があります。”, vbCritical, “生成エラー”
Exit Sub
End If
‘ 成功ログ(実務ではステータスバー表示やログ出力に置き換え)
swApp.SendMsgToUser2 “社内標準パーツの作成に成功しました。”, swMbInformation, swMbOk
‘ ここから先は、続けてプロパティ設定やスケッチ作成の処理を記述可能
End Sub
‘ =========================================================================
‘ 補助関数: ファイルの存在確認
‘ =========================================================================
Private Function CheckFileExists(ByVal filePath As String) As Boolean
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
If fso.FileExists(filePath) Then
CheckFileExists = True
Else
CheckFileExists = False
End If
Set fso = Nothing
End Function
—
4. コードの急所:ここを作り込むことで保守性が劇的に変わる
① `GetObject` による安全なアプリケーション連携
`New 演算子` や `Application.SldWorks` を安易に使うと、バックグラウンドで不要なSolidWorksプロセスが立ち上がり、ライセンス競合やメモリリークの原因になる。すでに起動しているセッションを正確に掴むために `GetObject(, “SldWorks.Application”)` を採用している。
② テンプレートパスのハードコーディング回避(発展)
今回のサンプルコードではパスを直接文字列で記述しているが、実際の開発プロジェクトでは、このパスを Excelの設定シート や INIファイル / レジストリ、あるいは JSON設定ファイル から動的に読み込ませるアーキテクチャにすべきだ。
テンプレートの保管場所が変更になった際、VBAのソースコード自体を書き換えるような設計は、技術的負債を生む典型例である。
③ オブジェクトのライフサイクル管理
`NewDocument` が成功すると、SolidWorksのメモリ上に新しいパーツドキュメントがロードされ、そのポインタが `ModelDoc2` オブジェクトとして返却される。
この直後から、マクロは「アクティブなドキュメント」に対してではなく、返された `swModel` オブジェクトに対して直接操作(プロパティの書き込み、カスタムプロパティの付与など)を行えるようになるため、画面のチラつき(画面更新)を抑えた高速な処理が可能になる。
—
5. リーダーからの総括
「テンプレートを強制適用して新規作成する」という一見地味な処理であっても、プロのエンジニアが書いたコードと、そうでないコードの間には「予期せぬ環境変化に対する耐性」において圧倒的な差が出る。
このコードをベースに、あなたのチームの設計プロセスに合わせた「社内標準化ツール」の第一歩を踏み出してほしい。業務効率化の成否は、こうした細部へのこだわりと、バグを生まない堅牢な設計思想の積み重ねによってのみ達成されるのだ。
