• ベストアンサー

VBAからIEを操作する時のウィンドウの選択の仕方がわかりません

VBAで、webページを操作するマクロを組んでいます。 具体的な手順としては、セルの商品番号をweb上の検索ボックスに入力して、別ウィンドウで開いた情報を「すべて選択」「コピー」してexcellの別シートに「貼り付け」までを行うものなのですが、 別ウィンドウで開いたページに対して、Sendkeysを行うにはどうやったらいいのでしょうか。 仮に、入力ページをA、結果ページをBとしたとき、Aに対しての入力とBページの表示までは出来ているのですが、Bページに対しての操作が出来ません。 ちなみに、事情があってwebクエリはあえて使っていません。 どなたか、いい解決方法・プロシージャをご存知でしたらよろしくお願いします。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。KenKen_SP です。 検索フォーム経由ではなく、検索結果のページをコードで直接開けないですか? 例えば、教えてGooなら http://oshiete1.goo.ne.jp/kotaeru.php3?q= URL の後ろに ? マークがあります。この記号以下は CGI に渡すパラメータです。 q= の後ろに質問番号が入りますので、予め質問番号が分かっている場合は、 この URL に質問番号を連結してやれば、直接開くことができます。 仮に、質問番号が A1 セルに入っているなら IE.Navigate "http://oshiete1.goo.ne.jp/kotaeru.php3?q=" & Range("A1").Value みたいなコードで検索結果ページを開くことができると思います。同様に、商品番号 を渡すパラメータがあるはずですから、探して見て下さい。CGI にパラメータを渡す 方法が Get でも Post の場合でも検索フォームの HTML ソースを見れば分かります。 取り合えず、一度検索フォームの HTML ソースを見てみましょう。 これが可能なら、コードで IE オブジェクトを作り、直接検索結果のページを開くこ とができますので、IE のウインドウハンドルやウインドウタイトルは簡単に取得 できます。 簡単な例です。A1 セルの値を Google で検索し、結果を A5 セルに貼り付けます。 Option Explicit Private Declare Function SetForegroundWindow Lib "user32.dll" ( _   ByVal hWnd As Long _ ) As Long    Sub Sample()   Dim IE   As Object   Dim strURL As String   Dim lngRet As Long      Const READYSTATE_COMPLETE = &H4      strURL = "http://www.google.com/search?hl=ja&lr=lang_ja&ie=Shift_JIS&q="   strURL = strURL & Range("A1").Value       Set IE = CreateObject("InternetExplorer.application")   IE.Visible = True   IE.navigate strURL   Do     DoEvents   Loop Until Not IE.Busy And IE.readyState = READYSTATE_COMPLETE      ' IE のウインドウをアクティブにする   lngRet = SetForegroundWindow(IE.hWnd)   If lngRet <> 0 Then     ' アクティブにできたらキー送信して結果をコピー     SendKeys "^a", True     SendKeys "^c", True     ' 貼り付け     Range("A5").Select     ActiveSheet.Paste   End If   Set IE = Nothing End Sub どうしても検索フォームを経由し、新しい IE を開く必要がある場合は、 参考 URL 先の記事が参考になると思います。 参考 URL: http://www.ken3.org/cgi-bin/group/vba_ie.asp ちなみに、SendKeys を使わない方法としては、IE.Document.body.innerHTML で HTML ソースは取得し、クリップボードに転送してからペースト、、 というのでも良いかもしれません。 では。

korn333
質問者

お礼

すごい!驚きです!これなら自分の作りたかった物が組めそうです。 教えていただいたURLのほうは、まだ私のレベルだと理解できないこともありますが、でも、すごく勉強になります。 ありがとうございました!

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ウインドウタイトルで表示される文字列がわかっていれば dim ws set ws = CreateObject("WScript.Shell") ws.AppActivate("タイトル文字列") で指定したウィンドウをアクティブにできます。 ウィンドウをアクティブにできれば、 Sendkeys ができます。 IEオブジェクトを作って起動しているのだったら、 状況によって IEオブジェクトから内容を引っ張ってこれるような気がしますが・

korn333
質問者

お礼

なるほど、タイトル文字列からの指定も出来るのですね。ありがとうございます!

関連するQ&A