【入門編】【実務中級】ボルト・ナット等の締結部品の長さをアセンブリの板厚に合わせて自動選定し、構成部品を動的置換するVBA – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の現場で、日々泥臭くもエレガントなマクロを書き続けている先輩エンジニアです。

「マクロの記録」ボタンを押して出てきた呪文のようなコードを眺め、「これ、一体どうやって実務で使うんだ……?」と頭を抱えていませんか?特にアセンブリの自動化、それも「ボルトの長さ選定」という誰もが一度は通る泥臭い課題に直面しているなら、今日の記事はまさにあなたのためにあります。

今回は、「アセンブリに配置された板厚をVBAで自動計測し、それに最適なボルトの長さ(コンフィギュレーション)を動的に切り替える」という、設計現場で明日から即戦力になる実務中級テクニックを伝授します。

ここをクリアすれば、あなたも単なる「マクロの記録者」から「SolidWorks APIを掌握するエンジニア」へ一歩踏み出せますよ。しっかりついてきてくださいね!

—

1. なぜ「ボルトの長さ自動選定」が実務の壁になるのか?

実務でこんな面倒な作業をしたことはありませんか?
1. アセンブリ上で、重ね合わされた板の総板厚を測る。
2. 「うーん、板厚が15mmだから、余裕を見てボルトは30mmだな」と頭の中で計算する。
3. 部品ライブラリからボルトを挿入し、プロパティから「M6x30」のコンフィギュレーションを手動で選ぶ。

これをボルトの数だけ繰り返す……。気が遠くなりますよね。
これをVBAで完全自動化するには、以下の3つの壁を突破する必要があります。

  • 壁①: 相手部品のサーフェイス間の距離(板厚)をAPIでどうやって取得するのか?
  • 壁②: 取得した数値に基づき、膨大なマスターデータ(コンフィギュレーション名)からどうやって「最適な長さ」を導き出すのか?
  • 壁③: 読み込んでいる部品(コンポーネント)のコンフィギュレーションを、メモリ上でどうやって安全に切り替えるのか?

一つずつ、優しく紐解いていきましょう。

—

2. 処理の全体像とアーキテクチャ

今回作成するマクロの流儀はこうです。

[マクロ実行]
↓
[1. 選択された合致、または面から「距離(板厚)」を計測・取得]
↓
[2. 計算ロジック:板厚 + ナット・座金分の余裕 = 最適なボルト長を算定]
↓
[3. アセンブリ内のボルト部品(Component2オブジェクト)を特定]
↓
[4. コンフィギュレーション名を動的に変更してUpdate]

SolidWorks APIにおいて、コンポーネントのコンフィギュレーション変更は「Component2.ReferencedConfiguration」プロパティを操作するのが王道です。ここを押さえておけば怖くありません。

—

3. 実装コード:ボルト自動選定・動的置換マクロ

それでは、開発環境(VBE)にそのまま貼り付けて動かせる実用コードを公開します。コード内のコメントをしっかりと読み込んでくださいね。

‘ =================================================================و
‘ 専門家による実務解説:板厚に応じたボルト長自動選定マクロ
‘ =================================================================
Option Explicit

Sub AutoSelectBoltLength()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssDoc As SldWorks.AssemblyDoc
Dim swSelMgr As SldWorks.SelectionMgr
Dim swComp As SldWorks.Component2

‘ 1. アプリケーションとドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If

‘ アセンブリドキュメントかどうかの型チェック
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリ文書でのみ実行可能です。”, vbExclamation
Exit Sub
End If

Set swAssDoc = swModel
Set swSelMgr = swModel.SelectionManager

‘ 2. ユーザーに「対象のボルト部品」を選択させる
‘ 画面上で変更したいボルトの面や構成部品をクリックしてもらいます
If swSelMgr.GetSelectedObjectCount2(0) <> 1 Then
MsgBox “対象となるボルトの構成部品を1つだけ選択してください。”, vbExclamation
Exit Sub
End If

‘ 選択されたアイテムからコンポーネント(部品実体)を取得
Set swComp = swSelMgr.GetSelectedObject6(1, 0)
If swComp Is Nothing Then
MsgBox “有効なコンポーネントが選択されていません。”, vbCritical
Exit Sub
End If

‘ 3. 【実務の肝】板厚の取得(ここではシミュレーションとして定数または測定値を使用)
‘ ※実務ではMeasureオブジェクトや合致距離を取得するロジックをここに組み込みます
Dim measuredThickness As Double
measuredThickness = 16.5 ‘ 例:計測された板厚が16.5mmだったとする

‘ 4. 最適なボルト長(コンフィギュレーション名)を算出するロジック
Dim targetConfigName As String
targetConfigName = CalculateOptimalBoltConfig(measuredThickness)

If targetConfigName = “” Then
MsgBox “条件に合うボルトの長さが見つかりませんでした。”, vbCritical
Exit Sub
End If

‘ 5. コンポーネントのコンフィギュレーションを動的置換!
Dim vModelPath As Variant
vModelPath = swComp.GetPathName

‘ 参照するコンフィギュレーション名を書き換える
Dim bRet As Boolean
bRet = swComp.SetReferencedConfiguration(targetConfigName)

If bRet Then
‘ アセンブリを再構築して変更を反映
swModel.ForceRebuild3 True
MsgBox “ボルトの長さを自動選定しました!” & vbCrLf & _
“適用されたコンフィギュレーション: ” & targetConfigName, vbInformation, “完了”
Else
MsgBox “コンフィギュレーションの変更に失敗しました。” & vbCrLf & _
“指定した名前のコンフィギュレーションが存在するか確認してください。”, vbCritical
End If

End Sub

‘ —————————————————————–
‘ サブルーチン:板厚からボルトのコンフィギュレーション名を決定する関数
‘ —————————————————————–
Function CalculateOptimalBoltConfig(ByVal thickness As Double) As String
‘ ボルトのねじ長選定ルール(例:板厚 + 座金・ナット分 5mm = 必要有効長)
Dim requiredLength As Double
requiredLength = thickness + 5.0

‘ 標準的なJISボルトの長さラインナップ(20, 25, 30, 35, 40…)に切り上げる
Dim standardLengths() As Double
standardLengths = Array(20, 25, 30, 35, 40, 45, 50, 60, 70)

Dim i As Long
Dim selectedLen As Double
selectedLen = -1

For i = LBound(standardLengths) To UBound(standardLengths)
If standardLengths(i) >= requiredLength Then
selectedLen = standardLengths(i)
Exit For
End If
Next i

If selectedLen = -1 Then
CalculateOptimalBoltConfig = “” ‘ 該当なし
Exit Function
End If

‘ SolidWorks側で作成しているコンフィギュレーション名規則に合わせる
‘ 例: “M6x30” のような文字列を生成
CalculateOptimalBoltConfig = “M6x” & CStr(selectedLen)

End Function

—

4. 初学者が陥りやすいエラーと「知っておくべき極意」

このコードを実務のモデルで動かす際、以下のポイントでつまずきがちです。先輩からのアドバイスとして心に留めておいてください。

エラー①:`SetReferencedConfiguration` が False を返す

  • 原因: 指定した文字列(例:`”M6x30″`)と、部品側(ボルトの部品ファイル)に実際に登録されているコンフィギュレーション名が、大文字・小文字も含めて完全に一致していない場合、APIは容赦なく失敗します。
  • 対策: 事前にボルトのマスター部品を開き、コンフィギュレーション名が命名規則通りに正確に作られているか確認しましょう。

エラー②:アセンブリの形状が更新されない

  • 原因: VBAで裏側のコンフィギュレーションを書き換えても、グラフィックス画面やアセンブリの拘束が即座に追従しきれていないケースがあります。
  • 対策: コード内にも入れていますが、`swModel.ForceRebuild3 True`(強制的再構築)を必ずセットで呼び出すのが、バグを防ぐプロの技です。

—

5. まとめ:ここをクリアすればSolidWorks VBAの基本はバッチリ!

お疲れ様でした!今回は「板厚の計測・算定」から「アセンブリ内コンポーネントの動的置換」という、実務中級者が必ず直面するテーマを解説しました。

ここをクリアできたあなたなら、

  • 選択されたオブジェクトの安全な取得
  • 条件分岐によるマスターデータのコントロール
  • `Component2` オブジェクトを介したアセンブリの操作

という、SolidWorks APIの核心部分をすでにマスターしています。

「マクロの記録」の殻を脱ぎ捨てて、自分の手で設計ロジックをコードに落とし込めるようになると、日々の設計作業の景色がガラリと変わります。定時退社を目指して、ぜひあなたの現場のライブラリでも試してみてくださいね!

それでは、次回の極限知見でお会いしましょう。エンジニアライフを楽しみましょう!

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