【実務中級】SolidWorks VBAでアセンブリのカスタムプロパティを自動監査!製造工程へのデータ連携をスムーズにするバリデーションマクロ
皆さん、こんにちは!SolidWorks VBAの世界へようこそ。伝説の業務自動化エンジニアとして、皆さんが日々の業務を劇的に効率化するお手伝いをさせていただきます。
今回は、製造現場へのデータ連携で「あれ?この部品、材料情報が設定されてないぞ!」なんて経験をしたことがある方、必見のテーマです。アセンブリ内の各パーツに設定されている「材料」や「仕上げ」といったカスタムプロパティが、すべて正しく入力されているかをVBAで自動監査するバリデーションマクロを作成します。
このマクロを使いこなせば、製造工程へデータを渡す前に、必須のカスタムプロパティがすべての部品に正しく入力されているかを自動でチェックし、未入力項目がある場合は該当部品をハイライト(色付け)で通知することができます。まるで、あなたのSolidWorksアセンブリに「優秀な品質管理者」を配置するようなイメージですね!
なぜカスタムプロパティのバリデーションが重要なのか?
SolidWorksで作成したモデルデータは、図面作成、CAM加工、部品表(BOM)作成、さらにはPLM(Product Lifecycle Management)システムへの連携など、様々な後工程で利用されます。これらの後工程では、モデルに設定されたカスタムプロパティ(材料、仕上げ、担当者、部品番号など)が、そのままデータとして利用されることがほとんどです。
もし、アセンブリ内のどこかの部品で、これらの重要なカスタムプロパティが入力されていなかったらどうなるでしょうか?
- 図面作成: 材料情報が抜けているため、図面に正確な情報が記載できません。
- CAM加工: 材料情報がないと、適切な切削条件を設定できず、加工不良や工具の破損につながる可能性があります。
- 部品表(BOM): 材料や仕上げが抜けていると、正確な部品表が作成できず、購買や在庫管理に混乱が生じます。
- PLM連携: データ不整合により、システムへの取り込みが失敗したり、誤った情報が登録されたりします。
このように、たった一つのカスタムプロパティの未入力が、製造プロセス全体に大きな影響を与えかねないのです。だからこそ、設計段階でこれらの情報を正確に入力し、さらに自動でチェックする仕組みが非常に重要になるわけです。
マクロ作成の前に:SolidWorks VBAの基本をおさらい
さて、本題に入る前に、SolidWorks VBAの基本的な考え方と、今回使うであろうオブジェクトについて簡単に触れておきましょう。マクロの記録機能から一歩進んで、自分でコードを書くための土台作りです。
SolidWorks VBAで扱う主要なオブジェクト
SolidWorks VBAは、SolidWorksの機能を操作するための「オブジェクト」というものを使います。これらのオブジェクトは、SolidWorksの各要素(ドキュメント、アセンブリ、パーツ、フィーチャー、プロパティなど)に対応しています。
- `SldWorks`: SolidWorksアプリケーションそのものを表すオブジェクトです。マクロの出発点となります。
- `ModelDoc2`: 現在開いているSolidWorksドキュメント(パート、アセンブリ、図面)を表すオブジェクトです。
- `AssemblyDoc`: アセンブリドキュメントに特化したオブジェクトです。アセンブリ内のコンポーネント(パーツやサブアセンブリ)を操作する際に必要になります。
- `Component2`: アセンブリ内の個々のコンポーネント(パーツやサブアセンブリ)を表すオブジェクトです。これを使って、各パーツの情報を取得したり、操作したりします。
- `CustomPropertyManager`: モデルのカスタムプロパティを管理するためのオブジェクトです。プロパティの追加、取得、削除などを行います。
これらのオブジェクトを、ドット (`.`) で繋げていくことで、目的の機能にアクセスしていきます。例えば、`ActiveDoc` プロパティで現在アクティブなドキュメントを取得し、そこからアセンブリドキュメントを取得したり、コンポーネントを取得したりします。
VBAコードの基本的な構造
VBAのコードは、`Sub` (Subroutine) または `Function` というプロシージャ(手続き)の中に記述されます。
Sub MyMacro()
‘ ここに実行したい処理を記述します
MsgBox “Hello, SolidWorks VBA!”
End Sub
- `Sub MyMacro()`: `MyMacro` という名前のサブルーチンを開始します。
- `’ ここに実行したい処理を記述します`: `’` で始まる行はコメントです。コードの解説などを書くのに使います。
- `MsgBox “Hello, SolidWorks VBA!”`: 画面にメッセージボックスを表示する命令です。
- `End Sub`: サブルーチンを終了します。
コードの実行方法
1. SolidWorksを開きます。
2. [ツール] > [マクロ] > [編集] を選択します。
3. 表示されたVisual Basicエディタ(VBE)で、[挿入] > [標準モジュール] を選択し、新しいモジュールを作成します。
4. 作成したモジュールに上記のコードを貼り付けます。
5. SolidWorksに戻り、[ツール] > [マクロ] > [実行] を選択し、作成したマクロ(例: `MyMacro`)を実行します。
いよいよ本題!カスタムプロパティバリデーションマクロの作成
ここからが本番です。アセンブリ内の各パーツのカスタムプロパティをチェックし、未入力項目があればハイライトするマクロを作成していきましょう。
マクロの概要と目指すゴール
今回作成するマクロの主な機能は以下の通りです。
1. 現在開いているSolidWorksドキュメントがアセンブリファイルであることを確認する。
2. アセンブリを構成するすべてのコンポーネント(パーツ)をリストアップする。
3. 各コンポーネントに対して、指定したカスタムプロパティ(例:「材料」「仕上げ」)が設定されているかを確認する。
4. カスタムプロパティが未入力のコンポーネントがあれば、そのコンポーネントをハイライト(色を付ける)する。
5. 全体の結果をメッセージボックスで報告する。
コード例と解説
それでは、具体的なVBAコードを見ていきましょう。
Option Explicit ‘ 変数宣言を強制する(重要!)
Sub ValidateAssemblyCustomProperties()
Dim swApp As SldWorks
Dim swModel As ModelDoc2
Dim swAssembly As AssemblyDoc
Dim vComponents As Variant
Dim swComponent As Component2
Dim swCustPropMgr As CustomPropertyManager
Dim propValue As String
Dim propName As String
Dim sPartPath As String
Dim i As Integer
Dim bFoundMissing As Boolean
Dim missingProperties As String
‘ 1. SolidWorksアプリケーションとアクティブドキュメントを取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントが開かれていない、またはアセンブリでない場合は終了
If swModel Is Nothing Then
MsgBox “SolidWorksドキュメントが開かれていません。”, vbExclamation
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリファイルでのみ実行できます。”, vbExclamation
Exit Sub
End If
Set swAssembly = swModel ‘ アセンブリドキュメントとしてキャスト
‘ 2. アセンブリ内のコンポーネントを取得
vComponents = swAssembly.GetComponents(True) ‘ Trueは再帰的に(サブアセンブリも含む)
If IsEmpty(vComponents) Then
MsgBox “アセンブリにコンポーネントが見つかりませんでした。”, vbInformation
Exit Sub
End If
‘ 3. チェックしたいカスタムプロパティ名を配列で定義
‘ ここで、バリデーションしたいプロパティ名を列挙します。
‘ 例: “材料”, “仕上げ”, “部品番号” など
Dim requiredProperties() As Variant
requiredProperties = Array(“材料”, “仕上げ”) ‘ 例として「材料」と「仕上げ」を設定
bFoundMissing = False ‘ 未入力が見つかったかどうかを示すフラグ
missingProperties = “” ‘ 未入力プロパティのリストを格納する変数
‘ 4. 各コンポーネントをループ処理
For i = 0 To UBound(vComponents)
Set swComponent = vComponents(i)
‘ コンポーネントのモデルドキュメントを取得
‘ (パーツファイルへのパスを取得)
sPartPath = swComponent.GetPathName
‘ コンポーネントが外部ファイルを参照している場合のみ処理
If sPartPath <> “” Then
Dim swPartDoc As ModelDoc2
‘ パーツドキュメントを開かずにカスタムプロパティを取得したい場合
‘ (パフォーマンス向上のため)
‘ ただし、パーツがリンク切れの場合などはエラーになる可能性があるので注意
‘ より安全なのは、パーツを開いてからプロパティを取得する方法ですが、
‘ 大規模アセンブリでは処理に時間がかかることがあります。
‘ ここでは、パーツを開かずに取得する例を示します。
‘ Set swPartDoc = swApp.OpenDoc6(sPartPath, swDocPART, swOpenDocOptions_Silent, “”, 0, 0)
‘ Set swCustPropMgr = swPartDoc.Extension.CustomPropertyManager(“”)
‘ パーツファイルから直接カスタムプロパティマネージャーを取得 (より効率的)
‘ 注: この方法は、パーツファイルが破損していない、またはリンク切れでないことが前提です。
Set swCustPropMgr = swApp.GetCustomPropertyManager(sPartPath)
‘ 5. 指定したカスタムプロパティを一つずつチェック
Dim prop As Variant
For Each prop In requiredProperties
propName = CStr(prop) ‘ プロパティ名を文字列に変換
‘ カスタムプロパティの値を取得
‘ vb & vbNullString は、プロパティが存在しない場合にエラーにならないようにするためのトリックです。
propValue = swCustPropMgr.Get(propName, vbNullString)
‘ プロパティ値が空(未入力)かチェック
If Trim(propValue) = “” Then
‘ 未入力が見つかった場合
bFoundMissing = True
missingProperties = missingProperties & “- ” & swComponent.Name2 & ” (プロパティ: ‘” & propName & “‘)\n”
‘ ここでコンポーネントをハイライトする処理を追加
‘ コンポーネントに色を付ける(例:黄色)
‘ 注意: この操作は、アセンブリの表示状態を変更します。
‘ 元に戻す処理を別途考慮するか、ユーザーに確認を促すのが親切です。
‘ 簡単な例として、コンポーネントの表示色を変更します。
‘ 実際には、より洗練されたハイライト方法(例:一時的な表示設定の変更)を検討することも可能です。
‘ コンポーネントの表示色を変更する(例:黄色)
‘ 既存の表示設定を取得して、それを変更してから元に戻すのが理想ですが、
‘ ここでは簡略化して直接設定します。
‘ 実際には、SetDisplayColor メソッドで色を設定し、
‘ AfterConfigurationChange イベントなどで元に戻す処理を実装すると良いでしょう。
‘ ※注意:コンポーネントの表示色変更は、アセンブリの見た目を直接変えます。
‘ 元に戻す処理を実装しないと、意図しない表示になる可能性があります。
‘ ここでは、デモンストレーションのために、コンポーネントの選択状態を
‘ 強制的に変更する(実質的なハイライト)方法に留めます。
‘ もし色を付けたい場合は、以下のコメントアウトされた行を参考にしてください。
‘ swComponent.SetDisplayColor swComponent.GetConfigurationName(swComponent.GetActiveConfiguration), Array(1#, 1#, 0#) ‘ 黄色 (R, G, B)
‘ パーツファイルを開き直して、ハイライト表示させる方法もあります。
‘ Dim swPart As ModelDoc2
‘ Set swPart = swApp.OpenDoc6(sPartPath, swDocPART, swOpenDocOptions_Silent, “”, 0, 0)
‘ If Not swPart Is Nothing Then
‘ ‘ パーツファイル内でハイライト表示させる処理 (例: 特定のフィーチャーを非表示にするなど)
‘ ‘ swPart.Extension.SelectByID2 “フィーチャー名”, “FEAT”, 0, 0, 0, False, 0, Nothing, 0
‘ ‘ swPart.EditDisplay(swDisplaySolid) ‘ 表示モード変更など
‘ ‘ swApp.CloseDoc swPart.GetTitle ‘ 閉じます
‘ End If
‘ より簡単なハイライト方法として、コンポーネントを選択状態にする
‘ (これは一時的なもので、他の操作で解除されます)
‘ swComponent.Select True, Nothing ‘ Trueで選択、Nothingで選択解除のコールバックなし
‘ ユーザーに未入力のパーツを特定させるために、リストアップするだけでも十分な情報となります。
‘ 強制的なハイライトは、ユーザーの意図しない結果を招く可能性もあるため、
‘ ここではリストアップに留め、必要に応じてユーザーが手動で確認できるようにします。
‘ Exit For ‘ 一つのコンポーネントで複数のプロパティが未入力でも、
‘ ‘ そのコンポーネントのチェックは一旦終了し、次のコンポーネントへ。
‘ ‘ (もし、一つのコンポーネントで複数の未入力プロパティをすべて検出したい場合は、この Exit For を削除してください)
End If
Next prop
Else
‘ コンポーネントが外部ファイルを参照していない場合(例: 仮想コンポーネント、またはインポートされたジオメトリなど)
‘ 必要に応じて、これらのコンポーネントに対する処理を追加します。
‘ 例: “このコンポーネントは外部ファイルではありません。カスタムプロパティのチェック対象外です。”
‘ Debug.Print “Skipping virtual component or imported geometry: ” & swComponent.Name2
End If
‘ 処理中のコンポーネントの解放 (メモリリーク防止のため)
Set swCustPropMgr = Nothing
Set swComponent = Nothing
Next i
‘ 6. 結果の報告
If bFoundMissing Then
Dim msg As String
msg = “以下のコンポーネントでカスタムプロパティの未入力が見つかりました:\n\n” & missingProperties & vbCrLf & “ご確認ください。”
MsgBox msg, vbCritical, “カスタムプロパティバリデーション結果”
Else
MsgBox “すべてのコンポーネントで、指定されたカスタムプロパティが正しく設定されています。”, vbInformation, “カスタムプロパティバリデーション結果”
End If
‘ オブジェクトの解放
Set swAssembly = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
コードの各部分を詳しく見てみましょう
`Option Explicit`
Option Explicit
これはVBAの最も基本的な、しかし非常に重要な設定です。これをコードの先頭に書くことで、宣言されていない変数の使用を禁止します。
- なぜ重要か?:
- タイポ(入力ミス)によるエラーを防ぐ: 変数名を間違って入力した場合、「未宣言の変数」としてエラーが表示されます。例えば `swApp` を `swAapp` と間違えても、`Option Explicit` があればすぐに気づけます。
- コードの可読性と保守性を向上させる: どの変数が何のために使われているのかが明確になります。
- パフォーマンスの向上: 未宣言の変数は、VBAが自動的に新しい変数として扱おうとします。これが予期しない動作や、わずかなパフォーマンス低下につながることがあります。
マクロの記録機能では `Option Explicit` は自動で挿入されませんが、自分でコードを書く際には必ず先頭に記述する習慣をつけましょう。
変数の宣言
Dim swApp As SldWorks
Dim swModel As ModelDoc2
Dim swAssembly As AssemblyDoc
‘ … 他の変数宣言 …
VBAでは、変数を使用する前に `Dim` キーワードを使って宣言する必要があります。これにより、変数の型(データ型)を指定できます。
- `SldWorks`、`ModelDoc2`、`AssemblyDoc` などは、SolidWorksのAPIで定義されているオブジェクト型です。
- `Variant` 型は、どんなデータ型(数値、文字列、配列など)でも格納できる汎用的な型ですが、可能であれば具体的な型を指定する方が、コードの安全性が高まります。
- `Boolean` 型は、`True` または `False` の値を持ちます。
- `String` 型は、文字列を格納します。
- `Array()` は、配列を作成するための関数です。
SolidWorksアプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
- `Application.SldWorks`: 現在実行中のSolidWorksアプリケーションのインスタンス(実体)を取得します。
- `swApp.ActiveDoc`: 現在アクティブになっているSolidWorksドキュメント(開いているウィンドウ)を取得します。
ドキュメントタイプのチェック
If swModel Is Nothing Then
MsgBox “SolidWorksドキュメントが開かれていません。”, vbExclamation
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリファイルでのみ実行できます。”, vbExclamation
Exit Sub
End If
Set swAssembly = swModel ‘ アセンブリドキュメントとしてキャスト
- `swModel Is Nothing`: ドキュメントが開かれていない(`swModel` が何も参照していない)場合をチェックします。
- `swModel.GetType`: ドキュメントのタイプを返します。`swDocASSEMBLY` はアセンブリドキュメントを示す定数です。
- `<>`: 「~と等しくない」という比較演算子です。
- `Exit Sub`: 現在のサブルーチンを終了します。
- `Set swAssembly = swModel`: `swModel` オブジェクトは `ModelDoc2` 型ですが、アセンブリドキュメントであることがわかっているので、`AssemblyDoc` 型の変数 `swAssembly` に代入(キャスト)しています。これにより、アセンブリ固有のメソッド(機能)が使えるようになります。
コンポーネントの取得
vComponents = swAssembly.GetComponents(True) ‘ Trueは再帰的に(サブアセンブリも含む)
- `swAssembly.GetComponents(True)`: アセンブリ内のすべてのコンポーネント(パーツやサブアセンブリ)を `Variant` 型の配列として取得します。引数 `True` を指定すると、サブアセンブリの中のコンポーネントもすべて取得します(再帰的検索)。
チェックしたいカスタムプロパティの定義
Dim requiredProperties() As Variant
requiredProperties = Array(“材料”, “仕上げ”) ‘ 例として「材料」と「仕上げ」を設定
- `Array(“材料”, “仕上げ”)`: ここに、バリデーションしたいカスタムプロパティの名前を文字列として列挙します。このリストを自由に変更することで、チェックするプロパティをカスタマイズできます。
コンポーネントのループ処理とカスタムプロパティのチェック
For i = 0 To UBound(vComponents)
Set swComponent = vComponents(i)
sPartPath = swComponent.GetPathName
If sPartPath <> “” Then
Set swCustPropMgr = swApp.GetCustomPropertyManager(sPartPath)
Dim prop As Variant
For Each prop In requiredProperties
propName = CStr(prop)
propValue = swCustPropMgr.Get(propName, vbNullString)
If Trim(propValue) = “” Then
‘ … 未入力時の処理 …
End If
Next prop
End If
‘ … メモリ解放 …
Next i
- `For i = 0 To UBound(vComponents)`: 配列 `vComponents` の要素を最初から最後まで順番に処理するためのループです。`UBound()` は配列の最後のインデックスを返します。
- `Set swComponent = vComponents(i)`: 現在のループで処理するコンポーネントオブジェクトを取得します。
- `sPartPath = swComponent.GetPathName`: コンポーネントが参照しているファイル(パーツファイルなど)のフルパスを取得します。
- `If sPartPath <> “” Then`: コンポーネントが外部ファイルを参照している場合のみ、カスタムプロパティのチェックを行います。仮想コンポーネントなどの場合はパスが空になることがあります。
- `Set swCustPropMgr = swApp.GetCustomPropertyManager(sPartPath)`: 指定したファイルパスのカスタムプロパティマネージャーを取得します。ここがパフォーマンスの鍵です。 `swApp.OpenDoc6` でファイルを開いてからプロパティを取得するよりも、はるかに高速です。ただし、ファイルが存在しない、破損している、リンク切れなどの場合はエラーになる可能性があります。
- `For Each prop In requiredProperties`: `requiredProperties` 配列の各要素(プロパティ名)に対してループ処理を行います。
- `propName = CStr(prop)`: `Variant` 型の `prop` を `String` 型に変換します。
- `propValue = swCustPropMgr.Get(propName, vbNullString)`: カスタムプロパティマネージャーから、指定したプロパティ名 (`propName`) の値を取得します。第二引数 `vbNullString` は、プロパティが存在しない場合にエラーとならず、空文字列を返すようにするためのものです。
- `If Trim(propValue) = “” Then`: `Trim()` 関数は、文字列の前後の空白を取り除きます。`Trim(propValue) = “”` は、プロパティの値が空文字列、または空白文字のみであることを意味します。つまり、未入力の状態です。
未入力が見つかった場合の処理とハイライト
bFoundMissing = True
missingProperties = missingProperties & “- ” & swComponent.Name2 & ” (プロパティ: ‘” & propName & “‘)\n”
- `bFoundMissing = True`: 未入力が見つかったことを示すフラグを `True` にします。
- `missingProperties = missingProperties & …`: 未入力が見つかったコンポーネント名とプロパティ名を、`missingProperties` 変数に追記していきます。`\n` は改行コードです。
ハイライト処理について(重要!)
コード内のコメントでも触れていますが、SolidWorks APIでコンポーネントを「ハイライト」する直接的な方法は、やや工夫が必要です。
- 表示色を変更する: `swComponent.SetDisplayColor` メソッドで、コンポーネントの表示色を変更できます。しかし、この変更は永続的ではなく、また元に戻す処理を別途実装する必要があります。
- 選択状態にする: `swComponent.Select` メソッドで一時的に選択状態にすることもできますが、これはユーザーが他の操作をすると解除されてしまいます。
- 一時的に非表示にする/表示する: 特定のフィーチャーや面などを非表示にしたり、一時的に別の表示モードにしたりする方法も考えられますが、複雑になりがちです。
今回のマクロでは、「未入力のコンポーネントとプロパティ名をリストアップする」 ことを主眼としています。これにより、ユーザーは未入力箇所を正確に把握でき、手動で修正することができます。これが最もシンプルで、かつ安全な方法と言えるでしょう。もし、より視覚的なハイライトが必要な場合は、上記コメントを参考に、表示色変更や一時的な表示設定の変更などを検討してみてください。
結果の報告
If bFoundMissing Then
Dim msg As String
msg = “以下のコンポーネントでカスタムプロパティの未入力が見つかりました:\n\n” & missingProperties & vbCrLf & “ご確認ください。”
MsgBox msg, vbCritical, “カスタムプロパティバリデーション結果”
Else
MsgBox “すべてのコンポーネントで、指定されたカスタムプロパティが正しく設定されています。”, vbInformation, “カスタムプロパティバリデーション結果”
End If
- `bFoundMissing` フラグをチェックし、未入力があった場合は詳細なメッセージを、問題がなければ正常完了メッセージを表示します。
- `vbCritical` は、エラーを示すアイコン付きのメッセージボックスを表示します。
- `vbInformation` は、情報を示すアイコン付きのメッセージボックスを表示します。
オブジェクトの解放
Set swAssembly = Nothing
Set swModel = Nothing
Set swApp = Nothing
VBAでは、使用したオブジェクト変数(`Set` で代入したもの)は、不要になったら `Nothing` を代入して解放するのが良い習慣です。これにより、メモリリークを防ぎ、プログラムの安定性を保つことができます。特に、ループ処理の中でオブジェクトを生成・解放する際は重要です。
陥りやすいエラーとその回避策
このマクロを作成・実行する上で、いくつかの落とし穴があります。
- `Option Explicit` を忘れる:
- 症状: 予期しないエラーが発生する、または意図しない動作をする。デバッグが困難になる。
- 回避策: 常にコードの先頭に `Option Explicit` を記述する。
- コンポーネントのパスが取得できない:
- 症状: `sPartPath` が空になり、カスタムプロパティのチェックがスキップされる。
- 原因: 仮想コンポーネント、インポートされたジオメトリ、またはアセンブリ内に直接作成されたジオメトリなど。
- 回避策: `If sPartPath <> “” Then` の条件分岐で処理を分ける。必要であれば、これらのコンポーネントに対する特別な処理を実装する。
- パーツファイルへのアクセス権限がない、またはファイル破損:
- 症状: `swApp.GetCustomPropertyManager(sPartPath)` の部分でエラーが発生する。
- 回避策:
- 事前に、対象ファイルへのアクセス権限を確認する。
- より堅牢にするために、`On Error Resume Next` と `On Error GoTo 0` を使ってエラーハンドリングを実装する。ただし、エラーハンドリングはコードを複雑にするので、慎重に適用してください。
- (パフォーマンスは低下しますが)`swApp.OpenDoc6` でパーツを開いてからプロパティを取得する方法に切り替える。
- カスタムプロパティ名の大文字・小文字の区別:
- 症状: プロパティ名が正しくても値が取得できない。
- 原因: SolidWorksのカスタムプロパティ名は大文字・小文字を区別しない場合が多いですが、念のため、コード内で定義するプロパティ名と、SolidWorksで入力されているプロパティ名が完全に一致しているか確認してください。
- 回避策: プロパティ名を定義する際に、SOLIDWORKSで入力されているものと完全に一致させる。必要であれば、`UCase()` 関数などで両方を大文字に統一して比較する。
- 大規模アセンブリでのパフォーマンス:
- 症状: マクロの実行に時間がかかりすぎる。
- 原因: `GetComponents` で取得するコンポーネント数が膨大であること、またはループ処理が多すぎること。
- 回避策:
- `swApp.GetCustomPropertyManager(sPartPath)` を使用して、パーツを開かずにプロパティを取得する。
- 不要な `Select` や `Display` 操作を避ける。
- 画面更新を一時的に停止する (`swApp.UserControl = False`)。ただし、これを元に戻し忘れると操作不能になるので注意が必要です。
- 必要最小限のプロパティのみをチェック対象とする。
このマクロをさらに発展させるには?
今回作成したマクロは、カスタムプロパティのバリデーションの「基本」です。ここからさらに実務で役立つように、以下のような発展が考えられます。
- チェック対象プロパティのGUI化: マクロ実行時に、チェックしたいプロパティをユーザーが選択できるようにする。
- 未入力項目への自動入力: 特定の条件に基づいて、未入力のカスタムプロパティにデフォルト値を自動設定する。
- リッチなハイライト機能: 未入力箇所を一時的に色付けしたり、ツリー表示で該当コンポーネントをハイライトしたりする。
- レポート出力: チェック結果をテキストファイルやExcelファイルに出力する。
- エラーログの記録: 処理中に発生したエラーの詳細をログファイルに記録する。
- VB.NET への移行: より高度な機能や、大規模なアプリケーション開発を目指す場合は、VB.NET で SolidWorks PDM API と連携するなど、さらに強力なソリューションを構築できます。
まとめ
いかがでしたでしょうか?
今回は、SolidWorks VBAを使って、アセンブリ内のカスタムプロパティを一括でバリデーションし、未入力項目を検出するマクロを作成しました。このマクロを導入することで、設計データの品質を向上させ、製造工程へのデータ連携をよりスムーズに、そして正確に行うことができるようになります。
SolidWorks VBAは、一見難しそうに見えるかもしれませんが、今回のように一つ一つのオブジェクトやメソッドを理解し、段階的にコードを組み立てていけば、必ずマスターできます。
「マクロの記録」から一歩踏み出し、自分でコードを書くことで、SolidWorksの可能性は無限に広がります。
ぜひ、今回ご紹介したコードを参考に、皆さんの業務に合わせたカスタマイズを加えてみてください。
「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ」と自信を持って言えるように、これからも皆さんの「業務自動化エンジニア」として、強力にサポートしていきます!
それでは、また次回のSolidWorks VBAの世界でお会いしましょう!
