- ベストアンサー
VBAを使ったテキストボックスの内容設定でエラーが発生する理由
- VBAを用いてテキストボックスに表示される内容を設定する際に、一部の記述方法ではエラーが発生することがあります。
- Shapes.Range(Array("Text Box 1")).Selectという記述では正常に動作しますが、Shapes.Range(Array("Text Box 1")).ShapeRange(1).TextFrame2.TextRange.Characters.TextというようにSelectを抜かすとエラーになります。
- 原因は、ShapeRange(1)がShapeRange型のオブジェクトを返すため、Selectメソッドで選択されないためです。Selectメソッドを使用することで、テキストボックスが選択され、その後の操作が可能になります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「.ShapeRange(1)」は不要です。 以下でOKかと。 Shapes.Range(Array("Text Box 1")).TextFrame2.TextRange.Characters.Text = "test"
その他の回答 (1)
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 なぜ、Range(Array("Text Box 1"))と中身を配列にしているのでしょうか? そこが、分かりませんが、つまり複数あるということですか? それを、掲示板に載せるときに、省いたということのように想像します。 それと、今、マクロが通っているなら、そのままお使いになって構わないはずです。この手のことを詳しく書いているテキストは少ないはずですし、Selectionを抜かなければならないということでもないと思います。自然に、上達すれば覚えられます。 あえて、質問文そのままのコードを、リクエストどおりの回答をするなら、 Shapes.Range(Array("Text Box 1"))(1).TextFrame2.TextRange.Characters.Text = "test" となります。配列になっているのですから、やむを得ません。Arrayの中を複数にしても可能ですが、Array("Text Box 1","Text Box 2" ) という書き方のスタイルになります。 ある程度、上達すれば、そのような関数式のような書き方はしませんが、かといって、以下の私のコードは、きれいなコードにはなりません。なお、以下は、標準モジュールからですから、With ActiveSheetが入っていますが、シートモジュールなら、そのままダイレクトに、Shapes...で始まって構いません。 '// 全部のテキストボックスの内容を変える場合 Sub TestMacro1() Dim shp As Shape On Error Resume Next With ActiveSheet For Each shp In .Shapes If shp.AutoShapeType = msoShapeRectangle Then shp.DrawingObject.Text = "Test1" End If Next shp End With End Sub '// 特定のテキストボックスの内容を変える場合 Sub TestMacro2() Dim shpNames As Variant Dim n As Variant shpNames = Array("Text Box 1", "Text Box 2") On Error Resume Next With ActiveSheet For Each n In shpNames .Shapes(n).DrawingObject.Text = "Test2" Next n End With End Sub
お礼
ありがとうございます。 マクロの記録で保存されたコードにSelectがあったので 消して1行にしてみたら、エラーになったので、疑問に思いました。 VBAはまだわかっていないので、これから勉強です。