データの分析、グラフ作成、および通信のためのツールを備えた Microsoft 表計算ソフトウェアのファミリ。
>For Eachですので大丈夫なのかもしれませんが、オブジェクトの削除は
>後ろのほうからやるほうが紛れがありません。
少し補足しますと、次のような理由です。
For i=0 to n
Item(i).Delete
next
とやる方が結構いるのですが、これをやると、削除の度にコレクションのインデックスとの対応が前にずれてきて、おかしなことになります。
For Eachの場合は大丈夫なような気もするのですが、For Eachの検索順がはっきりしませんので、私は削除は逆順からやることにしてます。
>MsgBox Shp.DrawingObject.Captionの部分でとまってしまいました。
msoTextBoxのチェックをはずしたためです。
そのようにした理由はTextBoxではなくAutoShapeでチェックにかからなかったのではないかと疑ったためです。
ただ、確かにテキストが入っていないオートシェイプなどがあるとコケますので一工夫必要になります。
その疑いを捨てきったわけではありませんので、次のようにされたらいかがでしょうか?
(もし、テキストボックスだけと確信があればmsoTextboxのチェックでかまいません)
1.文字列のはいっていないものはエラーになって無視される
2.テキストの中に"テスト"が入っているものをピックアップする。(前後にブランクなどがあっても拾う)
3.一応逆順に検索
Sub aaa()
Dim wShp As Shape, wText As String, I As Long
For I = ActiveSheet.Shapes.Count To 1 Step -1
Set wShp = ActiveSheet.Shapes(I)
On Error Resume Next
wText = wShp.TextFrame.Characters.Text
If Err.Number = 0 Then
If InStr(wText, "テスト") > 0 Then
MsgBox wText
End If
End If
On Error GoTo 0
Next
End Sub