【入門編】【SolidWorks VBA入門】マクロの記録から始める最初の部品自動作成とコードの読み解き方 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の世界へようこそ。
私はこれまで数々の現場で、設計の退屈な繰り返し作業をVBAの力で消し去ってきたチーフアーキテクトです。

「マクロの記録ボタンを押して、直方体を作ってみたけれど、生成されたコードを見たら英語の呪文のようで頭がクラクラする……」
そんな絶望感を味わっていませんか?安心してください。誰もが最初はそこからスタートします。

今回は、マクロの記録という「魔法の杖」が吐き出した生々しいコードを解体し、SolidWorks VBAの心臓部である`SldWorks`オブジェクト`ModelDoc2`インターフェースの正体を、優しく、そして本質的に紐解いていきます。

ここをクリアすれば、あなたのSolidWorks VBAの基礎は完全にバッチリです。さあ、一緒に扉を開けましょう!

1. マクロの記録:それは最高の「自動翻訳機」

プログラミング未経験者がいきなり白紙のエディタに向かうのは、地図を持たずにジャングルへ放り出されるようなものです。だからこそ、私たちは「マクロの記録」を使います。

マクロの記録とは、あなたがSolidWorksの画面上で行ったマウス操作(スケッチを描く、押し出すなど)を、VBAの言葉にリアルタイムで翻訳してくれる「超優秀な通訳」です。

まずは、以下の手順で「直方体を作るマクロ」を記録してみましょう。

1. SolidWorksで新規「部品 (Part)」ドキュメントを開く。
2. 「ツール」>「マクロ」>「記録」をクリック。
3. 適当な平面(例:正面)を選択し、スケッチで「四角形」を描き、適当な寸法(例:100mm × 50mm)を入れる。
4. 「フィーチャー」タブ>「押し出しボス/ベース」で、深さ(例:30mm)の直方体を作成する。
5. 「ツール」>「マクロ」>「停止」をクリックし、適当な名前で保存する。

VBAの編集画面(Alt + F11)を開いて、そのコードを覗いてみてください。……どうですか? 画面が圧倒的なコードの量で埋め尽くされているはずです。

「うわ、無理だ」とブラウザを閉じようとしたあなた、待ってください。
そのコードの大部分は、「マウスがどこをクリックしたか」「画面のズームがどうだったか」といった、機械には不要なゴミ(ノイズ)が含まれているだけなのです。

私たちが本当にコントロールすべき「核心」だけを抽出していきましょう。

2. SolidWorks APIの二大巨頭:`SldWorks` と `ModelDoc2`

SolidWorks VBAのコードを読む・書く上で、絶対に避けて通れないのがオブジェクトモデルの階層構造です。

現場のアーキテクトとして、ここは一番分かりやすく、かつ正確に伝えます。SolidWorksのAPI世界は、巨大な「会社組織」のようなものです。

[SldWorks アプリケーション] (社長)
└─ [ModelDoc2 ドキュメント] (現場監督 / 現在開いている部品やアセンブリ)
└─ [Feature / Body / Sketch] (作業員 / 実際の形状やスケッチ)

① `SldWorks`(アプリ全体を統括する社長)

マクロの最初に必ず登場する `Dim swApp As SldWorks.SldWorks` は、「SolidWorksという巨大なアプリケーションそのもの」を指します。ファイルを開いたり、新規作成したり、画面全体の環境設定を変えるのはこの「社長(swApp)」の仕事です。

② `ModelDoc2`(現在アクティブなファイルを仕切る現場監督)

そして、私たちが普段操作している「部品」や「図面」そのものを指すのが `ModelDoc2` です。
「穴を開ける」「色を変える」「保存する」といった、「今開いているモデルに対する命令」の9割は、この現場監督(ModelDoc2)を通じて行われます。

3. 記録されたコードを「人間が読める実用コード」にリファクタリングする

それでは、マクロの記録が吐き出した雑多なコードを削ぎ落とし、プロのエンジニアが書くような美しく、かつエラーに強い「直方体自動生成コード」に生まれ変わらせてみましょう。

VBAエディタを開き、以下のコードを標準モジュールに貼り付けて実行してみてください。

Sub CreateSimpleBox()
‘ ==========================================
‘ 1. 変数の宣言(オブジェクトの型を明確にする)
‘ ==========================================
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim boolstatus As Boolean

‘ ==========================================
‘ 2. アプリケーションとアクティブドキュメントの取得
‘ ==========================================
‘ 起動中のSolidWorksインスタンスを取得
Set swApp = Application.SldWorks

‘ 現在画面で開かれているアクティブなドキュメント(モデル)を取得
Set swModel = swApp.ActiveDoc

‘ 安全装置:もしファイルが開かれていなかったら処理を中断
If swModel Is Nothing Then
MsgBox “部品ファイルが開かれていません。新規作成してください。”, vbCritical, “エラー”
Exit Sub
End If

‘ ==========================================
‘ 3. スケッチとフィーチャーの作成(直方体の生成)
‘ ==========================================
‘ 正面平面を選択してスケッチモードに入る
boolstatus = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)

If boolstatus = False Then
MsgBox “「正面」平面が見つかりませんでした。”, vbCritical
Exit Sub
End If

‘ 2次元スケッチの開始
swModel.SketchManager.InsertSketch True

‘ 中心長方形を描画(中心座標:0,0, 隅の座標:50,25)※単位はメートル(APIの内部単位は常にメートルです!)
Dim vSkSegments As Variant
vSkSegments = swModel.SketchManager.CreateCenterRectangle(0, 0, 0, 0.05, 0.025, 0)

‘ スケッチを終了
swModel.SketchManager.InsertSketch True

‘ 選択を一度クリア
swModel.ClearSelection2 True

‘ 作成したスケッチを選択状態にする(押し出しの対象にするため)
boolstatus = swModel.Extension.SelectByID2(“スケッチ1”, “SKETCH”, 0, 0, 0, False, 0, Nothing, 0)

‘ 押し出しフィーチャーを作成(深さ 20mm = 0.02m)
‘ 引数: 順方向, 両方向か, 終了条件, ドラフト有無, 深さ, …
Dim swFeat As SldWorks.Feature
Set swFeat = swModel.FeatureManager.FeatureExtrusion2( _
True, _ ‘ 順方向へ押し出す
False, _ ‘ 両方向押し出しではない
False, _ ‘ 貫通などの特殊条件なし
0, 0, _ ‘ ドラフト角度など
0.02, 0.01, _ ‘ 押し出し深さ (depth1 = 20mm), depth2
False, False, False, False, _
0, 0, _
False, False, False, False, _
1, True, True _
)

‘ 画面を最新の状態に再描画
swModel.ViewZoomtoFit2

MsgBox “直方体の自動作成が完了しました!”, vbInformation, “完了”
End Sub

💡 現場の知見:APIは「メートル法」で動いている

コードの中に `0.05` や `0.02` という数字が出てきましたね。
画面上では「50mm」「20mm」と入力しているつもりでも、SolidWorksのAPI内部(C++の底部分)では、長さの単位はすべて「メートル(m)」で処理されています。
ここを見落として `50` と書いてしまうと、50メートル(5階建てビル級)の巨大な直方体が生成されて画面から消え去るという、初心者あるあるの怪奇現象が起きますので絶対に覚えておいてください。

4. 陥りやすい罠:「ドキュメントがない状態でコードを走らせるな」

初心者が最も踏みがちで、かつエディタがフリーズしたと勘違いするエラーが、「アクティブなドキュメントがない(部品が開いていない)状態で `swModel` を操作しようとすること」です。

先ほどのコードに仕込んだ、このブロックを見てください。

Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “ファイルが開いていません!”
Exit Sub
End If

この「番犬(`Is Nothing` チェック)」をサボると、`.Extension` や `.FeatureManager` を呼び出した瞬間に `実行時エラー ’91’: オブジェクト変数が設定されていません。` が発生し、マクロが強制終了します。
実務でマクロを書くときは、「今、操作対象のファイルが確実に存在するか?」を必ず最初に確認する防衛的プログラミングを徹底しましょう。

5. まとめ:ここをクリアすれば、次は「パラメータ化」へ進める

お疲れ様でした!
今回は「マクロの記録」という翻訳機を通して、以下の本質を掴んでいただきました。

1. マクロの記録は、コードの書き方を教えてくれる最高の教科書である。
2. SolidWorks VBAは、`SldWorks`(アプリ)`ModelDoc2`(ファイル) の二大巨頭で成り立っている。
3. API内部の単位は「メートル」である。
4. 操作の前にドキュメントの存在確認(`Is Nothing`)を怠るな。

ここをクリアしたあなたなら、もう「マクロの記録に頼りきりの初心者」ではありません。
次のステップでは、このコードの数値を固定値ではなく、「Excelシートから読み込んだ寸法」「ユーザーがフォームに入力した数値」に置き換える、真の設計自動化(パラメータ設計)へと進むことができます。

あなたの自動化ライフの第一歩が、最高のものになりますように。
それでは、また次の現場でお会いしましょう!

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