【入門編】【上級プロ】アセンブリ構築プロセス全体を安全に巻き戻すカスタムトランザクション管理と、例外発生時の自動ロールバック実装 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAの極意:アセンブリ構築を「失敗させない」ためのトランザクション管理

こんにちは。SolidWorksの自動化の世界へようこそ。

「マクロの記録」で生成されたコードをそのまま動かして、途中でエラーが出てアセンブリが中途半端な状態で止まり、手動で削除してやり直した……そんな経験はありませんか?

プロの現場では、「途中で失敗したら、何事もなかったかのように綺麗に消し去る」というトランザクション管理が不可欠です。今日は、アセンブリ構築の自動化を「趣味のスクリプト」から「堅牢なエンジニアリングツール」へ昇華させるための、極限の知見を授けましょう。

—

なぜ「中途半端な状態」が危険なのか?

SolidWorksのAPIは、実行した操作を一つずつ積み上げていきます。もし、10個の部品を配置し、9個目でエラーが起きたとき、そのまま放置すると「8個まで配置された汚れたアセンブリ」が残ります。

これを避けるための鍵が、「コマンドのグループ化(Undo管理)」と「エラーハンドリングの徹底」です。

—

ステップ1:コマンドを「一つの操作」として閉じ込める

SolidWorksには、複数のAPI操作を1つの「Undo(元に戻す)」操作として登録する機能があります。これを使えば、たとえ途中でクラッシュしても、ユーザーは「Ctrl + Z」を一度押すだけで、マクロ開始前の状態まで一瞬で巻き戻せます。

‘ 【重要】処理の開始と終了をグループ化する
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ 操作をひとまとめにするためのIDを発行
swModel.Extension.StartCommandGroup “Assembly_Automation_Task”

On Error GoTo ErrorHandler

‘ — ここに部品配置や合致のロジックを書く —

‘ 正常終了したらグループを閉じる
swModel.Extension.FinishCommandGroup “Assembly_Automation_Task”
Exit Sub

ErrorHandler:
‘ エラーが発生したら、ここですべてを「なかったこと」にする
MsgBox “エラーが発生しました。状態をロールバックします。”
swModel.Extension.CancelCommandGroup “Assembly_Automation_Task”
End Sub

—

ステップ2:例外発生時に安全に復元する「ロールバック実装」

単に `CancelCommandGroup` するだけでは不十分な場合があります。アセンブリから部品を削除したはずが残っていたり、ファイルがロックされたままになったりするからです。

プロは、「最後に作成された構成部品のIDを追跡し、エラー時に明示的に削除する」という二段構えの防衛策をとります。

実践的アセンブリ構築コード

Sub AutoAssembleComponents()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim componentList As Collection
Set componentList = New Collection

‘ トランザクション開始
swModel.Extension.StartCommandGroup “SmartAssemble”

On Error GoTo RobustRollback

‘ 部品を配置するループ(例)
Dim i As Integer
For i = 1 To 3
‘ コンポーネントを追加
Set swComp = swAssy.AddComponent(“C:\Parts\Part” & i & “.SLDPRT”, “”, 0, 0, 0)

‘ 成功した部品をリストに追加しておく
componentList.Add swComp.Name2
Next i

swModel.Extension.FinishCommandGroup “SmartAssemble”
Exit Sub

RobustRollback:
‘ — エラー発生時のクリーンアップ —
swModel.Extension.CancelCommandGroup “SmartAssemble”

‘ リストにある部品を全て削除して「完全な初期状態」へ戻す
Dim compName As Variant
For Each compName In componentList
swAssy.DeleteComponent compName
Next compName

MsgBox “構築に失敗しました。アセンブリはクリーンな状態に復元されました。”
End Sub

—

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

1. オブジェクトの解放忘れ: `Set swComp = Nothing` を怠ると、メモリリークが発生し、SolidWorks自体が不安定になります。`ErrorHandler` 内でも必ずオブジェクトの解放を行いましょう。
2. 画面更新の無視: `swApp.Visible = True` のまま大量の部品を動かすと、描画負荷でタイムアウトします。構築中は `swApp.Frame.KeepAlive = False` などの工夫が必要です。
3. ファイルパスの依存: `C:\…` と直書きするのはNGです。必ず「部品が存在するか」を `Dir()` 関数でチェックしてから処理を始めましょう。これができるだけで、マクロの堅牢性は劇的に向上します。

—

最後に:自動化の真髄

「マクロが動いた!」と喜ぶのは、まだ入り口です。
プロのエンジニアが作るマクロは、「動くこと」以上に「失敗した時にどう振る舞うか」が洗練されています。

今回紹介したトランザクション管理とロールバックの仕組みをあなたのコードに組み込めば、もう「やり直し」に時間を奪われることはありません。

さあ、恐れることはありません。SolidWorksのAPIという広大な海を、安全な航海術で渡っていきましょう。何か不明点があれば、いつでも聞いてくださいね。応援しています。

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