• ベストアンサー

ExcelマクロのSendkeysで処理途中に次のキーが送られる

Excelのマクロから他ソフトのデータを取り入れています。 Sendkeysを使ってソフトのページを切替えたいんですが、ページが切り替わらないうちにページ表示後用のキーが立て続けに送られてしまい旨くいきません。 今やっているのは、起動済みオフラインのIEでHP上の目次からリンクのページ内容をつぎつぎシートへ写す処理です。 SendKeys "{tab}", True    でHPの次行の目次に移って SendKeys "{enter}", True  でページを開いて SendKeys "^{a}", True    全て選択 SendKeys "^{c}", True    コピー この後Excelのシートにテキストで張付ける。 で、IEに戻ってまた"{Tab}"で次行へ移って・・ ところが2番目の"{enter}"で新ページが開き終わらないうちに3,4番目のキーが送られてしまう様です。 ページが開き終わってから次のキーを送るにはどうすればいいでしょうか?

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

sendKeysは単なるキーエミュレートなので 処理終了まで待つというようなことは難しいでしょう。 こんな感じでエクセルからオブジェクトとしてIEを 管理するのが妥当じゃないでしょうか? Set oIE = CreateObject("InternetExplorer.application") oIE.Visible = True oIE.navigate2 ("http://www.yahoo.co.jp") Do While (oIE.busy) Application.Wait (Now + TimeValue("0:00:01")) Loop txt = oIE.document.body.innerText MsgBox txt

noname#30411
質問者

お礼

これが正しいやり方なんでしょうね。 やってみます。 ありがとうございます。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >起動済みオフラインのIEでHP上の目次からリンクのページ内容をつぎつぎシートへ写す処理です。 昔、私もそうやって、ある程度は、Application.Wait Now + TimeValue("00:00:02")[時間は任意]とやって、「概ね」成功していたけれども、やはり、IEのObjectで、 Document.all から行ったほうが確実です。自分で探すしかありませんが、Document.all の Type を抜き出して、その型から、作業方法を見つけます。慣れと、多少、HTMLの知識が必要になってきます。 ところで、 >SendKeys "^{a}", True    全て選択 >SendKeys "^{c}", True    コピー それから、Sendkey でも、こちらは、{a} {c} と{} は必要ありませんが、#1 さんのご指摘の通り、body.InnerText で抜き出すのが簡単かと思います。 そうでなかったら、データ-外部データの取り込み-新しいWebクエリを作ったほうが楽です。

noname#30411
質問者

お礼

私もApplication.Wait でやってみたんですが、一回目は成功し二回目はダメだったりと色んな結果が出ます。 そのソフトのキー操作だけで出来る便利な方法だと思いましたが、やっぱりネットやVBAのコードを勉強しないとダメですね。(^_^; Webクエリの方は各目次のリンク先のような一つ下の層までは取込めない様なので諦めました。