SolidWorks APIの真髄:アセンブリ自動バックアップから学ぶ「堅牢なVBA設計」
SolidWorksの業務自動化において、最も初歩的でありながら、最も軽視されがちなのが「ファイル操作」です。ただ保存するだけのコードを書くのは簡単です。しかし、「異常終了のリスクを排除し、他環境でも破綻しないコード」を書けるエンジニアは極めて稀です。
今回は、実務で即戦力となる「アセンブリ自動バックアップツール」の設計を通して、SolidWorks VBAの背骨となる堅牢なコーディング作法を授けます。
—
1. なぜ「手抜きコード」が現場を破壊するのか
初心者が書きがちなコードには、以下の「3つの罪」が潜んでいます。
1. 絶対パスのハードコード: `C:\Users\Name\…` と書いた瞬間に、そのツールはあなたのPC以外で動きません。
2. エラーハンドリングの欠如: ファイルが読み取り専用だったり、パスが長すぎたりする場合に、無言でクラッシュします。
3. オブジェクトの解放漏れ: `SldWorks`や`ModelDoc2`の参照を明示的にクリアしないため、メモリリークが蓄積し、SolidWorks自体が不安定になります。
これらを排除し、プロフェッショナルな設計へと昇華させましょう。
—
2. 実装コード:プロダクションレベルのバックアップ機能
以下のコードは、現在開いているアセンブリのパスを解析し、`Backup`フォルダへ現在日時を付与して保存するものです。
Option Explicit
‘ メインプロシージャ:実行の起点
Sub CreateAssemblyBackup()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim docPath As String
Dim backupDir As String
Dim fileName As String
Dim newFilePath As String
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 1. ドキュメントが開かれているか確認
If swModel Is Nothing Then
MsgBox “アセンブリが開かれていません。”, vbCritical
Exit Sub
End If
‘ 2. ファイルパスの取得と保存済みチェック
docPath = swModel.GetPathName
If docPath = “” Then
MsgBox “未保存のアセンブリはバックアップできません。”, vbExclamation
Exit Sub
End If
‘ 3. バックアップ先ディレクトリの生成(存在しなければ作成)
backupDir = Left(docPath, InStrRev(docPath, “\”)) & “Backup\”
If Dir(backupDir, vbDirectory) = “” Then MkDir backupDir
‘ 4. ファイル名の構築(日時付与)
fileName = Left(swModel.GetTitle, InStrRev(swModel.GetTitle, “.”) – 1)
newFilePath = backupDir & fileName & “_” & Format(Now, “yyyymmdd_HHnnss”) & “.SLDASM”
‘ 5. 安全な保存処理
On Error GoTo ErrorHandler
swModel.SaveAs3 newFilePath, 0, 0
MsgBox “バックアップ完了: ” & vbCrLf & newFilePath, vbInformation
‘ オブジェクトのクリーンアップ
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
3. この設計の「アーキテクト的こだわり」
パスの動的解決
`Left(docPath, InStrRev(docPath, “\”))` を使用することで、ファイルがどのドライブ、どの階層にあっても、常にその親ディレクトリを基準にバックアップ先を構築します。これにより、プロジェクトフォルダを丸ごとコピーして別環境に移動しても、コードを一切修正することなく動作します。
命名規則による衝突回避
ファイル名に `Format(Now, “yyyymmdd_HHnnss”)` を付与するのは定石ですが、これは「上書きエラー」を回避するだけでなく、後から設計履歴を追跡する際に最強の武器になります。 データベースを持たない小規模な開発環境において、ファイル名それ自体をタイムスタンプで管理することは、最もコストパフォーマンスの高い構成管理手法です。
守りのプログラミング(防御的設計)
`On Error GoTo` を活用し、予期せぬファイルロックやアクセス権限エラーをキャッチしています。業務ツールにおいて最も罪深いのは「何が起きたかわからない停止」です。エラー内容をメッセージボックスで返すだけで、トラブルシューティングの時間は劇的に短縮されます。
—
4. 最後に:現場で生き残るために
このコードをベースに、さらに拡張していくならば、「フォルダ作成を別関数に切り出す」「バックアップ世代管理(古いファイルを削除する)を追加する」といった機能が必要になるでしょう。
しかし、まずは「動くものを、壊れにくい形で実装する」ことが先決です。
SolidWorks APIは強力な武器ですが、同時に繊細なエンジンでもあります。メモリを解放し、パスを動的に扱い、エラーを握りつぶさない。この作法さえ守れば、あなたの自動化ツールは、何年先も現場で信頼される「資産」となるはずです。
さあ、コードを書いて、自分自身の時間を創り出してください。
