【入門編】【エクスポート自動化】パーツモデルからSTEP・IGES・PARASOLID・STLへの高精度バッチ変換スクリプト – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!現場でバリバリとSolidWorksを使い倒しているエンジニアの皆さん、そして日々の定型作業に愛想を尽かし「絶対に自動化してやるぞ」と立ち上がった未来の自動化マエストロの皆さん。

今回は、実務で死ぬほど使う「パーツモデルのマルチフォーマット一括エクスポート(バッチ変換)」をテーマにお届けします。

加工部門へ渡すための「STEP」「IGES」「PARASOLID」、そして3Dプリンターや解析用の「STL」。これらを1パーツずつ開いて、「名前を付けて保存」からフォーマットを選んで……なんて手作業、もう今夜で終わりにしにいきましょう。

ここをクリアすれば、SolidWorks VBAの「ファイル操作」と「APIの神髄」が一気に見えてきます。温かく、そして妥協のないプロの技を授けますね。ついてきてください!

1. なぜマクロの記録ではバッチ変換ができないのか?

まず最初に、皆さんが最初にハマる「罠」のお話をします。
SolidWorksの「マクロの記録」ボタンを押して、手動でSTEPファイルを保存してみてください。生成されたコードを見て絶望しませんでしたか?

‘ マクロの記録が吐き出す呪文の例
Dim boolstatus As Boolean
boolstatus = swModel.Extension.SaveAs2(“C:\Test\part1.step”, 0, 1, 0, 0, False, 0, 0, boolstatus)

これ、「開いているアクティブなドキュメントを特定のパスに保存する」ことしか記録できていないんです。
フォルダの中にある複数のパーツを次々と自動で開き、それぞれ最適な形式で、元のファイル名と同じ名前で別フォルダに吐き出していく――これをやるには、「ファイルシステム(VBAのファイル検索機能)」と「SolidWorks APIの適切なドキュメント制御」を組み合わせる必要があります。

2. 実戦投入!一括エクスポート・バッチスクリプト

前置きはこれくらいにして、現場でそのまま使える実用コードをドーンとプレゼントします。
VBAエディタ(Alt + F11)を開き、標準モジュールに貼り付けてみてください。

匠のコメント入り・完全版VBAコード

‘ ==============================================================================
‘ 担当アーキテクト特製:パーツ一括マルチフォーマット変換スクリプト
‘ 概要: 指定フォルダ内のすべてのSolidWorksパーツ(.sldprt)を読み込み、
‘ STEP, Parasolid, STL形式へサイレント(裏で)一括変換します。
‘ ==============================================================================
Sub BatchExportPartFiles()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim sourceFolder As String
Dim targetFolder As String
Dim fileName As String
Dim fileExtension As String
Dim lErrors As Long
Dim lWarnings As Long
Dim openedWithoutPrompt As Boolean

‘ 1. SolidWorks アプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If

‘ 2. フォルダパスの設定(※環境に合わせて書き換えてください)
sourceFolder = “C:\MySolidWorksData\SourceParts\”
targetFolder = “C:\MySolidWorksData\ExportedFiles\”

‘ ターゲットフォルダが存在しない場合は作成する簡易ガード
If Dir(targetFolder, vbDirectory) = “” Then
MkDir targetFolder
End If

‘ 3. フォルダ内のパーツファイル(.sldprt)を総ざらいするループ
fileName = Dir(sourceFolder & “.sldprt”)

If fileName = “” Then
MsgBox “対象となるパーツファイルが見つかりませんでした。”, vbExclamation, “確認”
Exit Sub
End If

‘ 画面描画をフリーズさせて処理速度を爆上げ(極限のパフォーマンス最適化)
swApp.Visible = True ‘ アプリ自体は消さないが
‘ swApp.UserControl = False ‘ 必要に応じて制御

Do While fileName <> “”
Dim fullSourcePath As String
fullSourcePath = sourceFolder & fileName

‘ ファイル名から拡張子を除いたベース名を取得 (“box.sldprt” -> “box”)
Dim baseName As String
baseName = Left(fileName, InStrRev(fileName, “.”) – 1)

‘ 4. ドキュメントのサイレントオープン(バックグラウンド処理)
‘ 引数: パス, ドキュメントタイプ(1=パーツ), 読み取り専用(True), etc.
Set swModel = swApp.OpenDoc6(fullSourcePath, swDocPART, swOpenDocOptions_Silent, “”, lErrors, lWarnings)

If Not swModel Is Nothing Then

‘ —————————————————-
‘ A. STEP形式 (.step / .stp) でのエクスポート
‘ —————————————————-
Dim stepPath As String
stepPath = targetFolder & baseName & “.step”
swModel.Extension.SaveAs2 stepPath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, “”, lErrors, lWarnings

‘ —————————————————-
‘ B. Parasolid形式 (.x_t) でのエクスポート(他CAD連携の王様)
‘ —————————————————-
Dim x_tPath As String
x_tPath = targetFolder & baseName & “.x_t”
swModel.Extension.SaveAs2 x_tPath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, “”, lErrors, lWarnings

‘ —————————————————-
‘ C. STL形式 (.stl) でのエクスポート(3Dプリンター・解析用)
‘ —————————————————-
Dim stlPath As String
stlPath = targetFolder & baseName & “.stl”
swModel.Extension.SaveAs2 stlPath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, “”, lErrors, lWarnings

‘ 5. メモリ解放:開いたドキュメントを確実に閉じる(超重要!)
swApp.CloseDoc fileName

Else
‘ 読み込み失敗時のログ出力など(今回はイミディエイト窓へ)
Debug.Print “【失敗】ファイルを開けませんでした: ” & fileName
End If

‘ 次のファイルへ
fileName = Dir()
Loop

‘ 完了通知
MsgBox “すべてのファイルのエクスポートが完了しました!”, vbInformation, “バッチ処理完了”
End Sub

3. コードのキモと「知っておくべきAPIの裏側」

このコードがなぜ「プロの書き方」なのか、初学者の皆さんにこっそり裏側を解説します。

① `OpenDoc6` と `swOpenDocOptions_Silent`

パーツを開くときに `OpenDoc` ではなく `OpenDoc6` を使っています。さらにオプションに `swOpenDocOptions_Silent` を渡しているのがポイント。
これにより、「参照ファイルが見つからないよ!」といったポップアップダイアログでマクロがフリーズする(止まってしまう)現象を完全に防ぎます。
自動化において、勝手にダイアログを出してユーザーのクリックを待つ挙動は「悪」です。完全自動化(Headlessに近い状態)を目指しましょう。

② `SaveAs2` メソッドの汎用性

SolidWorks APIには古い `SaveAs` も残っていますが、現在は拡張機能である `ModelDocExtension.SaveAs2` を使うのがモダンです。
第2引数に `swSaveAsCurrentVersion` を指定することで、現在のSolidWorksのバージョンで最適に保存してくれます。拡張子(`.step` `.x_t` `.stl`)を文字列としてパスに含めるだけで、SolidWorksが勝手にフォーマットを判別して変換してくれるという賢さを持っています。

③ メモリの掃除(`CloseDoc`)

ここが一番重要です。数千個のパーツをループで回すとき、開きっぱなしにするとどうなるか……?
そう、メモリリーク(RAMの暴走)を起こしてSolidWorksが盛大にクラッシュします。
処理が終わったら `swApp.CloseDoc fileName` で確実にメモリからドキュメントをアンロード(消去)してください。このライフサイクルの管理ができるかどうかが、プロとアマの分かれ道です。

4. 陥りやすいエラーと回避のテクニック

実際にこのスクリプトを動かすと、いくつかの「壁」にぶぶつかることがあります。先輩からの事前アドバイスです。

  • エラー:ファイル名に日本語(全角文字)が含まれていて保存に失敗する
  • 対策: VBAの標準関数(`Dir` や `MkDir`)は環境によって文字コードのトラブルが起きることがあります。Windowsのファイルパス操作には、極力半角英数字のフォルダを使うか、環境依存文字を混ぜないことがバッチ処理の鉄則です。
  • エラー:コンパイルエラー「ユーザー定義型は定義されていません」
  • 対策: `SldWorks.SldWorks` や `ModelDoc2` などの型を使っているのにこのエラーが出る場合、VBAの参照設定が抜けています。VBAエディタのメニュー「ツール」>「参照設定」から、`SldWorks 20xx Type Library` および `SolidWorks Constants 20xx Type Library` にチェックが入っているか確認してください。

さあ、定型作業から解放されよう

ここをクリアすれば、あなたはもう単なる「SolidWorksのオペレーター」ではありません。「設計プロセスをハックする自動化エンジニア」の仲間入りです。

退社前にこのマクロをポチッと押しておけば、翌朝には加工用の綺麗なSTEPやPARASOLIDの山が綺麗に整理されてあなたを待っています。この快感をぜひ、あなたの現場でも味わってみてください。

それでは、次回の極限の知見でお会いしましょう。良き自動化ライフを!

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