【入門編】【上級プロ】トランザクション管理(ModelDocExtension::StartCommand等に頼らない)によるアセンブリ一括構築のロールバック実装 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks VBAの世界へようこそ。
日々、膨大な数の部品を組み立てるアセンブリ作業に追われていませんか?「マクロの記録」を使って自動化を試みたものの、途中でエラーが起きてアセンブリがぐちゃぐちゃになり、泣く泣く最初からやり直した……そんな苦い経験を持つ方も多いはずです。

今回は、そんな地獄のような手戻りを完全に防ぐための「トランザクション管理によるアセンブリ一括構築とロールバック実装」について、魂を込めて解説します。

ここをクリアすれば、単なる「操作の自動化」を超えた、プロフェッショナルな堅牢性を持つシステム開発の領域に到達できます。優しく、そして深く噛み砕いてお伝えするので、一緒に頑張りましょう!

—

1. なぜ「マクロの記録」や画面操作の自動化ではダメなのか?

私たちが普段よく使う `ModelDocExtension::StartCommand` などのコマンド実行系メソッドは、いわば「人間の代わりにマウスをクリックしているだけ」の状態です。

これには以下のような致命的な弱点があります。

  • 画面描画やUIの状態に依存するため、処理が遅い。
  • 途中でエラー(部品が見つからない、合致の定義矛盾など)が起きたとき、画面がカオスな途中状態でフリーズする。
  • 「何が起きたか」をプログラム側で正確にキャッチして復旧するのが極めて困難。

プロのエンジニアが目指すべきは、UIを一切介さず、メモリ上(APIの裏側)でスマートにアセンブリを構築し、「失敗したら一瞬で何事もなかったかのように初期状態へ戻す(ロールバックする)」という、トランザクション管理です。

—

2. アセンブリ構築における「トランザクション」の正体

データベースの世界では「トランザクション(一連の処理がすべて成功するか、すべて無かったことにするか)」は常識ですが、SolidWorks VBAでもこれを実現できます。

SolidWorks APIには、新規ドキュメントを開く、部品を挿入する、合致を追加するといった操作を、ひとまとめの「セッション(またはファイル管理)」として捉え、異常検知時にファイルを保存せずに破棄する(あるいは変更を破棄して閉じる)というアプローチが可能です。

さらに高度な手法として、「仮想的なインメモリ構築を行い、最後にまとめて保存する。失敗したらファイル自体を閉じ、未保存として破棄する」という設計思想を取り入れます。

—

3. 【実践】安全にロールバックするアセンブリ構築アーキテクチャ

それでは、実際のVBAコードを見ていきましょう。
今回は、「複数の部品をアセンブリに読み込み、途中で意図しないエラー(例:存在しない部品の指定)が発生した際、アセンブリを保存せずに安全に破棄する」サンプルコードを作成しました。

開発現場でそのままコピペして、エラーハンドリングの骨組みとして活用してください。

Option Explicit

‘ メインエントリーポイント
Sub Main_SafeAssemblyBuilder()
Dim swApp As SldWorks.SldWorks
Dim swAssyDoc As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2
Dim newDocPath As String
Dim isSuccess As Boolean

‘ 初期化
Set swApp = Application.SldWorks
isSuccess = False

‘ 【重要】エラー発生時のジャンプ先を指定
On Error GoTo ErrorHandler

Debug.Print “=== アセンブリ構築トランザクション開始 ===”

‘ 1. 新規アセンブリドキュメントの作成(テンプレートなしで空の3D空間を作るイメージ)
‘ ※ 実際のパスは環境に合わせて変更してください
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\SolidWorks 2023\templates\アセンブリ.asmdot”, 0, 0, 0)

If swModel Is Nothing Then
Err.Raise 9999, “SafeBuilder”, “アセンブリドキュメントの新規作成に失敗しました。”
End If

Set swAssyDoc = swModel

‘ 2. 部品Aの挿入(シミュレーション)
Dim compA As SldWorks.Component2
Dim partPathA As String
partPathA = “C:\Parts\BasePlate.sldprt”

Debug.Print “部品Aを挿入中: ” & partPathA
Set compA = swAssyDoc.AddComponent5(partPathA, 0, “”, 0, 0, 0)

If compA Is Nothing Then
Err.Raise 10001, “SafeBuilder”, “部品Aの配置に失敗しました。ファイルパスを確認してください。”
End If

‘ — 【ここでわざとエラーを起こすテストをする場合コメントアウトを外す】 —
‘ Err.Raise 999, “Test”, “意図的なシステムエラー発生!”
‘ ————————————————————————

‘ 3. 部品Bの挿入 & 合致定義(本来はここで複雑な処理が続く)
Dim compB As SldWorks.Component2
Dim partPathB As String
partPathB = “C:\Parts\Pin.sldprt”

Debug.Print “部品Bを挿入中: ” & partPathB
Set compB = swAssyDoc.AddComponent5(partPathB, 0, “”, 0, 0, 0)

If compB Is Nothing Then
Err.Raise 10002, “SafeBuilder”, “部品Bの配置に失敗しました。”
End If

‘ すべての処理が成功した場合フラグを立てる
isSuccess = True
Debug.Print “=== アセンブリ構築トランザクション成功 ===”

Exit Sub

ErrorHandler:
‘ ==========================================
‘ 例外処理(ロールバック・安全な破棄)
‘ ==========================================
Debug.Print “!!! エラー発生のため、ロールバックを実行します !!!”
Debug.Print “エラー番号: ” & Err.Number & ” / 内容: ” & Err.Description

If Not swModel Is Nothing Then
‘ ドキュメントを「保存せず」に強制閉局(Discard Changes)
‘ 第1引数: False (変更を破棄して閉じる)
Dim docTitle As String
docTitle = swModel.GetTitle()
swApp.CloseDoc docTitle

Debug.Print “未保存の異常アセンブリを破棄し、メモリをクリーンアップしました。”
End If

MsgBox “アセンブリの構築中にエラーが発生したため、処理を中断し、初期状態にロールバックしました。” & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “トランザクション異常終了”

End Sub

—

4. コードの深掘り:なぜこの設計が優れているのか?

上記のコードには、プロのエンジニアとしてのこだわりが詰まっています。ポイントを3つに分けて解説します。

① `On Error GoTo` による一元管理

VBAの例外処理は時代遅れだと言われることもありますが、SolidWorks VBAのAPI操作においては、「予期せぬAPIの戻り値Nullやファイル欠損」に対して強力な防壁となります。
処理の途中でどこがコケても、必ず `ErrorHandler` ラベルに処理が吸い寄せられるため、「中途半端なアセンブリが開いたまま放置される」という悲劇を防げます。

② `swApp.CloseDoc` による変更破棄(ロールバック)

SolidWorksのAPIにおいて、最も確実なロールバックは「現在作業しているドキュメントを保存せずに閉じること」です。
コード中の `swApp.CloseDoc docTitle` は、ユーザーに「変更を保存しますか?」と聞くことなく、非表示または強制的にメモリからドキュメントを破棄します。これにより、PCやSolidWorksのセッション内にゴミデータを残しません。

③ 成功フラグ (`isSuccess`) の哲学

「エラーが起きなかったルート」を通った時だけ `isSuccess = True` にし、トランザクションが正常に完了した証とします。もし途中で `Err.Raise` が起これば、フラグは `False` のままエラーハンドラーへ直行します。非常にシンプルですが、バグを生まないための鉄則です。

—

まとめ:ここをクリアすれば、あなたはもう初心者ではない!

今回は、アセンブリ一括構築におけるトランザクション管理とロールバックの実装について解説しました。

  • 画面操作の自動化(StartCommand)に頼らない。
  • APIによるオブジェクト操作でスマートに構築する。
  • 万が一のエラー時は、未保存のままドキュメントを破棄して完全なロールバックを行う。

このアーキテクチャを自分の引き出しに持っているだけで、あなたが書くマクロの信頼性はプロのエンジニア水準へと一気に跳ね上がります。

「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!」
ぜひ、ご自身の開発環境でもこのトランザクション構造を取り入れて、ビクともしない堅牢な自動化ツールを作ってみてください。あなたのエンジニアライフを応援しています!

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