【SolidWorks VBA入門】マクロ記録機能の限界を知る!はじめてのパーツファイル新規作成コードの書き方
SolidWorksの「マクロ記録」ボタンを押し、パーツを作成し、保存する。それをVBAで再生する……。多くの初心者が最初に行うこの行為は、実は「最もやってはいけない非効率な開発の第一歩」です。
マクロ記録はあくまで「操作の軌跡」であって「ロジック」ではないからです。マクロ記録が生成するコードは、その時の環境(PCのパス、テンプレートの場所、ユーザー設定)に強く依存し、配布した瞬間にエラーを吐く脆弱な塊です。
本記事では、世界最高峰の自動化エンジニアが、実務で絶対にバグらせない「堅牢なパーツ作成の流儀」を伝授します。
—
1. なぜ「マクロ記録」では現場の自動化が破綻するのか
マクロ記録されたコードには、以下のような致命的な欠陥が含まれています。
- ハードコーディングされたパス: テンプレートの場所を`”C:\Users\Name\AppData…”`のように固定すると、他人のPCでは即座に死にます。
- イベントの競合: SolidWorksのGUI操作をエミュレートしているため、バックグラウンド処理には不向きです。
- 単位系の不確実性: テンプレート側で設定されている単位系が、作成される部品の単位系を決定します。コード内で明示的に制御しない限り、設計意図と異なる単位系で部品が生成されます。
プロのエンジニアは、「操作を記録する」のではなく「APIを制御する」という視点に立ちます。
—
2. 堅牢なパーツ作成のための「3つの鉄則」
実務で「動く」だけでなく「保守できる」コードを書くためには、以下の設計思想を注入してください。
1. テンプレートの動的取得: SolidWorksの設定から正しいテンプレートパスを取得すること。
2. 単位系の明示的指定: プログラム側で強制的に単位系をセットし、環境差を排除すること。
3. オブジェクトの解放: 使用した`ModelDoc2`オブジェクトは確実にメモリから解放すること。
—
3. 実践コード:プロダクションレベルの「パーツ作成」
以下は、実務でそのまま利用可能な、堅牢性を重視したコード例です。
Option Explicit
‘ ———————————————————
‘ SolidWorksパーツを新規作成し、単位系をmmgsに設定する
‘ ———————————————————
Public Sub CreateNewPart_Professional()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim templatePath As String
Dim errors As Long, warnings As Long
‘ SolidWorksアプリケーションへの接続
Set swApp = Application.SldWorks
‘ 1. テンプレートパスの取得(ハードコーディングは厳禁)
templatePath = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
‘ 2. パーツの新規作成
Set swModel = swApp.NewDocument(templatePath, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “パーツファイルの作成に失敗しました。”, vbCritical
Exit Sub
End If
‘ 3. 単位系の強制設定 (mm, g, s)
‘ 0: swUnitSystem_MMGS
swModel.Extension.SetUserPreferenceInteger swUserPreferenceIntegerValue_e.swUnitsLinear, 0, swUnitsLinear_Millimeters
swModel.Extension.SetUserPreferenceInteger swUserPreferenceIntegerValue_e.swUnitsMassPropMass, 0, swUnitsMassPropMass_Grams
‘ メモリ解放の明示(VBAでは推奨される習慣)
Set swModel = Nothing
Set swApp = Nothing
Debug.Print “パーツ作成完了:単位系をmmgsに統一しました。”
End Sub
—
4. コードの解説と「なぜ」の核心
なぜ `NewDocument` を使うのか?
マクロ記録ではしばしば `swApp.NewPart` が使われますが、これは廃止予定の古いAPIです。`NewDocument` を使うことで、ユーザーがカスタマイズした「テンプレート」を正しく参照できます。
`GetUserPreferenceStringValue` の重要性
`swDefaultTemplatePart` を指定することで、SolidWorksの「システムオプション > 既定のテンプレート」で設定されている正しいパスを抽出します。これにより、ネットワーク環境やユーザーごとの設定差を気にせず、どんな環境でも正しいテンプレートで部品が作成されます。
単位系の制御(SetUserPreferenceInteger)
モデル作成後に単位系をコードで上書きするのは、後続のジオメトリ生成において「計算誤差」を防ぐための重要な防衛策です。これを怠ると、スケッチの寸法がインチで入力されるなどの致命的なバグを引き起こします。
—
5. 最後に:エンジニアとしてのステップアップ
今回のコードは、自動化の「第一歩」に過ぎません。次のステージに進むためには、以下の視点を持ってください。
- エラーハンドリング: ユーザーがSolidWorksを閉じていた場合や、ファイルが読み取り専用だった場合の処理を追加する。
- データベース連携: 作成したパーツのファイル名を、ExcelやSQL Serverから取得した製品コード(品番)で自動命名するロジックを組む。
「動けばいい」というコードは、数ヶ月後のあなた自身を苦しめます。
「誰が使っても同じ挙動を保証する」というエンジニアリングの矜持を持って、堅牢なシステムを構築してください。あなたの自動化ツールが、現場の無駄な作業を一つでも減らすことを願っています。
