こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。
「マクロの記録」ボタンを押して図面をちまちま描かせる時代はもう終わりです。ここからは、VBA(Visual Basic for Applications)を操り、SolidWorksをあなたの思い通りに働かせる「真のエンジニア」への階段を登っていきましょう。
今回は、実務で絶対に直面する「複数のアセンブリファイルから、カスタムプロパティ(作成者や図面番号など)をごっそり抽出し、デスクトップにCSVとして出力する」という超実用的なタスクを攻略します。
ここをクリアすれば、SolidWorks VBAの基本構造はバッチリです。一緒にスッキリ理解していきましょう!
—
1. 開発の前に:なぜ「ファイルを開かずに」情報を抜くのか?
初心者がやりがちな失敗は、`OpenDoc6` などのメソッドを使って、すべての3Dモデルを画面上でゴリゴリ開き、プロパティを読んで閉じる…という方法です。
アセンブリが100個あったらどうなるでしょう? 画面がパタパタ切り替わり、メモリを食い潰し、完了するまでにコーヒーが何杯も飲めてしまいます。
プロのエンジニアは、ファイルを開きません。
SolidWorksの裏側にある「ファイル情報(ドキュメントのストレージ)」に直接アクセスして、必要なカスタムプロパティだけを秒速で吸い出します。このスマートさを、最初から身につけましょう。
—
2. 全体像のイメージ(図解的表現)
今回作成するマクロの動きは、次のようなイメージです。
[指定したフォルダ]
┣ 📂 筐体ASSY.sldasm ━━┓
┣ 📂 ユニットA.sldasm ━━╋━━▶ 【VBAの魔法】 ━━▶ 📝 Desktop\Assembly_List.csv
┗ 📂 駆動部B.sldasm ━━┛ (裏側でプロパティを爆速抽出)
人間がやると数時間かかる「ファイルを探して、プロパティを目視で確認して、エクセルに手入力する」という苦行を、VBAが一瞬で終わらせます。
—
3. 実装コード:コピペで動く最強の初学者向けスクリプト
以下のコードを、SolidWorksのVBAエディタ([ツール] > [マクロ] > [新規作成])に丸ごと貼り付けてください。
Option Explicit
‘ =================================================================================
‘ 処理名: アセンブリカスタムプロパティ一括抽出スクリプト
‘ 概要 : 指定フォルダ内のアセンブリ(sldasm)から作成者・図面番号を抜き出し、
‘ デスクトップにCSVファイルとして出力します。
‘ =================================================================================
Sub ExtractAssemblyProperties()
Dim swApp As SldWorks.SldWorks
Dim targetFolder As String
Dim fileName As String
Dim filePath As String
Dim fso As Object
Dim csvFile As Object
Dim desktopPath As String
Dim outputFilePath As String
‘ 抽出するプロパティ名(社内のルールに合わせて変更してください)
Const PROP_DRAWING_NO As String = “図面番号”
Const PROP_AUTHOR As String = “作成者”
‘ 1. SolidWorksアプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
‘ 2. スキャンするフォルダをユーザーに選択させる
targetFolder = BrowseForFolder(“プロパティを抽出するアセンブリフォルダを選択してください”)
If targetFolder = “” Then
MsgBox “フォルダが選択されませんでした。処理を中断します。”, vbExclamation
Exit Sub
End If
‘ フォルダのパスの最後に “\” が無い場合の対策
If Right(targetFolder, 1) <> “\” Then
targetFolder = targetFolder & “\”
End If
‘ 3. 出力先(デスクトップ)のパスを取得
Set fso = CreateObject(“Scripting.FileSystemObject”)
desktopPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”)
outputFilePath = desktopPath & “\Assembly_Properties_List.csv”
‘ 4. CSVファイルの作成(文字コード: Shift-JIS / 上書き作成)
‘ ※テキストストリームを使って書き込みます
Set csvFile = fso.CreateTextFile(outputFilePath, True, False)
‘ CSVヘッダーの書き込み
csvFile.WriteLine “ファイル名,図面番号,作成者”
‘ 5. フォルダ内のアセンブリファイル(.sldasm)をループ処理
fileName = Dir(targetFolder & “.sldasm”)
If fileName = “” Then
MsgBox “指定されたフォルダにアセンブリファイルが見つかりません。”, vbExclamation
csvFile.Close
Exit Sub
End If
Dim count As Long
count = 0
Do While fileName <> “”
filePath = targetFolder & fileName
Dim drawingNo As String
Dim author As String
‘ 【重要】ファイルを開かずにカスタムプロパティを取得するサブルーチンを呼び出し
Call GetCustomProperties(swApp, filePath, PROP_DRAWING_NO, PROP_DRAWING_NO, drawingNo)
Call GetCustomProperties(swApp, filePath, PROP_AUTHOR, PROP_AUTHOR, author)
‘ CSVの1行分データを作成して書き込み
‘ ダブルクォーテーションで囲むことでカンマ混入エラーを防ぐ
csvFile.WriteLine “””” & fileName & “””,””” & drawingNo & “””,””” & author & “”””
count = count + 1
‘ 次のファイルを検索
fileName = Dir()
Loop
‘ 6. 後片付け
csvFile.Close
Set csvFile = Nothing
Set fso = Nothing
‘ 完了メッセージ
MsgBox “処理が完了しました!” & vbCrLf & _
“抽出件数: ” & count & ” 件” & vbCrLf & _
“保存先: ” & outputFilePath, vbInformation, “完了”
End Sub
‘ =================================================================================
‘ サブルーチン: ファイルを開かずに指定ファイルのカスタムプロパティを取得する
‘ =================================================================================
Private Sub GetCustomProperties(swApp As SldWorks.SldWorks, ByVal filePath As String, ByVal propName As String, ByRef outVal As String)
Dim nRetVal As Long
Dim valOut As String
Dim resolvedValOut As String
Dim wasResolved As Boolean
Dim linkToProp As Boolean
outVal = “” ‘ 初期化
‘ GetDocumentProperties2 を使えば、ファイルを開かずにドキュメント情報を取得可能
‘ 引数にファイルパス、プロパティ名を指定する
nRetVal = swApp.GetDocumentProperties2(filePath, propName, valOut, resolvedValOut, wasResolved, linkToProp)
‘ 取得できた場合は解決済みの値を採用する
If nRetVal = 0 Then ‘ 0は成功を示すステータス(環境により調整)
If resolvedValOut <> “” Then
outVal = resolvedValOut
Else
outVal = valOut
End If
Else
outVal = “(未設定)”
End If
End Sub
‘ =================================================================================
‘ 補助関数: フォルダ選択ダイアログを表示する
‘ =================================================================================
Private Function BrowseForFolder(ByVal prompt As String) As String
Dim shellApp As Object
Dim folderObj As Object
Set shellApp = CreateObject(“Shell.Application”)
Set folderObj = shellApp.BrowseForFolder(0, prompt, &H10 + &H20, 0) ‘ &H10=BIF_RETURNONLYFSDIRS
If Not folderObj Is Nothing Then
BrowseForFolder = folderObj.Self.Path
Else
BrowseForFolder = “”
End If
Set folderObj = Nothing
Set shellApp = Nothing
End Function
—
4. コードの深掘り解説:ここがVBAのキモ!
初心者のうちに、このコードの「美味しいポイント」をしっかり押さえておきましょう。
① `Dir関数` によるファイル走査
fileName = Dir(targetFolder & “.sldasm”)
…
fileName = Dir()
`Dir` 関数は、指定した条件に一致するファイル名を1つずつ返してくれます。最初に見つけたファイルを処理したら、引数なしで `Dir()` を呼ぶことで、次のファイルを自動で手繰り寄せてくれます。これがフォルダ内の全ファイルを舐める基本のテクニックです。
② ファイルを開かない神機能 `GetDocumentProperties2`
今回のコードの最大のミソはここです。
通常、プロパティを読もうとすると `swApp.OpenDoc6` でモデルを開きたくなりますが、それだと動作が重くなります。`GetDocumentProperties2` を使うことで、OSのファイルストレージ領域から直接カスタムプロパティのテキストを引っこ抜くことができるため、圧倒的な高速化が実現できます。
③ CSVのエスケープ処理(ダブルクォーテーション囲み)
csvFile.WriteLine “””” & fileName & “””,””” & drawingNo & “””,””” & author & “”””
ファイル名やプロパティの中にカンマ(`,`)が含まれていると、CSVが崩れてエクセルで開いたときに列がズレる大惨事になります。それを防ぐため、各データの両端を `””`(ダブルクォーテーション)で囲むお作法を入れています。プロらしい細かい配慮です。
—
5. 陥りやすいエラーと対策
1. 「ファイルが見つかりません」と言われる
- 原因: 選択したフォルダの中に `.sldasm`(アセンブリ)ファイルが1つもない場合や、パスの指定ミス。
- 対策: テスト用に、アセンブリが数個入っている分かりやすいフォルダをデスクトップ等に用意して試してください。
2. プロパティが「(未設定)」になってしまう
- 原因: コード内の `PROP_DRAWING_NO` や `PROP_AUTHOR` の文字列(例:「図面番号」「作成者」)と、実際のSolidWorksファイルの「カスタムプロパティタブ」にある名前が完全に一致していない。
- 対策: プロパティタブの「名前」の表記(全角・半角・スペースの有無)を、コード側の定数と完全に一致させてください。
—
6. おわりに
お疲れ様でした!
今回あなたが手に入れたのは、「ファイルを画面に表示させずに、裏側で一括処理する」という、業務自動化の極めて強力なアプローチです。
ここをクリアできれば、次は「図面を自動でPDF化する」「構成部品のリストをデータベースに飛ばす」といった、さらに高度な自動化へ進むのはあっという間です。
SolidWorks VBAの世界へようこそ。あなたのエンジニアライフが、よりスマートで創造的なものになりますように。
それでは、次の自動化の現場でお会いしましょう!
