VBAを使ったテキストボックスの内容設定でエラーが発生する理由

このQ&Aのポイント
  • 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メソッドを使用することで、テキストボックスが選択され、その後の操作が可能になります。
回答を見る
  • ベストアンサー

テキストボックスの表示

VBAを使って、テキストボックスに表示される内容を設定しているのですが、 下記のように記述とOKですが、 Shapes.Range(Array("Text Box 1")).Select Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "test" Selectを抜かして、 Shapes.Range(Array("Text Box 1")).ShapeRange(1).TextFrame2.TextRange.Characters.Text = "test" のように記述するとエラーになります。 原因がよくわからないのですが、なぜなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

「.ShapeRange(1)」は不要です。 以下でOKかと。 Shapes.Range(Array("Text Box 1")).TextFrame2.TextRange.Characters.Text = "test"

その他の回答 (1)

回答No.2

こんばんは。 なぜ、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

miya2004
質問者

お礼

ありがとうございます。 マクロの記録で保存されたコードにSelectがあったので 消して1行にしてみたら、エラーになったので、疑問に思いました。 VBAはまだわかっていないので、これから勉強です。

関連するQ&A

  • エクセルVBAでテキストボックスに文字

    Excel2016です。 ワークシート上に配置した、図形の「テキストボックス」に文字を入れるVBAについての質問です。 下記のTEST01では期待通り文字が入りますが、これはテキストボックスをSelectしなければなりません。 TEST02ならSelectせずにOKかと思ったら実行時エラーとなりました。 どのように修正したらよろしいのでしょうか? Sub TEST01()   Sheets(“Sheet1”).Shapes.Range(Array("TextBox 3")).Select   Selection.ShapeRange.TextFrame2.TextRange.Characters.Text = "TEST/TEST/2020"   Selection.ShapeRange.TextFrame2.TextRange.Font.Name = "Meiryo UI"   Selection.ShapeRange.TextFrame2.TextRange.Font.Bold = msoTrue End Sub Sub TEST02()   With Sheets(“Sheet1”).Shapes.Range(Array("TextBox 3"))     .ShapeRange.TextFrame2.TextRange.Characters.Text = "TEST/TEST/2020"     .ShapeRange.TextFrame2.TextRange.Font.Name = "Meiryo UI"     .ShapeRange.TextFrame2.TextRange.Font.Bold = msoTrue   End With End Sub

  • エクセル VBA : テキストボックスのグループ化

    エクセル VBAにてテキストボックスをグループ化したいのです。 マクロを記録すると、 ActiveSheet.Shapes.Range(Array("Oval 82", "Text Box 83")).Select Selection.ShapeRange.Group.Select となります。 "Text Box 83"のように常に名前が固定されているわけではないので、セルのA1からC10にある図形を選択してグループ化するようにしたいのです。 ご存知の方、アドバイス願います。

  • VBAでテキストボックスを編集したいのですが

    エクセル2003のVBAで、グラフシート上にあるテキストボックスに\"test\"という文字を入れていこうとしています。既存のテキストボックスの文字を変更したいのです。 あれこれコードを試しているのですがエラーばかりでうまくいきません。 以下、エラーが出るコードです。 どう直せばよろしいでしょうか。 Workbooks(\"matome.xls\").Charts(\"Graph_THC_L\").Shapes(\"Text Box 1\").Characters.Text = \"test\" Workbooks(\"matome.xls\").Charts(\"Graph_THC_L\").TextFrame.Characters.Text = \"test\"

  • マクロを使ってexcel2007でテキストボックス内をセンタリングしたい

    以前、excel2000でマクロの児童記録で記録し、それを利用して 下のようなマクロを使っていました (列ボックス1は変数) ActiveSheet.Shapes.AddTextbox(msoTextOrientationVerticalFarEast, 列ボックス1, 205 , 15, 105).Select Selection.Characters.Text = 顧客名 With Selection.Characters.Font .Name = "MS Pゴシック" .FontStyle = "標準" .Size = 8 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = 3 End With With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlTop .Orientation = xlVertical .AutoSize = False .AddIndent = False End With Selection.ShapeRange.Fill.Visible = False Selection.ShapeRange.Fill.Solid Selection.ShapeRange.Fill.Transparency = 1# Selection.ShapeRange.Line.Weight = 0.75 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoFalse Selection.ShapeRange.TextFrame.MarginLeft = 0 Selection.ShapeRange.TextFrame.MarginRight = 0 Selection.ShapeRange.TextFrame.MarginTop = 0 Selection.ShapeRange.TextFrame.MarginBottom = 0 これで問題なく動作していたのですが excel2007で動作させると テキストボックス内が水平方向にセンタリングされていません。 excel2007でテキストボックスをかく記録をしてもマクロには何も残らず 困っています。 excel2007でも、センタリングさせる方法を教えて下さい どうかよろしくお願いします

  • 【.NET】WordのテキストボックスのCharactersを探しております

     こんにちは.  質問させていただきます.どうぞよろしくお願いいたします.  VB.NETからWordのテキストボックスをいじっております.  試しにExcelで動かしてみると,Shape.TextFrame.TextRange.Charactersで やりたいことができるのですが,Wordの場合,    Shape.TextFrame.TextRange. と    Shape.TextFrame.      のどちらにも Charactersが見つからないと言われ,悩んでおります. エラーメッセージは「公開メンバ 'Characters' は型 'Range' に見つかりませんでした。」 「公開メンバ 'Characters' は型 'TextFrame' に見つかりませんでした。」 です.  VB2008でWord2007をいじろうとしておりますが,もしお詳しい方が いらっしゃいましたら,アドバイスをいただけないでしょうか...  また,よく今回のようにメンバやプロパティを探すのに四苦八苦する ことがあるのですが,こんな風に調べるといいよ,みたいなのが もしもございましたら,皆様のお知恵を拝借いたしたくお願いいたします.  どうぞよろしくお願いいたします.

  • Excel VBA テキストボックスの値の取得

    テキストボックスの値が必要となり参照しようと思い、検索したところdebug.printにある3つの方法がヒットし、試して見ましたが、エラーになります。 テキストボックスの名前にはどれもtxtの文字を含んでいます。 Sub ShapeValue() Dim Shp As Shape For Each Shp In ActiveSheet.Shapes If InStr(Shp.Name, "txt") <> 0 Then Debug.Print Shp.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません。 Debug.Print Shp.TextFrame2.TextRange.Text '指定された値は境界を超えています。 Debug.Print Shp.ShapeRange.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません End If Next Shp End Sub どうすれば取得できるでしょうか?

  • Excel マクロ 任意のセルから実行したい

    こんにちは、Excel2003を使用しています。 ExcelでK55からE55までのセルの値を削除して(空白にして) それぞれに「---を引いた透明のダイアローグボックス」を コピーしていくマクロを作成したことがあります。 このときは開始するセルがK55と決まっていたのですが 今度は任意のセルから(たとえば選択したセルの右隣とか) 実行したいのですがどのようにマクロを作ればよいでしょうか ご存じの方お教えください。 なお参考に上記のマクロを記載します。 Range("E55:J55").Select Selection.ClearContents Range("H55").Select ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 672#, 729#, _ 81#, 13.5).Select Selection.Characters.Text = "" With Selection.Font .Name = "MS Pゴシック" .FontStyle = "標準" .Size = 11 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With Selection.ShapeRange.Fill.Visible = msoFalse 'Selection.ShapeRange.Fill.Solid 'Selection.ShapeRange.Fill.Transparency = 0# Selection.ShapeRange.Line.Weight = 0.75 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoFalse ActiveSheet.Shapes("Text Box 12").Select Selection.Characters.Text = "---" With Selection.Characters(Start:=1, Length:=3).Font .Name = "MS Pゴシック" .FontStyle = "標準" .Size = 11 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With Selection.HorizontalAlignment = xlCenter Range("K55").Select ActiveSheet.Shapes("Text Box 12").Select Selection.Copy Range("I55").Select ActiveSheet.Paste Range("H55").Select ActiveSheet.Paste Range("G55").Select ActiveSheet.Paste Range("F55").Select ActiveSheet.Paste Range("E55").Select ActiveSheet.Paste Range("E56").Select Selection.Copy Range("F56:J56").Select ActiveSheet.Paste Application.CutCopyMode = False Range("E56:J56").Select Selection.Copy Range("E57:E59").Select ActiveSheet.Paste Application.CutCopyMode = False Range("K59").Select End Sub

  • エクセル VBA 画像操作

    VBAについて質問です。 画像を何枚かを重ねて、シート上に置いてあります。 VLOOKUPにて、画像番号を獲得して、その番号の画像を最上面へ移動させたいのですが ActiveSheet.Shapes.Range(Array("Picture 201")).Select ActiveWindow.SmallScroll ToRight:=-342 Selection.ShapeRange.ZOrder msoBringToFront ActiveSheet.Shapes.Range(Array("Picture 221")).Select ActiveWindow.SmallScroll ToRight:=-342 Selection.ShapeRange.ZOrder msoBringToFront ActiveSheet.Shapes.Range(Array("Picture 215")).Select ActiveWindow.SmallScroll ToRight:=-342 Selection.ShapeRange.ZOrder msoBringToFront ("Picture 215")の部分を、セルの値で変更したいのですが どうか、お力お貸しください。 よろしくお願いします。

  • オブジェクト名が同じ図形の変更

    アクティブセル値と同じオブジェクト名のテキストボックスが複数有ります。そのテキストボックスの大きさやテキスト(アクティブセル値と同じ)の内容に書き換えたいと思っています。 サイズとテキスト書き込みのステートメントをFor Eachで括りました。 途中にMsgboxを入れて確認するとボックスの数だけ繰り返しているのは間違いないのですが、変更できるのは1個だけです。 最初に作った(?)テキストボックスのみを何度も書き換えているのかな?と思っているのですが、複数個の変更をするにはどの様にしたらいいのでしょうか。 宜しくお願い致します。 Sub test() A = ActiveCell.Formula For Each shp In ActiveSheet.Shapes If shp.Name = A Then ActiveSheet.Shapes(A).Select Selection.ShapeRange.Height = 19.5 Selection.ShapeRange.Width = 19.5 With ActiveSheet.Shapes(A).TextFrame .Characters.Text = A End With With Selection.Font .Size = 7 End With End If Next shp End Sub

  • VBAのGroup化について

    お世話になります。以下のマクロがうまく動きません。 ------------------------------------------------- Dim objShp1 As Shape For Each objShp1 In ActiveSheet.Shapes If objShp1.Name = "Picture 3" Then ActiveSheet.Shapes.Range(Array("A", "B", "Picture 3")).Select Selection.ShapeRange.Group.Select Selection.ShapeRange.ThreeD.RotationX = -180 Selection.ShapeRange.IncrementLeft 0 Selection.ShapeRange.IncrementTop 0 Else ActiveSheet.Shapes.Range(Array("A", "B")).Select Selection.ShapeRange.Group.Select <---------(1) Selection.ShapeRange.ThreeD.RotationX = -180 Selection.ShapeRange.IncrementLeft 0 Selection.ShapeRange.IncrementTop 0 End If Next ------------------------------------------------- このマクロは全体の一部分になりますが、(1)のところでエラーになります。 どこが間違っているのか、さっぱりわかりません。 すみませんが、お助けいただければ幸いです。

専門家に質問してみよう