【入門編】【初心者向け】図面保存時に「DXF/DWG」を同時出力するファイル名自動命名ルール実装VBA – SolidWorks VBA解析バイブル

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

「マクロの記録」を卒業しよう。図面保存時にDXFを自動生成する、一歩先のVBA設計術

こんにちは。設計自動化の世界へようこそ。

「マクロの記録」ボタンを押して、録画されたコードを眺めては、「なんだかよくわからない、汚いコードだな……」と溜息をついたことはありませんか? もしそうなら、おめでとうございます。あなたはすでに、「単なる作業者」から「エンジニア」へと脱皮する準備ができています。

多くの初学者が陥る罠は、操作をそのまま記録することに終始してしまうことです。しかし、プロの自動化エンジニアが書くコードは、操作の記録ではなく「オブジェクトの操作」です。

今日は、実務で最もニーズが高いテーマの一つ、「図面(.slddrw)を保存した瞬間に、決まった命名規則でDXF/DWGを自動出力する」という仕組みを題材に、SolidWorks VBAの真髄を伝授します。

1. 思考のOSを切り替える:オブジェクト・モデルの理解

コードを書く前に、まずはSolidWorksの「構造」を頭に叩き込んでください。ここを理解せずにコードを書くのは、地図を持たずに樹海へ入るようなものです。

SolidWorks VBAの世界は、巨大な階層構造(オブジェクトモデル)になっています。

1. SldWorks (アプリケーション本体):SolidWorksというソフトそのもの。
2. ModelDoc2 (ドキュメント):今開いている「図面」や「部品」というファイルそのもの。
3. Extension (拡張機能):ファイル保存や書き出しなど、高度な操作を行うための「道具箱」。

今回のミッションは、「ModelDoc2(図面)から、Extension(道具箱)を取り出し、SaveAs(保存)という命令を出す」こと。これだけです。

2. 実践:DXF自動命名保存マクロ

それでは、実際に動くコードを見てみましょう。
このコードは、現在の図面を保存した際、あるいはボタンを押した際に、「元のファイル名 + _DXF」 という名前で、同じフォルダにDXF形式で保存するものです。

Option Explicit ' 変数の宣言を強制する(プロの鉄則!)

Sub Main()
    ' --- 1. オブジェクトの宣言 ---
    Dim swApp As SldWorks.SldWorks          ' SolidWorksアプリケーション
    Dim swModel As SldWorks.ModelDoc2       ' 現在開いているドキュメント
    Dim swExt As SldWorks.ModelDocExtension ' 保存操作を行うための拡張機能
    
    Dim fullPath As String                  ' 現在のファイルのフルパス
    Dim folderPath As String                ' フォルダのパス
    Dim fileNameNoExt As String             ' 拡張子を除いたファイル名
    Dim newPath As String                   ' 新しく作るDXFのフルパス
    Dim errors As Long                      ' 保存時のエラーコード格納用
    Dim warnings As Long                    ' 保存時の警告コード格納用

    ' --- 2. オブジェクトのセットアップ ---
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

    ' ドキュメントが開かれていない場合のガード(エラー回避)
    If swModel Is Nothing Then
        MsgBox "図面ファイルが開かれていません。", vbCritical
        Exit Sub
    End If

    ' 図面ファイル(Drawing)であることを確認
    If swModel.GetType <> swDocDRAWING Then
        MsgBox "このマクロは図面ファイル専用です。", vbExclamation
        Exit Sub
    End If

    ' --- 3. パスとファイル名の解析(ここがロジックの肝!) ---
    fullPath = swModel.GetPathName ' 例: "C:\Work\Part_A.slddrw"
    
    ' ファイルが一度も保存されていない(パスがない)場合の処理
    If fullPath = "" Then
        MsgBox "ファイルを一度保存してから実行してください。", vbExclamation
        Exit Sub
    End If

    ' フォルダパスの抽出
    folderPath = Left(fullPath, InStrRev(fullPath, "\"))
    
    ' 拡張子を除いたファイル名の抽出
    fileNameNoExt = Mid(fullPath, InStrRev(fullPath, "\") + 1)
    fileNameNoExt = Left(fileNameNoExt, InStrRev(fileNameNoExt, ".") - 1)

    ' 新しいファイル名の構築(命名規則: 元の名前_DXF.dxf)
    newPath = folderPath & fileNameNoExt & "_DXF.dxf"

    ' --- 4. DXFとして保存実行 ---
    Set swExt = swModel.Extension
    
    ' SaveAsメソッドの呼び出し
    ' 引数: 保存先パス, 保存形式, オプション, 設定, エラー, 警告
    ' swSaveAsCurrentVersion = 0 (現在のバージョンで保存)
    Dim status As Boolean
    status = swExt.SaveAs(newPath, swSaveAsCurrentVersion, swSaveAsOptions, Nothing, errors, warnings)

    ' --- 5. 結果の報告 ---
    If status = True Then
        MsgBox "DXFの出力に成功しました!" & vbCrLf & "保存先: " & newPath, vbInformation
    Else
        MsgBox "DXFの出力に失敗しました。" & vbCrLf & "エラーコード: " & errors, vbCritical
    End If

End Sub

3. コードの深層解説:なぜこう書くのか?

このコードには、初学者が「マクロの記録」では決して辿り着けない、プロのテクニックが詰まっています。

① `Option Explicit` の魔力

コードの冒頭にあるこれ、絶対に忘れないでください。これは「すべての変数を使う前に必ず宣言せよ」という命令です。これがないと、`swApp` と書くべきところを `swAp` と打ち間違えても、VBAは「新しい変数だな」と勝手に解釈して進んでしまいます。バグの温床を未然に防ぐ、エンジニアの良心です。

② 文字列操作の「外科手術」

`InStrRev`(後ろから検索)と `Left` / `Mid` を組み合わせています。
ファイルパスの操作は、プログラミングにおいて「文字列の外科手術」のようなものです。

  • `InStrRev(fullPath, “\”)` で、最後の「\」がどこにあるかを探す。
  • そこを起点に、フォルダ名とファイル名を切り分ける。

この「切り分け」ができるようになると、ファイル名の自動命名は自由自在です。

③ `Extension.SaveAs` の選択

マクロの記録では `swModel.SaveAs3` などが記録されることがありますが、現代のSolidWorks APIでは `ModelDocExtension.SaveAs` を使うのが最もスマートで、拡張性が高い方法です。これにより、単なる「上書き保存」ではなく、「別形式でのエクスポート」を明示的にコントロールできます。

4. 陥りやすい罠:ここをクリアすればバッチリ!

実務でこのマクロを運用する際、以下の3点に注意してください。

1. 「未保存ファイル」の恐怖
新規作成して一度も保存していない図面には、`GetPathName` が空の文字列を返します。これを確認せずに処理を進めると、プログラムはクラッシュします。コード内の `If fullPath = “” Then` というガードが、その命綱です。

2. ファイルの上書き許可
既に同じ名前のDXFが存在する場合、SolidWorksは「上書きしますか?」というダイアログを出そうとして、マクロが止まってしまうことがあります。これを回避するには、事前に `FileExists` 関数(FileSystemObject)を使って、ファイルの存在チェックを行うのが一流の作法です。

3. 権限の問題
書き込み禁止のフォルダや、ネットワークドライブの権限がない場所に保存しようとすると、`status = False` が返ります。エラーコード(`errors`)をログに出力するようにしておくと、現場でのトラブルシューティングが劇的に楽になります。

結びに:自動化は「思考の整理」である

自動化マクロを作ることは、単に作業を楽にすることではありません。
「自分の業務を、コンピュータが理解できる論理的なステップに分解する」という、極めて高度な知的トレーニングです。

今回紹介したコードは、あくまで第一歩。
「ファイル名に日付を入れたい」「特定のフォルダに自動仕分けしたい」……そんな風に、「もっとこうしたい!」という欲求が湧いてきた時こそ、エンジニアとしての成長のチャンスです。

一歩ずつ、確実に。SolidWorks VBAという強力な武器を手に入れ、あなたの設計ライフを劇的に変えていきましょう。応援しています!

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