• ベストアンサー

エクセルのテキストボックスを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