こんにちは、ユーキです。
今回は、たくさんある図形(オートシェイプ)の中に書かれている文字列を検索する方法を紹介します。
図形(オートシェイプ)の文字列検索
それでは早速、やってみましょう。
図形(オートシェイプ)の一覧を取得
まずは、図形(オートシェイプ)の一覧を取得します。取得には、SheetのShapesオブジェクトを使用します。Shapeオブジェクトのコレクションなので、ForEach文でループすれば、各図形(オートシェイプ)を取得することができます。
Dim sp As Variant
For Each sp In ActiveSheet.Shapes
Debug.Print sp.Name
Next
図形(オートシェイプ)のテキストの取得
TextFrame2プロパティを使います。ただし、TextFrame2プロパティはExcel2007以降になるため、Excel2003まではTextFrameプロパティを使うことになります。
Excel2007以降の場合
TextFrame2プロパティを使います。
Dim sp As Variant
For Each sp In ActiveSheet.Shapes
Debug.Print sp.TextFrame2.TextRange.Text
Next
上記のコードだと、線など文字列がない図形(オートシェイプ)があるとエラーになってしまうため、文字列があるかどうかの判定条件を追加しましょう。
文字列があるかどうかの判定には、TextFrame2.HasTextプロパティを使います。
Dim sp As Variant
For Each sp In ActiveSheet.Shapes
If sp.TextFrame2.HasText Then
Debug.Print sp.TextFrame2.TextRange.Text
End If
Next
Excel2003までの場合
Excel2003だと、TextFrame2プロパティが使用できないため、TextFrameプロパティを使います。
Dim sp As Variant
For Each sp In ActiveSheet.Shapes
Debug.Print sp.TextFrame.Characters.Text
Next
Charactersメソッドがない図形(オートシェイプ)もあるので、On Error Resume Nextで処理が中断することがないようにしておきます。エラートラップについては、【Excel VBA】エラートラップ をご覧ください。
文字列の検索
文字列の検索については、指定した文字列が含まれているかで判断をすることにします。使用するメソッドはInstrメソッドとなります。
Instrメソッドは、指定した文字列の中に、検索文字列が存在する場合、存在した位置を戻します。1以上の値が戻れば、指定した文字列が存在することになります。
Excel2007以降の場合
Dim sp As Variant
Dim seachKey As String
seachKey = "試験"
For Each sp In ActiveSheet.Shapes
If sp.TextFrame2.HasText Then
If InStr(sp.TextFrame2.TextRange.Text, seachKey) > 0 Then
Debug.Print sp.Name
End If
End If
Next
Excel2003までの場合
Dim sp As Variant
Dim seachKey As String
seachKey = "TEST"
For Each sp In ActiveSheet.Shapes
If InStr(sp.TextFrame.Characters.Text, seachKey) > 0 Then
Debug.Print sp.Name
End If
Next
まとめ
今回は、オートシェイプの文字列を検索する方法について述べました。
- Sheet.Shapesオブジェクトでオブジェクトが取得できる
- オートシェイプの文字列は、TextFrameまたはTextFrame2を使用する
- 文字列検索は文字列が含まれているかと考えて、Instrメソッドを使用する
少しでもお役に立てば、幸いです。