「マクロの記録」を卒業しよう。図面内のテキストを一括置換する、エンジニアへの第一歩
こんにちは。設計業務の自動化、楽しんでいますか?
「マクロの記録」ボタンを押して、自分の操作を記録する。これは素晴らしい第一歩です。しかし、もしあなたが「特定の文字だけを、図面全体から探して書き換えたい」と思ったとき、記録したマクロでは太刀打ちできないことに気づいたはずです。
なぜなら、マクロの記録は「次に何をするか」は教えてくれますが、「今、何がどこにあるか」を判断する知能を持っていないからです。
今日は、そんな「記録マクロ」の限界を突破し、図面内のノート(テキスト)を自在に操るための、本質的なコードの書き方を伝授します。ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。
1. 設計図を理解する:オブジェクトの「階層構造」
コードを書く前に、まず頭の中に「地図」を作ってください。SolidWorksの世界は、厳格な親子関係(階層構造)で成り立っています。
図面(Drawing)において、ノート(Note)に辿り着くまでのルートは、一般的に以下のようになります。
1. SldWorks(アプリケーション本体)
2. └ DrawingDoc(開いている図面ファイル)
3. └ Sheet(図面シート)
4. └ View(投影図などのビュー)
5. └ Note(テキストエンティティ)
ここで一つ、プロの視点を授けます。
実は、ノートには2種類あります。
- ビューに属するノート: 投影図(正面図など)の中に書き込まれたテキスト。
- シートに属するノート: 図面枠や表題欄など、ビューの外に置かれたテキスト。
初心者の方は「ビューの中だけ探せばいい」と思いがちですが、図面枠の情報を書き換えたいなら、シート直下のノートも探す必要があります。今回のコードでは、この両方をスマートに処理する方法を学びます。
2. 実践:特定文字列を一括置換するコード
それでは、実際のコードを見てみましょう。このコードは、そのままコピーして標準モジュールに貼り付けて動作させることができます。
Option Explicit
''
' テーマ: 図面内の特定文字列を検索し、新しい文字列に置換する
' ターゲット: 全てのビューのノート、およびシート上のノート
''
Sub ReplaceDrawingNotes()
' --- 1. 変数の宣言 (メモリを効率的に使うための準備) ---
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
' 置換用の設定(ここを書き換えて使います)
Const TARGET_TEXT As String = "OLD_VALUE" ' 検索する古い文字列
Const REPLACE_TEXT As String = "NEW_VALUE" ' 置換後の新しい文字列
Dim replaceCount As Integer
replaceCount = 0
' --- 2. SolidWorksへの接続とドキュメントの確認 ---
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' 図面が開かれていない、または図面ファイルでない場合は終了
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
' --- 3. ノートの走査(探索)プロセス ---
' SolidWorksのビューは「数珠つなぎ(Linked List)」になっています。
' GetFirstView で最初のビューを取得し、GetNextView で次へと辿ります。
Set swView = swDraw.GetFirstView ' 最初のビュー(通常はシートそのもの)を取得
Do While Not swView Is Nothing
' 現在のビューに存在する最初のノートを取得
Set swNote = swView.GetFirstNote
' そのビュー内の全てのノートをループ処理
Do While Not swNote Is Nothing
Dim currentText As String
currentText = swNote.GetText ' 現在のノートのテキストを取得
' 文字列が含まれているかチェック
If InStr(1, currentText, TARGET_TEXT) > 0 Then
' 文字列の置換処理
Dim newText As String
newText = Replace(currentText, TARGET_TEXT, REPLACE_TEXT)
' ノートに新しいテキストを書き戻す
swNote.SetText newText
replaceCount = replaceCount + 1
End If
' 次のノートへ
Set swNote = swNote.GetNextNote
Loop
' 次のビューへ
Set swView = swView.GetNextView
Loop
' --- 4. 結果の報告 ---
If replaceCount > 0 Then
MsgBox replaceCount & " 箇所のテキストを置換しました。", vbInformation
Else
MsgBox "対象となる文字列は見つかりませんでした。", vbInformation
End If
End Sub
3. コードの深掘り:何が起きているのか?
このコードを「ただの暗記」で終わらせてはいけません。重要なポイントを解説します。
① `Do While Not swView Is Nothing` の魔法
ここがプログラミングの醍醐味です。
「ビューがある限り、ずっと繰り返せ」という命令です。ビューがいくつあっても、1つしかなくても、このループ構造を使えばプログラムは自動的に判断してくれます。これが「マクロの記録」にはできない「判断力」です。
② `InStr` と `Replace` 関数の組み合わせ
- `InStr`: 文字列の中に、探したい文字が「どこにあるか」を教えてくれます。見つからなければ 0 を返します。
- `Replace`: 文字列の一部を、別の文字に入れ替えます。
これらを組み合わせることで、「ノート全体を書き換える」のではなく、「ノートの中の一部だけをピンポイントで書き換える」という高度な操作が可能になります。
③ `Option Explicit` を必ず書く
コードの先頭にあるこの一行。これは「変数を宣言せずに使うことを禁止する」という、エンジニアとしての規律です。これがないと、タイポ(打ち間違い)をしたときに、VBAはエラーを出さずに「新しい未知の変数」として勝手に処理を進めてしまい、原因不明のバグを生みます。絶対に忘れないでください。
4. 陥りやすいエラーと対策(トラブルシューティング)
現場では、コード通りにいかないことが多々あります。
- 「対象が見つからない」と言われる
- 原因:`TARGET_TEXT`(検索文字列)が、図面上の表記と完全に一致していますか?(全角・半角の違い、スペースの有無に注意してください)
- マクロが途中で止まる
- 原因:図面が「読み取り専用」になっていたり、編集不可の状態で開かれていたりしませんか?
- 動作が重い
- 原因:大規模な図面で、何百ものビューがある場合、ループ処理に時間がかかります。この場合は、特定のシート名に限定して走査するなどの最適化が必要になります。
最後に:エンジニアとしてのマインドセット
このマクロは、あくまで小さな一歩です。
しかし、「オブジェクトを辿り(Traverse)、条件を判定し(Check)、状態を更新する(Update)」というこの流れは、SolidWorks VBAにおけるあらゆる自動化の基本形です。
この構造を理解していれば、次は「ノートの色を変える」「特定の部品の部品番号を書き換える」「図面枠を自動生成する」といった、より高度な領域へ自然と進んでいくことができます。
一歩ずつ、着実に。
次はどんな自動化に挑戦しますか? 応援していますよ!
