マクロ記録から脱却せよ:図面内の「特定テキスト」を一括書き換える、真の自動化への第一歩
こんにちは。設計業務の自動化に取り組む皆さん、日々の業務お疲れ様です。
「図面を1枚ずつ開いて、表題欄の『承認者』をダブルクリックして、名前を書き換えて、保存して……」
もしあなたが今、この作業を繰り返しているとしたら、それは非常に勿体ないことです。SolidWorksには強力なAPI(Application Programming Interface)が備わっており、本来なら数秒のコードで、数百枚の図面を瞬時に更新できる力があるからです。
しかし、多くの初心者が「マクロの記録」という罠に陥ってしまいます。記録されたコードは、座標や選択順序に依存しており、少し図面が変わっただけで動かなくなる「壊れやすいコード」になりがちです。
今日は、その一歩先へ進みましょう。「オブジェクトの構造」を理解し、図面内の特定のテキスト(承認欄や改訂日など)をスマートに探し出し、書き換える手法を伝授します。ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。
1. 核心となる考え方:オブジェクトの階層構造を知る
SolidWorks VBAを操るということは、SolidWorksという巨大な宇宙の中に存在する「物(オブジェクト)」に、命令を送るということです。
図面内のテキストを書き換えるためには、以下の「住所(階層)」を辿っていく必要があります。これをイメージ図にするとこうなります。
[SldWorks] (宇宙全体)
└── [ModelDoc2] (開いているファイル)
└── [DrawingDoc] (図面としての性質)
└── [Sheet] (図面シート)
└── [Note] (書き換えたいテキスト本体) <--- ここに到達したい!
「マクロの記録」は、単に「今ここをクリックした」という動作を記録しているだけです。一方、プロのコードは「シートの中にある全てのNote(ノート)を順番に調べて、目的の文字を見つけたら書き換える」という論理的な動きをします。
2. 実践:テキスト一括書き換えマクロ
では、実際に使えるコードを見てみましょう。このコードは、「特定のキーワード(例:承認者:)が含まれるノートを探して、その後の内容を書き換える」というロジックを持っています。
そのままコピーして、VBAエディタに貼り付けて試してみてください。
Option Explicit
' ==========================================================================
' テーマ:図面内の特定テキスト(承認欄など)を一括書き換えする
' 使い方:コード内の「検索キーワード」と「新しい値」を書き換えて実行してください
' ==========================================================================
Sub UpdateDrawingNotes()
' --- 変数宣言(プロの作法:何を使うか最初に宣言する) ---
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim swView As SldWorks.View
Dim swNote As SldWorks.Note
Dim swAnnotation As SldWorks.Annotation
Dim vSheetNames As Variant
Dim sheetName As Variant
Dim targetKeyword As String
Dim newValue As String
Dim currentText As String
' --- 設定エリア(ここを書き換えるだけで使い回せます) ---
targetKeyword = "承認者:" ' ← 探したいテキストのキーワード
newValue = "設計部 伝説のエンジニア" ' ← 新しく書き込みたい内容
' ------------------------------------------------------
' SolidWorksへの接続
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' 1. ファイルが開かれているか、図面ファイルかを確認
If swModel Is Nothing Then
MsgBox "図面ファイルを開いてから実行してください。", vbExclamation
Exit Sub
End If
If swModel.GetType <> swDocDRAWING Then
MsgBox "このマクロは図面ファイル専用です。", vbExclamation
Exit Sub
End If
Set swDraw = swModel
' 2. 全てのシートをループ処理
vSheetNames = swDraw.GetSheetNames
' 画面更新を一時停止してパフォーマンスを向上させる(大規模ファイル用)
' swApp.UserControl = False
For Each sheetName In vSheetNames
' シートをアクティブにする
swDraw.ActivateSheet CStr(sheetName)
Set swSheet = swDraw.GetCurrentSheet
' 3. シート上の「ビュー」を辿って「ノート」にアクセスする
' 図面上のテキストは「ビュー」に属していることが多いため、
' Sheet -> 第一ビュー -> その下のノート... という流れで探します
Set swView = swDraw.GetFirstView ' Sheetそのもの
Do While Not swView Is Nothing
' ビューに属する最初のノートを取得
Set swNote = swView.GetFirstNote
' 4. ノートを一つずつチェックしていく
Do While Not swNote Is Nothing
currentText = swNote.GetText
' キーワードが含まれているか判定 (InStr関数を使用)
If InStr(currentText, targetKeyword) > 0 Then
' 見つかったら、新しいテキストを流し込む
swNote.SetText newValue
Debug.Print "更新成功: " & sheetName & " - " & currentText
End If
' 次のノートへ
Set swNote = swNote.GetNext
Loop
' 次のビューへ
Set swView = swView.GetNextView
Loop
Next sheetName
' 5. 変更を確定させる
swModel.EditRebuild3 ' 再構築(画面への反映)
MsgBox "完了しました!" & vbCrLf & "キーワード: " & targetKeyword, vbInformation
End Sub
3. コードの解剖:なぜこれで動くのか?
このコードが「マクロの記録」と決定的に違うポイントを解説します。
① `InStr` 関数による「曖昧検索」
`If currentText = “承認者:” Then` と書いてしまうと、もし図面に「承認者: 山田」と書いてあった場合、一致しないためスルーされてしまいます。
そこで `InStr(currentText, targetKeyword) > 0` を使います。「テキストの中にキーワードが含まれていればOK」という条件にすることで、柔軟性が劇的に上がります。
② `Do While` ループによる「全探索」
「マクロの記録」は、特定の1点しか見ません。しかし、このコードでは `Do While Not swNote Is Nothing` を使い、「次のノートがある限り、最後まで探し続ける」という動きをしています。これにより、シート内にノートがいくつあろうと、自動的に全てチェックしてくれます。
③ ビュー(View)を経由する理由
ここが中級者への分かれ道です。SolidWorksの図面において、ノートは「シート」に直接貼ってあるものだけでなく、「図枠(Title Block)」や「投影図」の中に含まれていることがあります。これらはすべて「View(ビュー)」という入れ物の中に存在します。
`swDraw.GetFirstView` から始まるループは、図面内のあらゆる階層に潜り込むための「潜水艦」のような役割を果たしています。
4. 陥りやすいエラーと回避策(プロのアドバイス)
実際に運用する上で、以下の2点には注意してください。
⚠️ 注意1:タイトルブロック(ブロック)内のテキスト
もし、書き換えたいテキストが「タイトルブロック」というブロック(Block)の中に組み込まれている場合、通常の `Note` としては取得できないことがあります。その場合は、`swBlockInstance` オブジェクトを介して、ブロック内の要素をさらにループで探す必要があります。
(※まずは今回のコードで動くか試し、動かない場合は「ブロック内のノート」という次のステップに進みましょう!)
⚠️ 注意2:実行速度と画面のチラつき
大量の図面を処理する場合、シートを切り替える動作(`ActivateSheet`)が重くなることがあります。
もし「画面を見せる必要はなく、裏で高速に処理したい」のであれば、さらに高度な「選択なしでの操作」が必要になりますが、まずは「確実に動くこと」を優先するのが上達の近道です。
まとめ:ここをクリアすれば、次が見えてくる
お疲れ様でした!
今回のコードを理解できたあなたは、もう「座標を指定して、そこをクリックする」という不安定な自動化からは卒業しました。
「オブジェクトを階層的に辿り、条件に合うものをループで見つけ出す」
この考え方は、図面だけでなく、アセンブリの部品制御や、パラメータの書き換えなど、SolidWorks APIのあらゆる場面で共通する黄金律です。
次は、このコードを応用して「複数のファイルを開いて、保存して、閉じる」という処理を加えてみてください。それができれば、あなたはもう立派な「自動化エンジニア」の仲間入りです。
応援していますよ!
