• ベストアンサー

エクセルのテキストボックスをVBで操作できない

こんにちわ。 VBからエクセルを開いて、帳票を出力したいのですが、 エクセルはフォーマットシートを用意して、そのシートをコピーして書き込むようにしています。 セル単位での書き込みでは問題ないのですが、図形描画のツールボックスにある、「テキストボックス」への書き込みの仕方がどうしてもわかりません。 エクセルのマクロ記録を使って、調べたのところその場合一回目はきちんと書き込んでくれますが、二回目はなぜか「オブジェクト変数 または WITHブロック変数が設定されていません」というエラーが出ます。 なにか開放しなければならないのでしょうか? 一応、実行したマクロを載せておきます。 g_sheetwk.Shapes("text1").select Selection.Characters.Text = "aaaaaa" また、rangeオブジェクトか、shapeオブジェクトにsetしようと試みても、「型が一致しません」と言われてしまいます。 解決策があればお願いいたします。

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.5

Sub Macro1() ActiveSheet.Shapes("Text Box 1").TextFrame.Characters.Text = "a" End Sub よく分からないけど、参考URLを見つけたので真似してみました。

参考URL:
http://www.microsoft.com/japan/support/kb/articles/J027/0/77.asp
takaoPR
質問者

お礼

色々と本当にありがとうございます。 一応、全く違う形ですが解決しました。 excel.Applicationの多重起動という大変お粗末な原因 で、自分の無知さを思い知りました。 申し訳ございません。 ですがその後、todo36様のアドバイスを見て、記述して みると、正常に動作をしてくれました。 オブジェクトを直接操作しているので、こちらを使っていきたいと思います。 大変ありがとうございました。

その他の回答 (4)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

こちらでは次のマクロは正常に動きます。 Sub Macro1() ActiveSheet.Shapes("Text Box 1").Select Selection.Characters.Text = "a" End Sub >二回目はなぜか「オブジェクト変数 または WITHブロック変数が設定されていま >せん」というエラーが出ます。 メッセージ通りに解釈すると オブジェクト変数g_sheetwkが正しくセットされていないのでは?

takaoPR
質問者

補足

アドバイスありがとうございます。 確認してみましたが、g_sheetwkは生きているようです。 試しに、 g_sheetwk.Cells(3, 3) = "test" と記述してみましたが、正常に動作しています。(何回でもOK) 個人的にはselectionが怪しいと思っているのですが・・・。

回答No.3

やっぱりhaporunの考えのように g_sheetwk.Shapes("text1").Characters.Text = "aaaaa" で良いと思いますよ。 選択したオブジェクトに対して処理するのでは無く この場合はTextBoxオブジェクトに対して直接処理を行うのが妥当だと思います。 ちなみに私はSelectオブジェクトは画面遷移処理以外では絶対に使用しないようにしています。 やっぱり操作したいオブジェクトに対して直接、処理するほうがイイと思いますし…

takaoPR
質問者

お礼

無事解決しました。 原因は、excel.Applicationの多重起動だったようです。2回目に二重起動している時があり、それが原因 でした。 ご迷惑をお掛けして本当に申し訳ありません。 貴重なアドバイス、ありがとうございました。

takaoPR
質問者

補足

アドバイスありがとうございます。 早速、試してみたのですがshapesには、Charactersメソッドはないようです。 私も、出来るだけselectは使いたくないので直接操作したいのですが・・・。 textboxオブジェクトに対してのアクセスの仕方が、調べても私の範囲ではわかりませんでした。 わざわざアドバイスありがとうございました。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.2

1行目はテキストボックスを選択する文であり、2行目の文と関係ないかと思われます。 それよりもSelectionというオブジェクト変数がどこで宣言されどこでSetされているか確認できませんか? または、g_sheetwk.Shapes.range.characters.textとか記述できませんか? Excel VBAは専門外のことなので、専門であるVBの知識の範囲でしか答えられていないのですが、できる限りのことはサポートしたいと思います(それよりは専門の方が教えてくださるといいのですが、なかなか現れませんねぇ)。

takaoPR
質問者

お礼

無事解決しました。 原因は、excel.Applicationの多重起動にあった ようです。 私自身が未熟者のため、ご迷惑をお掛けしてしまい 大変申し訳ございません。 しかし、色々と参考や勉強にはなりました。 ありがとうございました。

takaoPR
質問者

補足

お手数をおかけして申し訳ありません。 アドバイス通り、いろいろ試してみましたがそれらしきメソッドやプロパティが見つかりませんでした。 selectionオブジェクトは、現在選択されているオブジェクト、としか説明が無く特にSETはしていないようです。 こうやって色々アドバイスを頂けるのはありがたい限りです。 大変感謝しております。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.1

>二回目はなぜか~ どこでエラーになっているか特定できますか? マクロ関数の中のいちばん上でF9を押して、ブレークポイントを設定し、どの行でエラーになっているか特定してください。 その関数とエラー行を補足してくださると、原因が分かるかもしれません。 >また、rangeオブジェクト~ これらにはちゃんと型というものがあるので、同じ型の変数しかSetできません。 何をセットしようとしたんですか?

takaoPR
質問者

補足

ご返答ありがとうございます。 エラーがでている行は、マクロの二行目の、 Selection.Characters.Text = "aaaaaa" の部分です。 書き忘れましたが、マクロ一行目 g_sheetwk.Shapes("text1").Select のあとに、 call msgbox(typename(selection)) で型を見てみたところ、「range」と表示されたので rangeならばSET可能かと思いました。 selectionを使用すると、以前にも同じような現象でエラーが出て困った事があり、その時は一旦rangeにセットしそこから処理を行い、最後にrangeを開放すれば回避ができました。 今回も同じような方法で回避できないかと思ったのですが、どの型にSETしたらいいのかがわかりません。 一回selectで指定したものを開放できる方法とかがあるのでしょうか? ヘルプを見回してもよく分かりませんでした・・・。

関連するQ&A

  • マクロを使って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でも、センタリングさせる方法を教えて下さい どうかよろしくお願いします

  • テキストボックスの番号のことで

    エクセルでテキストボックスを使用するマクロのスクリプトを調べてみると、ActiveSheet.Shapes("Text Box 1").Select等の文からテキストボックスの番号が分かりますが、マクロを調べることなくシート上からテキストボックスの番号を知ることはできるのでしょうか?

  • テキストボックスのことで

    エクセルの図形描画バーの中にあるテキストボックスで文字を作成すると、そのテキストボックスに自動的に番号が割り振られると思います。 マクロ文の中の ActiveSheet.Shapes("Text Box 8").Select のように。 この番号を変更することは可能でしょうか? テキストボックス自体を削除して新しいのにするというのではダメです。 それは不可能という回答でもけっこうです。 御存知の方がいましたら教えて下さい。

  • Excelでグループ化したオートシェイプにテキストを編集するコード

    Excelの四角のオートシェイプで、例えば、「四角1」「四角2」「四角3」という名前のオートシェイプが3つあったとしてテキスト編集で同じ文字列を入れたいとき、 For a = 1 To 3 ActiveSheet.Shapes("四角" & a).Select Selection.Characters.Text = "文字列" Next a とすればできるのですが、「四角1~3」をグループ化し、名前を「四角」としたとき、 ActiveSheet.Shapes("四角").Select Selection.Characters.Text = "文字列" とするとエラーが出てしまいます。グループ化されたオートシェイプのテキスト編集は、一度グループを解除し、それぞれテキスト編集しなければならないのでしょうか? 回答よろしくお願いします。

  • テキストボックスの表示

    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" のように記述するとエラーになります。 原因がよくわからないのですが、なぜなのでしょうか?

  • エクセル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

  • テキストボックスの文字を一括して削除するには

    エクセルで沢山のテキストボックスの文字を一括して削除するマクロとして以下を実行するとエラーになってしまいます。 (テキストボックス自体は残す) Sub sakujo() ActiveSheet.TextBoxes.Select Selection.Characters.Text = "" End Sub どこがおかしいのでしょう?

  • 全てのテキストボックスを選択するには

    エクセルのあるシートに、オートシェイプの図形とテキストボックスの文字が無数に描画してあります。このような状態で、テキストボックスのみを全てセレクト状態にするマクロが知りたいのですが。

  • 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 どうすれば取得できるでしょうか?

  • 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\"

専門家に質問してみよう