「マクロの記録」を卒業しよう。設計者の思考を自動化する、図面一括変換エンジンの設計思想
こんにちは。設計現場の自動化を支えるチーフアーキテクトです。
「マクロの記録」ボタンを押して、動いたコードを見て「よし、これでいいんだ」と思ったことはありませんか? もしそうなら、あなたは今、エンジニアとして非常に重要な「自動化の入り口」に立っています。
しかし、プロの現場で求められるのは「動くコード」ではありません。「壊れず、速く、メンテナンスしやすい設計(アーキテクチャ)」です。
今日は、多くの設計者が日々手作業で行っている「図面を開き、PDFで保存し、DXFで保存し、製品番号ごとのフォルダに仕分ける」という作業を、一瞬で終わらせる「図面一括変換エンジン」の作り方を伝授します。
単なるコードの書き方ではなく、SolidWorks APIの「魂」とも言えるオブジェクトの扱い方を、一緒に学んでいきましょう。
1. 自動化の設計図:何を「部品」として扱うか
いきなりコードを書き始めるのは、設計図なしに製品を作るようなものです。まずは、今回のエンジンの「構成要素」を整理しましょう。
私たちが制御すべき対象は、大きく分けて3つあります。
1. SolidWorks Application (swApp): SolidWorksそのもの。すべての司令塔です。
2. ModelDoc2 (swModel): 開いている図面ファイル。中身(プロパティやデータ)にアクセスするための窓口です。
3. FileSystemObject (FSO): Windowsのフォルダやファイルを作るための、SolidWorksの外側にある「道具」です。
ここがプロの視点:オブジェクトのライフサイクル
初心者の方は「ファイルを開いて、保存して、閉じる」と考えます。しかし、プロは「オブジェクトの生存期間」を考えます。
大量のファイルを処理する際、開いたファイルを適切に解放(Close)しないと、メモリを食いつぶし、最終的にSolidWorksがクラッシュします。今回のエンジンでは、「開いたら、確実に閉じる」という原則を徹底します。
2. 実践:図面変換エンジンの実装
それでは、実際のコードを見ていきましょう。このコードは、単に動くだけでなく、エラーが起きても止まりにくい「堅牢な構造」にしています。
【事前準備】
VBAエディタのメニューから `ツール` -> `参照設定` を開き、`Microsoft Scripting Runtime` にチェックを入れてください。これを入れることで、フォルダ操作が劇的に楽になります。
Option Explicit
''' <summary>
''' 図面ファイルをPDFとDXFに変換し、製品番号フォルダへ自動仕分けするメインエンジン
''' </summary>
Sub Main()
' --- 1. 変数の宣言 (型を明示するのがプロの第一歩) ---
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim fso As New FileSystemObject
Dim filePath As String
Dim baseDir As String
Dim productNum As String
Dim targetFolder As String
Dim fileNameNoExt As String
Dim savePathPDF As String
Dim savePathDXF As String
Dim errors As Long
Dim warnings As Long
' --- 2. SolidWorksへの接続 ---
Set swApp = Application.SldWorks
' 現在アクティブなドキュメントを取得
Set swModel = swApp.ActiveDoc
' ドキュメントが開いていない場合は終了
If swModel Is Nothing Then
MsgBox "図面ファイルを開いてから実行してください。", vbCritical
Exit Sub
End If
' 図面ドキュメントであることを確認
If swModel.GetType <> swDocDRAWING Then
MsgBox "アクティブなファイルが図面ではありません。", vbExclamation
Exit Sub
End If
On Error GoTo ErrorHandler ' エラーハンドリングの開始
' --- 3. 情報の抽出 (Custom Propertyから製品番号を取得) ---
' 図面の「カスタムプロパティ」から "PartNumber" という項目を探します
Set swCustPropMgr = swModel.Extension.CustomPropertyManager("")
swCustPropMgr.Get4 "PartNumber", False, "", productNum
' 製品番号が空の場合はエラー
If productNum = "" Then
MsgBox "カスタムプロパティ 'PartNumber' が見つかりません。", vbExclamation
GoTo Cleanup
End If
' --- 4. 保存先のディレクトリ構築 ---
' 保存先:(現在のファイルがある場所) \ (製品番号) \
filePath = swModel.GetPathName
baseDir = fso.GetParentFolderName(filePath)
targetFolder = baseDir & "\" & productNum & "\"
' フォルダが存在しなければ作成する
If Not fso.FolderExists(targetFolder) Then
fso.CreateFolder targetFolder
End If
' ファイル名(拡張子なし)を取得
fileNameNoExt = fso.GetBaseName(filePath)
' 保存フルパスの作成
savePathPDF = targetFolder & fileNameNoExt & ".pdf"
savePathDXF = targetFolder & fileNameNoExt & ".dxf"
' --- 5. ファイルの書き出し (ここがエンジンの心臓部) ---
' PDFとして保存
' SaveAsを使う際は、拡張子を適切に指定するのがコツです
Dim status As Boolean
status = swModel.Extension.SaveAs(savePathPDF, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, errors, warnings)
If status Then
Debug.Print "PDF成功: " & savePathPDF
Else
Debug.Print "PDF失敗。エラーコード: " & errors
End If
' DXFとして保存
status = swModel.Extension.SaveAs(savePathDXF, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, errors, warnings)
If status Then
Debug.Print "DXF成功: " & savePathDXF
Else
Debug.Print "DXF失敗。エラーコード: " & errors
End If
MsgBox "変換処理が完了しました!" & vbCrLf & "保存先: " & targetFolder, vbInformation
Cleanup:
' --- 6. 後始末 (メモリ解放) ---
' オブジェクトをNothingにすることで、メモリを確実に解放します
Set swDraw = Nothing
Set swCustPropMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox "予期せぬエラーが発生しました。" & vbCrLf & "内容: " & Err.Description, vbCritical
Resume Cleanup
End Sub
3. ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ
コードを読み解く準備はできましたか? このプログラムには、中級者へステップアップするための「3つの極意」が詰まっています。
① 「ActiveDoc」に依存しすぎない
コード内で `swApp.ActiveDoc` を使っていますが、これは「今画面に見えているもの」を指します。一括処理(ループ処理)を作る場合は、ここを `swApp.OpenDoc6` で明示的に開いたオブジェクトに置き換える必要があります。「今何がアクティブか」を常に意識することが、バグを防ぐ鍵です。
② カスタムプロパティは「データの設計図」
`swCustPropMgr.Get4` を使って製品番号を取り出していますね。
自動化において、ファイル名だけで判断するのは危険です。ファイル名は人間が変えてしまう可能性がありますが、カスタムプロパティは設計データの一部です。プロパティを信頼して処理を組む。これが、システムとしての堅牢性を生みます。
③ エラーハンドリング(On Error GoTo)
これが無いコードは、プロの現場では「爆弾」と呼ばれます。
途中でファイルが書き込み禁止になっていたり、フォルダ作成権限がなかったりしたとき、エラーハンドリングがないとマクロは突然死します。`ErrorHandler` を用意し、「失敗しても、後始末(Cleanup)だけは必ず行う」という構造を作る。これが、プロのエンジニアの作法です。
最後に:自動化の先にあるもの
このマクロが完成したら、あなたは「作業者」から「仕組みを作る人」へと進化しています。
最初は一つのファイルから始めてください。次に、フォルダ内の全ファイルをループで処理するように拡張してください。その次は、Excelのリストに基づいて処理するように拡張してください。
一つひとつのステップが、あなたの設計業務を劇的に、そして美しく変えていくはずです。
「コードは、あなたの思考を拡張するためのツールである。」
この言葉を胸に、次なる自動化への挑戦を楽しんでください。応援していますよ!
