【入門編】【初心者向け】図面シートプロパティの自動書き換えと図面情報の一括更新VBA – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは! SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。

「マクロの記録」ボタンを押して図面を作り、いざ自動化しようとVBAエディタを開いたものの……生成された暗号のようなコードの山を見て、そっとウィンドウを閉じた経験はありませんか?

「図面枠の図面番号や尺度を、一括でスマートに変更したい」
「毎回手作業でプロパティを入力し直すミスをなくしたい」

日々の設計業務で誰もが直面するこの悩み、実はSolidWorks APIの本質を少しだけ知るだけで、驚くほど簡単かつエレガントに解決できます。

今回は、初心者の方でも安心して一歩を踏み出せるように、「図面シートプロパティの自動書き換えと一括更新」をテーマに、実戦でそのまま使えるVBAコードと、その裏側にあるSolidWorksの「お作法」を分かりやすく解説していきます。

ここをクリアすれば、あなたのSolidWorks VBAの基本はバッチリです。一緒にマスターしていきましょう!

—

1. なぜ「マクロの記録」だけでは図面プロパティを操作できないのか?

まず最初に、知っておくべき重要なお話があります。
SolidWorksの「マクロの記録」機能は素晴らしいツールですが、図面枠(シートプロパティやカスタムプロパティ)の操作に関しては、記録されるコードが「その場しのぎのハードコーディング(固定値の指定)」になりがちです。

例えば、マクロの記録を使うと以下のようなコードが吐き出されます。

  • 「シート1を選択する」
  • 「特定のテキストボックスを無理やりクリックして文字を書き換える」

これでは、図面のシート名が変わったり、図面サイズが異なったりした瞬間にエラーを起こしてしまいます。私たちが目指すのは、「今開いている図面の構造をプログラム自身に理解させ、安全にデータを流し込む」という、プロフェッショナルなアプローチです。

—

2. SolidWorks図面データの「階層構造」を理解しよう

コードを書く前に、SolidWorksが図面データをどのように管理しているか、頭の中の地図を作りましょう。

SolidWorksの図面ファイル(`.slddrw`)は、以下のようなピラミッド構造を持っています。

1. SldWorks アプリケーション(大元)

  • ModelDoc2(アクティブな図面ドキュメント)
  • DrawingDoc(図面特有の機能を持つオブジェクト)
  • Sheet(図面シート ※複数存在可能)
  • CustomPropertyManager(プロパティ管理機構)

私たちが今回アプローチするのは、一番下の階層にある「カスタムプロパティ(表題欄に連動するデータ)」と、シート自体のプロパティです。ここをAPI経由で直接書き換えることで、画面上のクリック操作を一切することなく、一瞬で情報を同期させます。

—

3. 【実践】図面プロパティ一括更新VBAスクリプト

それでは、実際のコードを見ていきましょう。
以下のコードをSolidWorksのVBAエディタ([ツール] > [マクロ] > [新規作成])にそのまま貼り付けて実行してみてください。

実務でそのままコピペして使えるよう、丁寧なコメントを添えています。

Sub UpdateDrawingProperties()
‘ =====================================================================
‘ 目的: アクティブな図面のカスタムプロパティ(表題欄用)を一括更新する
‘ 対象: 初心者〜中級者向け
‘ =====================================================================

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim swCustPropMgr As SldWorks.CustomPropertyManager

Dim boolstatus As Boolean
Dim nRetval As Long

‘ 1. SolidWorks アプリケーションの取得
Set swApp = Application.SldWorks
If swApp is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “エラー”
Exit Sub
End If

‘ 2. 現在アクティブなドキュメントを取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “図面ファイルが開かれていません。”, vbExclamation, “警告”
Exit Sub
End If

‘ 3. アクティブなドキュメントが「図面(Drawing)」かどうかの安全チェック
If swModel.GetType() <> swDocDRAWING Then
MsgBox “このマクロは図面ファイルでのみ実行可能です。”, vbExclamation, “エラー”
Exit Sub
End If

‘ 4. DrawingDoc インターフェースへのキャスト(図面特有の操作を行うため)
Set swDraw = swModel

‘ 5. 現在アクティブなシートの情報を取得
Set swSheet = swDraw.GetCurrentSheet
Dim sheetName As String
sheetName = swSheet.GetName()

‘ 6. ドキュメント全体のカスタムプロパティマネージャーを取得
‘ ※図面枠(表題欄)のテキストが「図面プロパティ」にリンクしている場合、ここを操作します
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)

‘ — 【ここを書き換えて実務に活用!】 ———————————
‘ 引数: ( プロパティ名, リンクフラグ, 設定する値 )
‘ リンクフラグは通常スルーしてOKですが、Add3メソッド等を使うのが確実です。
‘ ———————————————————————

Call SetOrAddProperty(swCustPropMgr, “DRAWING_NO”, “DWG-2023-001”)
Call SetOrAddProperty(swCustPropMgr, “TITLE”, “自動化サンプル電動アクチュエータ”)
Call SetOrAddProperty(swCustPropMgr, “SCALE”, swSheet.GetScale()) ‘ シートの尺度を自動取得して設定
Call SetOrAddProperty(swCustPropMgr, “DESIGNED_BY”, “AI Architect”)

‘ 7. 変更を画面に反映させるために再描画
swModel.ForceRebuild3 False

‘ 完了メッセージ
MsgBox “図面シート「” & sheetName & “」のプロパティが一括更新されました!”, vbInformation, “完了”

End Sub

‘ =====================================================================
‘ サブルーチン: プロパティが存在すれば更新、なければ新規追加する安全関数
‘ =====================================================================
Private Sub SetOrAddProperty(propMgr As SldWorks.CustomPropertyManager, propName As String, propValue As String)
Dim valOut As String
Dim resolvedValOut As String
Dim status As Long

‘ プロパティが既に存在するかチェック
propMgr.Get4 propName, False, valOut, resolvedValOut

If resolvedValOut = “” And valOut = “” Then
‘ 存在しない場合は新規追加 (型はテキスト = 30)
status = propMgr.Add3(propName, 30, propValue, 1)
Else
‘ 既存の場合は値を上書き
status = propMgr.Set2(propName, propValue)
End If
End Sub

—

4. コードの注目ポイント(ここが分かれば怖くない!)

初心者の方が躓きやすいポイントを、エンジニアの視点でいくつか解説しておきます。

① 型チェックの重要性(`swModel.GetType()`)

SolidWorksのマクロでは、「今、何が開かれているか」を意識することが極めて重要です。部品図が開かれている状態で図面用のコードを実行すると、思わぬバグや強制終了を引き起こします。
コード内の `If swModel.GetType() <> swDocDRAWING Then` は、暴走を防ぐための「命綱」です。これを必ず入れる癖をつけましょう。

② 既存プロパティへの優しさ(`SetOrAddProperty` 関数)

実務でマクロを組むとき、一番面倒なのが「すでにプロパティが存在する場合」と「新規の場合」で処理が変わることです。
今回のサンプルコードで用意した `SetOrAddProperty` サブルーチンは、「無ければ作り、有れば書き換える」という賢い(Idempotentな)処理を行っています。これを使い回すだけで、エラーの9割を防げます。

③ シート尺度の連動(`swSheet.GetScale()`)

図面のプロパティ(表題欄)によくある「SCALE(尺度)」の項目。手動だと書き換えを忘れがちですが、APIを使えば現在のシート尺度をプログラムが自動で読み取り、そのままプロパティに流し込むことができます。

—

5. まとめと次のステップ

今回は、図面シートプロパティの自動書き換えと一括更新を通じて、SolidWorks VBAの基礎と安全なオブジェクト操作の極意をお伝えしました。

  • マクロの記録に頼りきらず、ドキュメントの構造(階層)を意識する
  • 実行前には必ずドキュメントの種類(`GetType`)をチェックする
  • プロパティの有無を判定して安全に上書き・追加する

ここをクリアできれば、あなたはもう「初心者マーク」を卒業し、立派な自動化エンジニアの入り口に立っています。

このコードをベースに、Excelから部品リストを読み込んで一括流し込みにするなど、さらなる応用へとステップアップしてみてください。あなたの設計業務が劇的に効率化されることを、心から応援しています!

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