「マクロの記録」を卒業しよう。図面保存時に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という強力な武器を手に入れ、あなたの設計ライフを劇的に変えていきましょう。応援しています!
