【実務・中級編】【エクスポート自動化】ModelDoc2.Extension.SaveAsサイレント保存を活用した、STEP・Parasolid・STLのマルチフォーマット一括出力 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks自動化】SaveAsを極める:サイレント・マルチフォーマット出力の極意

SolidWorks API開発の現場で、最も頻繁に遭遇し、かつ最も「事故」が起きやすいのが「ファイル出力」の自動化だ。

「とりあえず `SaveAs` メソッドを呼べばいい」と思考停止してはいないだろうか? 現場で使われるマクロには、堅牢性(Robustness)可読性(Readability)、そして非同期的なエラー処理への耐性が求められる。

今回は、実務で即戦力となる「パーツ保存と同時にSTEP/Parasolid/STLをサイレント出力する」ためのアーキテクチャを伝授する。

1. なぜ「単純なSaveAs」では現場で通用しないのか

多くの初心者が犯す過ちは、`swModel.SaveAs2` を単発で叩くことだ。これには以下のリスクが潜んでいる。

1. ダイアログの割り込み: 設定不備により保存時にプロンプトが表示され、自動化が停止する。
2. 拡張子の不整合: ファイルパスとフォーマット引数の不一致による予期せぬエラー。
3. 書き込み権限の欠如: ネットワークドライブ上のロックや、既存ファイルの上書き保護による例外処理の欠如。

これらを解決する鍵は、`ModelDocExtension` オブジェクトを使い、明示的に「保存オプション」を制御することにある。

2. 堅牢なプロダクションコード:MultiFormatExporter

以下のコードは、単なるスクリプトではなく、拡張性を考慮した設計だ。これをモジュールとして切り出しておけば、プロジェクトを跨いでも再利用できる。

Option Explicit

‘ 必要な定数の定義(API仕様により固定値を使用)
Private Const swSaveAsCurrentVersion As Long = 0
Private Const swSaveAsOptions_Silent As Long = 1

”’

”’ パーツファイルを指定した複数のフォーマットで一括出力する
”’

Public Sub ExportPartToMultipleFormats(swModel As SldWorks.ModelDoc2, exportDir As String)
Dim swExt As SldWorks.ModelDocExtension
Dim docTitle As String
Dim baseName As String

Set swExt = swModel.Extension
docTitle = swModel.GetTitle
‘ 拡張子を除いたファイル名を取得
baseName = Left(docTitle, InStrRev(docTitle, “.”) – 1)

‘ 出力先のディレクトリが存在するか確認(基本中の基本)
If Dir(exportDir, vbDirectory) = “” Then
Err.Raise vbObjectError + 1000, “Export”, “指定されたフォルダが存在しません。”
End If

‘ 各形式でのエクスポート処理
Call ExportFile(swExt, baseName, exportDir, “STEP”, “.step”)
Call ExportFile(swExt, baseName, exportDir, “Parasolid”, “.x_t”)
Call ExportFile(swExt, baseName, exportDir, “STL”, “.stl”)

Debug.Print “全フォーマットの出力が完了しました。”
End Sub

Private Sub ExportFile(swExt As SldWorks.ModelDocExtension, baseName As String, _
dir As String, formatType As String, ext As String)
Dim fullPath As String
Dim status As Boolean

fullPath = dir & “\” & baseName & ext

‘ SaveAsメソッドの肝:第4引数以降のオプションを正しく設定する
‘ swSaveAsOptions_Silent (1) を指定することで、ダイアログを強制抑制
status = swExt.SaveAs(fullPath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, 0, 0)

If Not status Then
Debug.Print “エラー: ” & formatType & ” の出力に失敗しました。”
End If
End Sub

3. 開発リーダーからの「設計の勘所」

① パスの結合は `\` をハードコードしない

Windowsのパス操作において、`\` の有無を気にするのは時間の無駄だ。実務では `FileSystemObject (FSO)` を活用し、パスの整合性を常に保つ設計にすること。

② エラーハンドリングの「解像度」を上げる

上記のコードでは `status` の戻り値を見て `Debug.Print` しているが、実際のプロダクション環境では、ログファイルへの書き出しや、失敗時にどのフォーマットで何が起きたかをユーザーに通知する `MsgBox` を実装すべきだ。

③ ユーザーの「作業環境」を汚さない

`SaveAs` を実行する際、SolidWorksが裏で「別のウィンドウ」として認識してしまい、画面がちらつくことがある。`swApp.Visible = False` を安易に使うのは避け、`swApp.UserControl = False` を駆使して、プロセスをサイレントに制御するのがプロの作法だ。

4. 次のステップへ

このコードをベースに、以下の機能を追加することで、あなたの自動化ツールは「伝説的」なものへ進化する。

  • データベース連携: `Access` や `SQL Server` と連携し、出力したファイルパスをレコードとして記録する(履歴追跡)。
  • コンフィギュレーション対応: パーツ内の特定コンフィギュレーションのみをエクスポートするロジックの追加。
  • バッチ処理: 指定フォルダ内の全パーツファイルをループ処理で一括変換するラッパー関数の実装。

SolidWorks VBAは古い言語と言われることもあるが、APIの深淵を理解したエンジニアにとっては、これほど強力な「製造の武器」はない。さあ、このコードをあなたの武器庫に加え、退屈な手作業を自動化の炎で焼き払ってほしい。

何か不明点があれば、コードの深層まで解説する準備はできている。遠慮なく質問してくれ。

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