【入門編】【初心者向け】図面作成開始時のダイアログをスキップして指定テンプレートを強制読み込みするVBAマクロ – SolidWorks VBA解析バイブル

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

テンプレート選択の「待ち時間」をゼロにする。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との対話」のプロセスに過ぎません。一つずつ、オブジェクトの正体を確認していけば、必ず制御できるようになりますよ。

応援しています。次回のレッスンでお会いしましょう!

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