【入門編】【初心者向け】図面ファイル保存時にPDFとDWGを同時に指定命名規則でバックグラウンド出力するVBA – SolidWorks VBA解析バイブル

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

「記録」から「制御」へ。図面保存時にPDFとDWGを自動生成する、エンジニアへの第一歩

こんにちは。現場で自動化を推進しているアーキテクトです。

SolidWorksを使っていると、必ずと言っていいほど直面する「地味に、でも確実に時間を奪っていく作業」がありますよね。そう、「図面を保存した後、わざわざPDFとDWGに書き出して、決まったルールで名前を付けて、指定のフォルダに放り込む」という作業です。

「マクロの記録」を使えば、この一連の動作を記録することはできます。でも、記録されたコードを見てみてください。ファイル名が「図面1.pdf」のように固定されていたり、保存先があなたのPCのデスクトップに直結していたりしませんか?

これでは、ファイル名が変わるたびにマクロを書き直さなければなりません。これこそが「マクロの記録」の限界です。

今日は、その限界を突破しましょう。「図面のプロパティから図面番号とリビジョンを読み取り、自動的に名前を組み立てて、PDFとDWGを同時に出力する」。この仕組みを作ることで、あなたは「操作を記録する人」から「システムを制御するエンジニア」へと進化します。

ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。

1. 設計図を描こう:自動化のメカニズム

いきなりコードを書き始めるのは、設計図なしで部品を作るようなものです。まずは、このマクロがどのような「論理のステップ」で動くのかを理解しましょう。

今回のマクロのワークフローは以下の4ステップです。

1. 情報の取得: 現在開いている図面の「カスタムプロパティ」から、「図面番号」と「リビジョン」という値を取り出す。
2. 名前の組み立て: 取り出した値を使って、「[図面番号]_[リビジョン].pdf」のようなファイル名を作成する。
3. パスの決定: 保存先のフォルダパスと、作成したファイル名を合体させる。
4. 書き出し実行: SolidWorksの命令(API)を使って、PDFとDWGをそれぞれ保存する。

この「情報を読み取って、加工して、命令する」という流れこそが、プログラミングの本質です。

2. 実装:自動エクスポート・マクロ

それでは、魂を込めて書いたコードを見ていきましょう。このコードは、初心者の方でも「何をしているか」がわかるように、極めて丁寧にコメントを記述しています。

' **
' ツール名: 図面自動エクスポート(PDF & DWG)
' 機能概要: 図面のカスタムプロパティに基づき、指定の命名規則でPDFとDWGを保存する
' 作成者: Senior Architect
' **

Option Explicit

Sub main()
    ' --- 1. 変数の宣言 ---
    ' SolidWorksのオブジェクトを操作するための「ハンドル」を定義します
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    
    ' プロパティやファイル名に関する変数を定義します
    Dim drawingNo As String
    Dim revision As String
    Dim baseFileName As String
    Dim savePath As String
    Dim fullPathPDF As String
    Dim fullPathDWG As String
    
    ' エラーハンドリング用の変数
    Dim errors As Long
    Dim warnings As Long

    ' --- 2. SolidWorksへの接続 ---
    ' 現在動いているSolidWorksの本体(アプリケーション)を捕まえます
    Set swApp = Application.SldWorks
    ' 今、画面に表示されているドキュメントを取得します
    Set swModel = swApp.ActiveDoc

    ' 【重要】ドキュメントが開かれていない、または図面ではない場合のガード
    If swModel Is Nothing Then
        MsgBox "図面ファイルを開いてから実行してください。", vbExclamation
        Exit Sub
    End If
    
    If swModel.GetType <> swDocDRAWING Then
        MsgBox "このマクロは図面ファイル専用です。", vbExclamation
        Exit Sub
    End If

    ' 図面オブジェクトとして扱うためにキャスト(型変換)します
    Set swDraw = swModel

    ' --- 3. カスタムプロパティの取得 ---
    ' ここがエンジニアの腕の見せ所です。図面の中身(データ)を読み取ります
    ' ※ プロパティ名 "PartNo" と "Rev" が図面に存在することを前提としています
    drawingNo = swModel.GetCustomInfoValue("", "PartNo")
    revision = swModel.GetCustomInfoValue("", "Rev")

    ' もしプロパティが空だったら、エラーを防ぐためにデフォルト値を入れます
    If drawingNo = "" Then drawingNo = "UnknownNo"
    If revision = "" Then revision = "0"

    ' --- 4. 保存ルール(命名規則)の構築 ---
    ' 保存先のフォルダを指定します(末尾に必ず \ を入れるのがコツです)
    ' 今回は図面と同じフォルダに保存する設定にします
    savePath = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, "\"))
    
    ' ファイル名を組み立てます(例: ABC-123_RevA)
    baseFileName = drawingNo & "_" & revision

    ' 拡張子を付けたフルパスを作成します
    fullPathPDF = savePath & baseFileName & ".pdf"
    fullPathDWG = savePath & baseFileName & ".dwg"

    ' --- 5. エクスポートの実行 ---
    ' PDFの出力
    ' SaveAs3メソッドを使用します。第4引数は「保存して閉じる」かどうか等の設定です
    Dim status As Boolean
    status = swModel.Extension.SaveAs(fullPathPDF, swSaveAsCurrentVersion, swSaveAsOptionsSilent, Nothing, errors, warnings)
    
    If status Then
        Debug.Print "PDF保存成功: " & fullPathPDF
    Else
        MsgBox "PDFの保存に失敗しました。エラーコード: " & errors, vbCritical
    End If

    ' DWGの出力
    ' DWGも同様に、現在の形式で保存を実行します
    status = swModel.Extension.SaveAs(fullPathDWG, swSaveAsCurrentVersion, swSaveAsOptionsSilent, Nothing, errors, warnings)

    If status Then
        Debug.Print "DWG保存成功: " & fullPathDWG
    Else
        MsgBox "DWGの保存に失敗しました。エラーコード: " & errors, vbCritical
    End If

    ' --- 6. 完了通知 ---
    MsgBox "エクスポートが完了しました!" & vbCrLf & _
           "保存先: " & savePath & vbCrLf & _
           "ファイル名: " & baseFileName, vbInformation

End Sub

3. アーキテクトの視点:ここが「プロ」への分かれ道

コードをコピペして動かすだけでは、あなたはまだ「ユーザー」です。このコードの裏側にある「なぜこう書くのか?」という意図を理解することで、あなたは「エンジニア」になれます。

① オブジェクトの「型」を意識する

コードの冒頭で `Dim swModel As SldWorks.ModelDoc2` と宣言しています。SolidWorks VBAの世界では、すべてのものは「オブジェクト」です。
「図面」という物体を、プログラムが扱えるように「ModelDoc2(モデルドキュメント)」という型に当てはめてあげているのです。これを怠ると、プログラムは「君が何を操作したいのか分からないよ」と混乱してしまいます。

② 「ガード(防御)」を固める

プロのコードには、必ず「もし~だったら、処理を中断する」というガードが組み込まれています。

  • ファイルが開かれていない時 (`If swModel Is Nothing`)
  • 図面ではないファイル(部品やアセンブリ)を開いている時 (`If swModel.GetType <> swDocDRAWING`)

これがないマクロは、予期せぬ操作をした瞬間にエラーでクラッシュし、ユーザーの信頼を失います。

③ パスの扱いは慎重に

`InStrRev` という関数を使っていますね。これは「文字列を後ろから検索して、最初に見つかった位置(この場合は最後の `\`)を返す」という関数です。ファイルパスの操作は、一文字間違えるだけで保存に失敗します。文字列操作の精度が、自動化の安定性を決めます。

4. 次のステップへのアドバイス

このマクロを動かしてみて、「成功した!」と感じたら、次は以下の課題に挑戦してみてください。これこそが、さらなる成長へのロードマップです。

1. フォルダの自動作成: 指定したフォルダが存在しない場合、`MkDir` 関数を使って自動で作るように改造してみる。
2. 禁止文字の排除: 図面番号に `/` や `:` などの「ファイル名に使えない文字」が入っていた場合、それを自動で `_` に置換する処理を追加してみる。
3. ログ出力: 成功したか失敗したかを、テキストファイルに記録する機能を作ってみる。

おわりに

マクロの記録から脱却し、自分でロジックを組み立てることは、最初は少し難しく感じるかもしれません。しかし、一度「自分の手でシステムを動かした」という感覚を掴めば、世界の見え方が変わります。

SolidWorks VBAは、あなたの強力な武器になります。一歩ずつ、着実に。
次は、もっと複雑で、もっと面白い自動化の世界で会いましょう。

Happy Automating!

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