【入門編】【中級者向け】図面ファイル一括変換時における「PDFとDXFの同時出力&専用フォルダ自動振り分け」エンジン – SolidWorks VBA解析バイブル

スポンサーリンク
スポンサーリンク

「マクロの記録」を卒業しよう。設計者の思考を自動化する、図面一括変換エンジンの設計思想

こんにちは。設計現場の自動化を支えるチーフアーキテクトです。

「マクロの記録」ボタンを押して、動いたコードを見て「よし、これでいいんだ」と思ったことはありませんか? もしそうなら、あなたは今、エンジニアとして非常に重要な「自動化の入り口」に立っています。

しかし、プロの現場で求められるのは「動くコード」ではありません。「壊れず、速く、メンテナンスしやすい設計(アーキテクチャ)」です。

今日は、多くの設計者が日々手作業で行っている「図面を開き、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のリストに基づいて処理するように拡張してください。

一つひとつのステップが、あなたの設計業務を劇的に、そして美しく変えていくはずです。

「コードは、あなたの思考を拡張するためのツールである。」

この言葉を胸に、次なる自動化への挑戦を楽しんでください。応援していますよ!

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