テンプレート選択の「待ち時間」をゼロにする。SolidWorks VBAで図面作成を劇的に速める第一歩
こんにちは。設計自動化の世界へようこそ。
「マクロの記録」ボタンを押して、自分が操作した通りにコードが生成されるのを見て、「おお、これで自動化ができるぞ!」と胸を躍らせた経験はありませんか? 実は、そこが自動化エンジニアとしての「本当のスタートライン」なのです。
マクロの記録は、あくまで「あなたがマウスでクリックした動作」をなぞるだけです。しかし、プロの自動化エンジニアが目指すのは、「システムに対して、直接、意図を伝えること」です。
今日は、その第一歩として、多くの設計者が毎日繰り返している「新規図面作成時のテンプレート選択ダイアログ」を、VBAの力で華麗にスキップし、社内標準のテンプレートを瞬時に立ち上げるテクニックを伝授します。
ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。
なぜ「マクロの記録」では不十分なのか?
多くの初心者が陥る罠があります。それは、「テンプレートを選んでいる操作」を記録しようとしてしまうことです。
しかし、テンプレート選択ダイアログは、SolidWorksの「UI(ユーザーインターフェース)」という、いわば「外装」の部分です。外装を操作するコードは、環境が変わるとすぐに壊れてしまいます。
私たちが目指すべきは、外装を通さずに、SolidWorksの「エンジン(API)」へ直接「このテンプレートを使って、新しい図面ドキュメントを生成せよ」と命令を送ることです。
これができると、ダイアログが表示されるコンマ数秒の待ち時間すら、あなたの貴重な設計時間から解放されます。
核心:`NewDocument` メソッドを使いこなす
図面を生成するための魔法の言葉、それが `NewDocument` メソッドです。
このメソッドを使うには、以下の4つの情報が必要です。
1. テンプレートのフルパス(どこにあるか)
2. 用紙サイズ(A3なのかA4なのか)
3. 幅(数値)
4. 高さ(数値)
「えっ、テンプレートのパスを指定するだけでいいの?」と思うかもしれません。はい、その通りです。パスを正確に渡せば、SolidWorksはダイアログを出す必要すら感じず、即座に図面を立ち上げます。
実践:社内標準テンプレートを強制起動するコード
それでは、実際に動くコードを見てみましょう。以下のコードは、指定したパスのテンプレートを使って、新しい図面を立ち上げるための「黄金のテンプレート」です。
Option Explicit
' =====================================================================================
' プログラム名:InstantDrawingTemplateLoader
' 概要:ダイアログをスキップし、指定した図面テンプレートを直接読み込む
' 著者:Your Senior Architect
' =====================================================================================
Sub Main()
' --- 1. オブジェクトの宣言 ---
Dim swApp As SldWorks.SldWorks ' SolidWorksアプリケーション本体
Dim swModel As SldWorks.ModelDoc2 ' 新しく作成されたドキュメント
Dim templatePath As String ' テンプレートのパスを格納する変数
' --- 2. 初期設定(ここを自分の環境に合わせて書き換える!) ---
' 注意:パスは必ず「\\」を含むフルパスで指定してください。
' テンプレートが「C:\Standard\MyTemplate.drwdot」にあると仮定します。
templatePath = "C:\Standard\MyTemplate.drwdot"
' --- 3. SolidWorksへの接続 ---
' 起動中のSolidWorksを取得します。
Set swApp = Application.SldWorks
' もしSolidWorksが起動していなければ、エラーになります。
If swApp Is Nothing Then
MsgBox "SolidWorksが起動していません。", vbCritical
Exit Sub
End If
' --- 4. 新規図面の作成(ここが心臓部!) ---
' NewDocument(テンプレート名, 用紙サイズ, 幅, 高さ)
' ※用紙サイズや幅・高さは、テンプレート側に設定されているものが優先されますが、
' 引数として渡すのがAPIの作法です。
' ここでは便宜上、A3サイズ相当の数値を指定しています。
Set swModel = swApp.NewDocument(templatePath, swDwgPaperA3size, 0.42, 0.297)
' --- 5. 結果の判定とエラーハンドリング ---
' APIが成功すると、swModelに作成されたドキュメントが格納されます。
' 失敗すると、swModelは "Nothing" になります。
If swModel Is Nothing Then
' ここでエラーが出る最大の理由は「パスの間違い」です。
MsgBox "図面を作成できませんでした。" & vbCrLf & _
"原因の可能性:" & vbCrLf & _
"・テンプレートのパスが間違っている" & vbCrLf & _
"・ファイルが別のプロセスで使用されている", vbExclamation, "エラー発生"
Else
' 成功した場合
Debug.Print "図面の作成に成功しました: " & swModel.GetTitle
' 画面を更新して、新しい図面を見えるようにします
swApp.ActivateDoc3 swModel.GetTitle, True, swRebuildOnActivation_e.swUserDecision, 0
End If
End Sub
アーキテクトの視点:陥りやすい「3つの罠」
このコードを動かすとき、あるいは自分で拡張していくときに、必ず直面する壁があります。先回りして教えておきますね。
1. 「パスの壁」:Nothingエラーの正体
コードを実行して「図面を作成できませんでした」というメッセージが出た場合、9割以上の原因は `templatePath` の記述ミスです。
- 拡張子(`.drwdot`)を忘れていませんか?
- フォルダ名にスペースが含まれている場合、パスが正しく認識されているか確認してください。
- プロのコツ: `Dir(templatePath)` 関数を使って、コード内で「ファイルが本当に存在するか」を事前にチェックする癖をつけると、デバッグが劇的に楽になります。
2. 「型」の壁:ModelDoc2 と SwApp の違い
初心者の方は `swApp`(SolidWorksというソフトそのもの)と `swModel`(開いているファイルそのもの)を混同しがちです。
- `swApp` は「命令を出す司令官」。
- `swModel` は「命令によって生み出された成果物」。
「図面のタイトルを変えたい」なら、司令官(swApp)ではなく、成果物(swModel)に対して命令を送る必要があります。この「オブジェクトの階層構造」を意識することが、上達への近道です。
3. 「単位」の壁:メートル法を忘れない
`NewDocument` の引数に渡す「幅」や「高さ」ですが、SolidWorks APIの内部数値は、基本的に 「メートル (m)」 です。
「420mmを指定したいから `420` と書く」のは間違いです。正しくは `0.42` です。ここを間違えると、とんでもなく巨大な、あるいは極小の図面が生成されてしまいます。
まとめ:自動化の扉を開けたあなたへ
お疲れ様でした。これであなたは、単に「記録されたマクロ」を再生するユーザーから、「APIを通じてSolidWorksを制御する」エンジニアへの一歩を踏み出しました。
今回学んだ `NewDocument` は、図面作成だけでなく、部品(Part)やアセンブリ(Assembly)の自動生成にも応用できる、非常に強力な武器です。
「次に何を自動化しようか?」
その好奇心こそが、最高のエンジニアを育てるエンジンです。もしエラーが出ても、それは失敗ではなく「APIとの対話」のプロセスに過ぎません。一つずつ、オブジェクトの正体を確認していけば、必ず制御できるようになりますよ。
応援しています。次回のレッスンでお会いしましょう!
