【入門編】【初心者向け】図面シート上の特定テキストノートを検索し指定文字列へ一括置換するVBA – SolidWorks VBA解析バイブル

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

「マクロの記録」を卒業しよう。図面内のテキストを一括置換する、エンジニアへの第一歩

こんにちは。設計業務の自動化、楽しんでいますか?

「マクロの記録」ボタンを押して、自分の操作を記録する。これは素晴らしい第一歩です。しかし、もしあなたが「特定の文字だけを、図面全体から探して書き換えたい」と思ったとき、記録したマクロでは太刀打ちできないことに気づいたはずです。

なぜなら、マクロの記録は「次に何をするか」は教えてくれますが、「今、何がどこにあるか」を判断する知能を持っていないからです。

今日は、そんな「記録マクロ」の限界を突破し、図面内のノート(テキスト)を自在に操るための、本質的なコードの書き方を伝授します。ここをクリアすれば、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におけるあらゆる自動化の基本形です。

この構造を理解していれば、次は「ノートの色を変える」「特定の部品の部品番号を書き換える」「図面枠を自動生成する」といった、より高度な領域へ自然と進んでいくことができます。

一歩ずつ、着実に。
次はどんな自動化に挑戦しますか? 応援していますよ!

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