【SolidWorks VBA極限活用】複数アセンブリからカスタムプロパティを一括抽出!デスクトップ自動出力スクリプトの全貌
開発プロジェクトの現場において、多くの設計者が日々直面する無駄な作業の筆頭が「大量の図面やアセンブリファイルを開いて、プロパティ情報を目視確認し、Excelやテキストに手入力する」という作業だ。
「このアセンブリの作成者は誰だっけ?」
「図面番号の一覧を管理部門に提出するために、全アセンブリのプロパティをリスト化してほしい」
こうした単調でミスが許されないルーチンワークを、人間が手作業で行うこと自体が最大のコストロスである。
今回は、SolidWorks VBAのAPIを駆使し、指定したフォルダ内にあるアセンブリ(.sldasm)をサイレント(非表示)で高速スキャン、カスタムプロパティを抽出し、デスクトップにCSVテキストとして一撃で出力する「プロダクション品質のスクリプト」を授けよう。
—
なぜ「ファイルを画面に表示させながら」処理してはいけないのか?
初学者がやりがちな最大の過ちは、`SldWorks.OpenDoc6` を使って、アセンブリをいちいちSolidWorksのグラフィック領域に描画しながら開閉することだ。
画面を描画(Graphics Update)しながらファイルを何十個も開閉すると、以下の深刻な問題が発生する。
1. 圧倒的な処理遅延:グラフィックの再描画コストは非常に高く、数分〜数十分の時間を浪費する。
2. 予期せぬエラー(COM例外):画面操作とバックグラウンド処理が干渉し、フリーズやメモリリークの原因になる。
チーフアーキテクトからの鉄則
「バックグラウンド(Silent Mode)で開き、メモリ上で最小限の操作をして即座に解放せよ。」
今回提供するコードでは、ファイルを開く際に `swOpenDocOptions_Silent` や `swOpenDocOptions_LoadLightweight` を適切に組み合わせ、人間が目視する必要のない領域で超高速にデータを吸い上げる設計を採用している。
—
堅牢なプロダクションコード
以下のコードをSolidWorksのVBAエディタ([Alt] + [F11])に貼り付け、参照設定(`SldWorks 20xx Type Library` および `SolidWorks 20xx Constants`)を確認した上で実行してほしい。
Option Explicit
‘ =========================================================================
‘ プロジェクト名: AssemblyPropertyExtractor
‘ 概要 : 指定フォルダ内のアセンブリからカスタムプロパティを一括抽出
‘ 備考 : 実務での堅牢性を考慮し、エラーハンドリングとメモリ管理を徹底
‘ =========================================================================
Sub ExportAssemblyPropertiesToCSV()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Set swApp = Application.SldWorks
If swApp is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
‘ 1. 対象フォルダの選択(実務ではFileDialogを使用)
Dim targetFolder As String
targetFolder = BrowseForFolder(“スキャンするアセンブリフォルダを選択してください”)
If targetFolder = “” Then Exit Sub
‘ 2. 出力先パスの生成(デスクトップにタイムスタンプ付きCSV)
Dim desktopPath As String
desktopPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”)
Dim csvFilePath As String
csvFilePath = desktopPath & “\Assembly_Properties_” & Format(Now, “yyyymmdd_HHMMSS”) & “.csv”
‘ 3. ファイルシステムの準備
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(targetFolder) Then
MsgBox “指定されたフォルダが存在しません。”, vbCritical
Exit Sub
End If
Dim targetFolderObj As Object
Set targetFolderObj = fso.GetFolder(targetFolder)
Dim fileItem As Object
‘ 4. CSVファイルの作成とヘッダー書き込み
Dim fileNum As Integer
fileNum = FreeFile
Open csvFilePath For Output As #fileNum
Print #fileNum, “ファイル名,絶対パス,作成者,図面番号,ステータス”
Dim processedCount As Long
processedCount = 0
‘ 画面描画の凍結(パフォーマンス爆上げの必須テクニック)
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllType, True
On Error GoTo ErrorHandler
‘ 5. フォルダ内走査
For Each fileItem In targetFolderObj.Files
Dim ext As String
ext = LCase(fso.GetExtensionName(fileItem.Name))
‘ アセンブリファイル(.sldasm)のみをターゲットにする
If ext = “sldasm” Then
Dim filePath As String
filePath = fileItem.Path
Dim fileName As String
fileName = fileItem.Name
Dim author As String
Dim drawingNo As String
Dim loadError As Long
Dim loadWarning As Long
‘ 【極限の知見】サイレントモード&軽量ロードで爆速オープン
Set swModel = swApp.OpenDoc6(filePath, swDocumentTypes_e.swDocASSEMBLY, _
swOpenDocOptions_e.swOpenDocOptions_Silent + _
swOpenDocOptions_e.swOpenDocOptions_LoadLightweight, _
“”, loadError, loadWarning)
If Not swModel Is Nothing Then
‘ カスタムプロパティマネージャーを取得
‘ ※第2引数 “” は設定固有ではなく「要約情報/カスタム」全体をターゲットにする場合
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)
‘ プロパティの取得(キー名は実際の環境に合わせて変更してください)
author = GetPropertyValue(swCustPropMgr, “作成者”)
drawingNo = GetPropertyValue(swCustPropMgr, “図面番号”)
‘ CSV行の書き出し
Print #fileNum, “””” & fileName & “””,””” & filePath & “””,””” & author & “””,””” & drawingNo & “””,””成功”””
‘ ドキュメントをメモリから即座に解放(CloseDocの徹底)
swApp.CloseDoc fileName
processedCount = processedCount + 1
Else
‘ 読み込み失敗時のログ
Print #fileNum, “””” & fileName & “””,””” & filePath & “””,”-“,”-“,”読込失敗(Error:” & loadError & “)”””
End If
End If
Next fileItem
Close #fileNum
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllType, False
MsgBox “処理が完了しました!” & vbCrLf & _
“処理件数: ” & processedCount & ” 件” & vbCrLf & _
“出力先: ” & csvFilePath, vbInformation, “完了”
Exit Sub
ErrorHandler:
Close #fileNum
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllType, False
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
‘ =========================================================================
‘ 補助関数: カスタムプロパティの安全な取得
‘ =========================================================================
Private Function GetPropertyValue(propMgr As SldWorks.CustomPropertyManager, propName As String) As String
Dim valOut As String
Dim resolvedValOut As String
Dim wasResolved As Boolean
Dim status As Long
‘ Get6 Methodを使用 (ValOut, ResolvedValOutを取得)
status = propMgr.Get6(propName, False, valOut, resolvedValOut, wasResolved, vbNull)
If status = swCustomInfoGetResult_e.swCustomInfoGetResult_NotPresent Then
GetPropertyValue = “”
Else
‘ 評価済みの値を返す(数式やグローバル変数展開後)
GetPropertyValue = resolvedValOut
End If
End Function
‘ =========================================================================
‘ 補助関数: フォルダ選択ダイアログ
‘ =========================================================================
Private Function BrowseForFolder(prompt As String) As String
Dim shellApp As Object
Set shellApp = CreateObject(“Shell.Application”)
Dim folderObj As Object
On Error Resume Next
Set folderObj = shellApp.BrowseForFolder(0, prompt, &H10 + &H20, “C:\”)
On Error GoTo 0
If Not folderObj Is Nothing Then
BrowseForFolder = folderObj.Self.Path
Else
BrowseForFolder = “”
End If
End Function
—
コードのアーキテクチャ解説と実務上の注意点
1. メモリリークを防ぐための `CloseDoc` の徹底
VBAで最も恐ろしいのは、バックグラウンドで開いたドキュメントがSolidWorksのメモリ内に残り続け、やがてPC全体のメモリを食いつぶす「メモリリーク」だ。
今回のコードでは、1ファイル処理するごとに必ず `swApp.CloseDoc fileName` を実行している。これにより、何千個というアセンブリを処理してもメモリ使用量が一定に保たれる。
2. `CustomPropertyManager.Get6` の優位性
プロパティの取得には古くからの `Get` や `Get2` ではなく、最新の仕様に対応した `Get6` を使用している。
これにより、プロパティ値に他のカスタムプロパティへのリンク(`$PRP:”DrawingNo”` など)が含まれている場合でも、正しく解決された値(Resolved Value)を取得することが可能だ。実務でありがちな「値が数式のまま出力されてしまうバグ」を完全に回避している。
3. CSVフォーマットの囲み処理
ファイル名やパスにカンマ(`,`)やスペースが含まれている場合を考慮し、出力データの各フィールドは必ずダブルクォーテーション(`”`)で囲む仕様(`”””” & fileName & “””`)にしている。これにより、Excelで直接CSVを開いた際に列がズレるという現場特有のトラブルを防ぐ。
—
終わりに:自動化の先にあるもの
このスクリプトを導入するだけで、これまで何時間もかかっていたアセンブリ情報の棚卸しが、わずか数秒で完了するようになる。
しかし、これは氷山の一角に過ぎない。
このデータをデータベース(SQL ServerやAccess)と連携させたり、Web API経由でPLMシステムへ自動同期させたりすることで、真の「エンジニアリングチェーンの自動化」が達成される。
手作業という名の泥臭い労働からエンジニアを解放し、本来の「設計・創造」にリソースを集中させること。それこそが、我々エンジニアリングオートメーションのプロフェッショナルの使命である。
