【入門編】【SolidWorks VBA入門】PartDocオブジェクトの初期化と拡張子なしパス指定によるパーツファイル新規作成の極意 – SolidWorks VBA解析バイブル

スポンサーリンク

ようこそ、自動化の世界へ。私はこれまで数千の設計現場をコードの力で革新してきたチーフアーキテクトです。

SolidWorksのマクロ記録機能を使いこなし、ボタン一つで形ができる喜びを知ったあなた。素晴らしい第一歩です。しかし、現場で「本当に使えるマクロ」へと昇華させるには、記録されたコードをなぞるだけでは足りません。

今日、私たちが挑むのは「PartDoc(パーツドキュメント)の正しい初期化」
「ただ新規ファイルを開くだけだろう?」と思うかもしれませんが、ここには環境に依存しない堅牢なツールを作るための「プロの作法」が凝縮されています。

ここをマスターすれば、あなたの書くマクロは「自分のPCでしか動かないおもちゃ」から「誰の環境でも完璧に動作するシステム」へと進化します。さあ、一緒に扉を開きましょう。

1. なぜ「記録されたコード」ではダメなのか?

マクロの記録を行うと、新規作成のコードは往々にして以下のようになります。

Set Part = swApp.NewDocument(“C:\ProgramData\SolidWorks\SOLIDWORKS 2023\templates\Part.prtdot”, 0, 0, 0)

このコードの致命的な弱点は、「テンプレートのパスがベタ書き(ハードコード)されていること」です。
同僚のPCではSolidWorksのバージョンが違うかもしれません。インストール先がDドライブかもしれません。その瞬間、あなたのマクロは「ファイルが見つかりません」という無情なエラーを吐いて止まってしまいます。

プロのエンジニアは、「パスを自分で探さず、SolidWorksに聞き出す」手法をとります。

2. 黄金の初期化フロー:ModelDoc2 と PartDoc の関係

SolidWorks VBAを扱う上で、最初につまずくのが「オブジェクトの種類」です。
結論から言うと、以下の3段構えでオブジェクトを捉えてください。

1. SldWorks: アプリケーション本体(親玉)
2. ModelDoc2: ドキュメント全般(パーツ、アセンブリ、図面の共通機能)
3. PartDoc: パーツ特有の機能(押し出し、フィレット、材料設定など)

この関係性を意識してコードを組むのが、不具合を起こさないための極意です。

3. 実践:環境に左右されないパーツ新規作成コード

では、実際に使える堅牢なコードを見てみましょう。このままコピーして、あなたの標準モジュールに貼り付けてみてください。

Option Explicit

”’

”’ 安全に新規パーツを作成し、初期化するサンプル
”’

Sub CreateNewPartMaster()
‘ 1. オブジェクトの宣言(型を明確に指定するのがプロの流儀)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc

Dim templateName As String
Dim errors As Long

‘ SolidWorksアプリケーションへの接続
Set swApp = Application.SldWorks

‘ 【極意1】ユーザー設定から「デフォルトのパーツテンプレート」のパスを動的に取得する
‘ これにより、PC環境が変わってもエラーが起きなくなります
templateName = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)

If templateName = “” Then
MsgBox “デフォルトテンプレートの設定が見つかりません。設定を確認してください。”, vbCritical
Exit Sub
End If

‘ 2. 新規ドキュメントの作成
‘ 第2〜4引数は、用紙サイズ等(パーツでは通常0)
Set swModel = swApp.NewDocument(templateName, 0, 0, 0)

‘ 作成に失敗した場合の安全策
If swModel Is Nothing Then
MsgBox “ドキュメントの作成に失敗しました。”, vbCritical
Exit Sub
End If

‘ 【極意2】ModelDoc2をPartDocとしてキャスト(変換)する
‘ これで「パーツ専用の命令」が使えるようになります
Set swPart = swModel

‘ 確認のためのメッセージ
MsgBox “無事にPartDocを初期化しました!” & vbCrLf & _
“モデル名: ” & swModel.GetTitle, vbInformation

End Sub

このコードの「ここ」が凄い!

  • `GetUserPreferenceStringValue`: ユーザーが設定している「デフォルトテンプレート」を自動で見つけ出します。これでパスの不一致問題が解決します。
  • `Is Nothing` チェック: 万が一、SolidWorksがファイルを開けなかった場合に、マクロが強制終了(クラッシュ)するのを防ぎます。

4. 拡張子の罠を回避する「パス指定」のテクニック

ファイルを保存する際、初心者の方はよく `filename = “C:\Temp\MyPart.SLDPRT”` と拡張子まで手書きしてしまいます。
しかし、OSの設定やSolidWorksのバージョンによっては、拡張子の二重付与や、大文字・小文字の判定でトラブルが起きることがあります。

後々の自動保存機能を実装する際、私は以下の手法を推奨しています。

‘ 拡張子を除去したベースパスを取得するロジック(保存時に便利)
Dim fullPath As String
Dim basePath As String

fullPath = swModel.GetPathName

If fullPath <> “” Then
‘ ドットの位置を探して、左側だけを切り出す
basePath = Left(fullPath, InStrRev(fullPath, “.”) – 1)
Else
‘ まだ保存されていない新規ファイルの場合
basePath = “C:\Users\Public\Documents\NewPart”
End If

このように、「今のファイル名から拡張子を剥ぎ取って、新しい名前を合成する」というアプローチを覚えておくと、ファイル操作の安定感が劇的に向上します。

5. 初学者が陥りやすい「3つの落とし穴」

1. 変数宣言を忘れる (`Option Explicit`):
VBAの冒頭には必ずこれを書いてください。スペルミスを即座に教えてくれる、最強のガードレールです。
2. `Set` を忘れる:
普通の変数(数値や文字)と違い、SolidWorksのオブジェクト(swApp, swModelなど)に代入するときは必ず `Set` が必要です。これを忘れると「オブジェクトが必要です」というエラーの洗礼を受けます。
3. マクロ終了時にメモリを解放しない:
厳密にはVBAが面倒を見てくれますが、大規模な処理では `Set swApp = Nothing` のように、使い終わったオブジェクトを空にする習慣をつけると、動作の重さを防げます。

最後に:ここをクリアすれば、基本はバッチリです

お疲れ様でした。
「テンプレートを動的に取得し、`ModelDoc2` を経由して `PartDoc` を生成する」。
この流れは、SolidWorks自動化における「最重要の型(フォーム)」です。

野球でいえば正しいキャッチボール、料理でいえば正しい包丁の持ち方と同じです。地味に思えるかもしれませんが、ここを疎かにしないエンジニアだけが、数万行に及ぶ巨大な自動設計システムを構築できるのです。

次回は、この `swPart` オブジェクトを使って、実際にスケッチを描き、立体(フィーチャー)を作る「創造の工程」へと進みましょう。

あなたなら、必ずマスターできます。応援していますよ!

タイトルとURLをコピーしました