こんにちは!SolidWorks VBAの世界へようこそ。
チーフアーキテクトの私だ。今日から君は、ただ「マクロの記録」ボタンを押すだけの初心者ではない。SolidWorksの内部エンジン(COMコンポーネント)を直接手玉にとる、誇り高き自動化エンジニアへの第一歩を踏み出すのだ。
記念すべき第1回目のテーマは「テンプレート指定を伴う新規パーツファイル(.sldprt)のプログラム生成」。
ここをクリアすれば、SolidWorks VBAの基本構造はバッチリだ。さあ、深呼吸して、私の背中についてきなさい。
—
1. なぜ「マクロの記録」だけでは不十分なのか?
君が最初にやりがちなのが、「マクロの記録」機能だ。画面上でポチポチと操作した軌跡がコードになる、あれだな。
しかし、現場で本当に使える自動化システムを構築したいなら、記録されたコードをそのまま使うのは今すぐやめなさい。なぜなら、マクロの記録は「今開いているドキュメントを前提とした場当たり的な操作」をトレースしているに過ぎず、「ゼロから新しいファイルを意志を持って生み出す」というプログラミングの本質が抜け落ちているからだ。
プログラミングによるファイル生成とは、神が世界を創るが如く、何もない空間に「ドキュメント」という宇宙を顕現させる作業なのだよ。
—
2. 【実戦投入】最短・最速のパーツ生成コード
百聞は一見に如かず。まずは、SolidWorksを起動し、既定のテンプレートを読み込んで真新しいパーツファイルを開くための「最も美しく、無駄のないVBAコード」を授けよう。
VBAエディタ(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けて実行してみたまえ。
Option Explicit
Sub CreateNewPartTheRightWay()
‘ =========================================================================
‘ 宣言セクション
‘ =========================================================================
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim templatePath As String
Dim errors As Long
Dim warnings As Long
‘ =========================================================================
‘ 1. SolidWorksアプリケーションの取得
‘ =========================================================================
‘ すでに起動しているSolidWorksのインスタンスを掴みに行きます
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的なエラー”
Exit Sub
End If
‘ =========================================================================
‘ 2. テンプレートパスの取得
‘ =========================================================================
‘ SolidWorksがあらかじめ設定している「既定のパーツテンプレート」のパスを取得します
templatePath = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
‘ もし何らかの原因で取得できない場合のフォールバック(安全装置)
If templatePath = “” Then
‘ 標準的なインストールパスの例(環境に合わせて適宜変更してください)
templatePath = “C:\ProgramData\SolidWorks\SolidWorks 202X\templates\パート.sldprt”
End If
‘ =========================================================================
‘ 3. 新規パーツドキュメントの生成
‘ =========================================================================
‘ NewDocument メソッドを使って、テンプレートを元にパーツ(.sldprt)を作成します
‘ 引数:(テンプレートパス, 用紙サイズ(今回は関係なし), 画面幅, 画面高さ)
Set swModel = swApp.NewDocument(templatePath, swDwgPaperSizes_e.swDwgPaperA4size, 0, 0)
‘ =========================================================================
‘ 4. エラーハンドリング(極限の知見)
‘ =================================================================eyn
If swModel Is Nothing Then
MsgBox “パーツの生成に失敗しました。テンプレートパスを確認してください。” & vbCrLf & _
“パス: ” & templatePath, vbCritical, “生成エラー”
Exit Sub
End If
‘ 成功のログ
Debug.Print “新規パーツファイルが正常に生成されました: ” & swModel.GetPathName
MsgBox “新しいパーツファイルを作成しました!”, vbInformation, “成功”
End Sub
—
3. コードの急所を徹底解説!
この短いコードの中には、実務で絶対に知っておくべきSolidWorks APIの「極意」が詰まっている。一つずつ紐解いていこう。
① `Option Explicit` はエンジニアの良心
コードの最上部に書かれているこれ。変数の「宣言忘れ」を強制的にエラーにしてくれる。これを書かないプログラマーは、夜道でヘッドライトを消して高速道路を走るようなものだ。必ず記述しなさい。
② `Application.SldWorks` とは何か?
VBAの世界における「SolidWorksそのもの」を指す最高神(オブジェクト)だ。これを通じて、ファイルの開閉、環境設定の変更、選択操作など、あらゆる命令の根幹を司る。
③ なぜ「テンプレートパス」をハードコーディングしないのか?
初心者がやりがちなミスが、`”C:\Program Files\…xxx.sldprt”` と直接パスを書き込んでしまうことだ。しかし、設計者によってインストール先のドライブが違ったり、社内標準テンプレートの保存場所が違うだけで、コードは一瞬でゴミと化す。
`swApp.GetUserPreferenceStringValue(…)` を使うことで、「そのPCに設定されているデフォルトのテンプレート」を動的に取得する。これがプロの書く、環境に依存しない堅牢なコードだ。
④ `NewDocument` メソッドの正体
これが今回の主役だ。
引数にテンプレートのパスを渡すことで、SolidWorksの裏画面(バックグラウンド)でそのテンプレートをベースにした新しいドキュメント実体がメモリ上に構築され、画面に描画される。戻り値として返ってくる `swModel`(`ModelDoc2`オブジェクト)こそが、今後、スケッチを描き、押し出しボスを作成するための「操作パネル」となるのだ。
—
4. 初学者が必ずハマる「罠」と回避策
ここで、現場でよくあるエラーとその処方箋を伝授しておこう。
- 罠1:テンプレートが見つからないエラー(戻り値が `Nothing` になる)
- 原因: `swDefaultTemplatePart` が空文字を返す場合や、日本語のテンプレート名(「パーツ.sldprt」など)の文字コードが環境によって一致しない場合。
- 対策: コード内のフォールバック処理のように、事前にファイルが存在するかどうかを `Dir` 関数などでチェックする防御的プログラミングを心がけよう。
- 罠2:型が一致しません(Type mismatch)エラー
- 原因: `Dim swApp As SldWorks.SldWorks` と型を明示せず、単なる `Dim swApp As Object` や無宣言で進めた場合に起きる(レイトバインディングの弊害)。
- 対策: ツール > 参照設定 から「SolidWorks 20xx Type Library」にチェックを入れ、今回のようにアーリーバインディング(事前バインディング)を徹底しなさい。インテリセンス(入力補完)が効く恩恵は、開発効率を何倍にも跳ね上げる。
—
5. まとめ
お疲れ様!これで君は、ボタン一つでSolidWorksのパーツファイルを意図通りに生成できるようになった。
「ファイルを新しく開く」という、一見地味なこのプロセス。しかし、「環境に依存せず、確実に、安全にオブジェクトをメモリ上に顕現させる」というアプローチは、今後、数千パーツを一括生成するような巨大な自動化システムを作る際にも、全く同じ土台として君を支え続ける。
ここをクリアした君なら、もう次のステップに進む資格がある。
次回は、この生成したパーツに対して、「スケッチを描き、ボス-押し出しフィーチャで3D形状を爆誕させる方法」を解説しよう。
準備ができたら、次の扉を開けたまえ。君の健闘を祈る!
