【SolidWorks VBA極意】数千部品のアセンブリを操る!プロ仕様の「進捗バー付き」自動生成術
こんにちは。SOLIDWORKSのAPI開発の世界へようこそ。
「マクロの記録」から卒業し、数分かかるような巨大なアセンブリ構築を自動化しようとすると、必ずぶつかる壁があります。それが「処理中のフリーズ問題」です。
画面が真っ白になり、SolidWorksが応答なしになる……。これではユーザーは不安でたまりませんよね。今回は、VBAのユーザーフォームを駆使して、まるでマルチスレッド処理のように「進捗状況をリアルタイムに表示する」プロフェッショナルの手法を伝授します。
—
1. なぜ「進捗表示」が難しいのか?
VBAは基本的に「シングルスレッド」です。つまり、マクロが計算や部品生成で忙しく動いている間、描画やクリックといった「UIの更新」は後回しにされます。
これを解決するための鍵は、`DoEvents`関数を適切に差し込むことです。これは「現在溜まっているOSの処理(画面の再描画など)を一度実行させる」という魔法の命令です。これを知るだけで、あなたのマクロは一気に「プロの道具」に進化します。
—
2. 実装の設計図:ユーザーフォームの準備
まずは進捗バー用のUIを構築しましょう。
1. VBE(Visual Basic Editor)を開く(Alt + F11)。
2. 挿入 > ユーザーフォーム を選択。
3. フォームに `Label` を配置し、名前を `lblProgress` に変更します。
4. フォーム上に `Frame` を配置し、その中に別の `Label`(背景色を青色にする)を配置します。これが進捗バー(`lblBar`)になります。
—
3. 実践コード:アセンブリ生成のエンジン
それでは、メインの処理コードを書いていきましょう。ここでは、部品をループで配置する処理を模した実装例を紹介します。
‘ メイン処理を実行する標準モジュール
Sub BuildAssemblyAutomated()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim i As Integer, totalParts As Integer
Set swApp = Application.SldWorks
Set swAssy = swApp.NewDocument(“アセンブリテンプレートのパス”, 0, 0, 0)
totalParts = 50 ‘ 今回の処理数
‘ 進捗フォームを表示(モーダルなしで表示するのがコツ)
Load UserForm1
UserForm1.Show vbModeless
For i = 1 To totalParts
‘ — ここに部品配置や合致(Mate)の処理を記述 —
‘ 例: swAssy.AddComponent6(…)
‘ 処理の重い計算の後に必ず差し込む
Call UpdateProgress(i, totalParts)
‘ SOLIDWORKSの描画を更新し、操作を受け付ける
DoEvents
Next i
Unload UserForm1
MsgBox “アセンブリ構築が完了しました!”
End Sub
‘ フォームを制御するサブルーチン
Public Sub UpdateProgress(current As Integer, total As Integer)
Dim percent As Double
percent = current / total
‘ 進捗バーの幅を変更(Frameの幅を最大とする)
UserForm1.lblBar.Width = UserForm1.Frame1.Width percent
UserForm1.lblProgress.Caption = “処理中: ” & Int(percent 100) & “%”
‘ 描画の強制更新
UserForm1.Repaint
End Sub
—
4. プロが教える「陥りやすい罠」と対策
① `vbModeless` の重要性
`UserForm1.Show` の後に `vbModeless` を付け忘れると、フォームが表示されている間、SolidWorks側を操作できなくなります。必ず「モードレス(非モーダル)」で呼び出してください。
② `DoEvents` の乱用は禁物
`DoEvents` は強力ですが、ループの回数が数万回に及ぶ場合、ループのたびに実行すると処理速度が著しく低下します。「10回に1回呼び出す」といった間引き処理を入れるのが、パフォーマンスを維持するエンジニアの気遣いです。
③ エラーハンドリングの欠如
アセンブリ構築中にファイルが見つからないなどのエラーが起きると、フォームが開きっぱなしになることがあります。
On Error GoTo Cleanup
‘ … 処理 …
Cleanup:
Unload UserForm1
‘ エラー処理
このように、`Cleanup` ラベルでフォームを確実に閉じる設計を徹底しましょう。
—
最後に:自動化の先にあるもの
いかがでしたか?`DoEvents` を使いこなし、進捗を可視化することで、あなたの作るマクロは単なる「作業短縮ツール」から「業務を円滑にするシステム」へと昇華します。
最初は難しく感じるかもしれませんが、この「ユーザー体験(UX)を意識した設計」ができるエンジニアは非常に貴重です。ぜひ、今日からあなたのコードにこの「命」を吹き込んでみてください。
ここをクリアすれば、あなたはもう立派なSOLIDWORKS API開発者です。応援していますよ!
