マクロでウィンドウを操作する方法とは?

このQ&Aのポイント
  • マクロを使ってIEのウィンドウを操作する方法を教えてください。
  • フォームのサブミットや検索結果の取得はできるが、別ウィンドウの操作ができない場合の解決策を教えてください。
  • 別の方法を教えていただけますか?javascriptのようにウィンドウを変数で受ける方法はありますか?
回答を見る
  • ベストアンサー

ウィンドウをマクロで操作

分かったら教えてください。 以下ではマクロでIEを開いてフォームをサブミットしています。 ie.Navigate ("http://www.yahoo.co.jp") Do While (ie.ReadyState <> state) Or (ie.Busy = True) DoEvents Loop With ie.Document.forms(0) .Item("p").Value = "焼きいも" .Item("Login").Click End With フォームに”焼いも”といれてサブミットし、検索結果を取得します。 ここまではできました。 ところが、この画面とは別のフォームに、 登録ボタンを押すと別のウィンドウが立ち上がるものがありました。 その場合、開いた後このie.Navigate で開いたウィンドウを操作 しようとしてもはじめのウィンドウがナビゲートされてしまいます。 javascriptのようにウィンドウを変数で受けるとか 別の方法がありますか? 連レス申し訳ありませんが、よろしくお願いします。

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

  • ベストアンサー
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

IE6でも動くはずです。 ≪ie.Windows.Countでエラーの件≫ 大変失礼しました。 コードを、全文拝見した方が間違いがないと思いますが 多分 nmbw1 = CreateObject("Shell.Application").Windows.Count nmbw2 = CreateObject("Shell.Application").Windows.Count とすれば良いと思います。 ≪nmbw1 = Windows.Count なら2ととれる件≫ Application.Windows.Count ということです。 試しに Msgbox Windows(1).Caption とでも、やってみてください。

japan_3
質問者

補足

ありがとうございました! できました。 エクセル表のB列にIPを入力すると C列に組織名を表示するvbaを作りました。 xls88さんならすぐ作れるでしょうけど、 ソースを載せておきます。 Sub IPtoCorpName() ' マクロ記録日 : 2009/1/21 ユーザー名 : shikinokage Dim ie As Object Dim ie2 As Object Dim shell As Object Dim htmltext As String Dim cellhtml As String Dim n As Integer Dim i As Integer Dim ip As String Dim numberOfWindows As Integer Dim htmlLength As Integer Dim htmlLeftLength As Integer Dim htmlRightLength As Integer Set ie = CreateObject("InternetExplorer.Application") Set shell = CreateObject("Shell.Application") Const state = 4 'Dim ie As New InternetExplorer ie.Visible = False i = 2 Do While True i = i + 1 ip = Cells(i, 2) If (ip <> "") Then ie.Navigate ("http://www.cman.jp/network/support/ip.html") Do While (ie.ReadyState <> state) Or (ie.Busy = True) DoEvents Loop With ie.Document.forms(0) .Item("in_ip").Value = Cells(i, 2) .Item("go_ip").Click End With numberOfWindows = Windows.Count Windows(numberOfWindows - 1).Activate Set ie2 = shell.Windows.Item(shell.Windows.Count - 1) Do While (ie2.ReadyState <> state) Or (ie2.Busy = True) DoEvents Loop htmltext = ie2.Document.body.innerHTML Do While (ie2.ReadyState <> state) Or (ie2.Busy = True) DoEvents Loop htmlLength = Len(htmltext) htmlLeftLength = InStr(htmltext, "組織名") If htmlLeftLength > 0 Then htmlRightLength = InStr(htmlLeftLength, htmltext, "TR") htmltext = Left(htmltext, htmlRightLength - 8) Cells(i, 3) = Right(htmltext, htmlRightLength - htmlLeftLength - 22) Else Cells(i, 3) = "なし" End If Else MsgBox ("終わりました") Exit Sub End If Loop End Sub

その他の回答 (1)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

窓の数を数えればどうでしょうか? IE7で確認しています。 ie.Navigate ("http://www.yahoo.co.jp") Do While (ie.ReadyState <> state) Or (ie.Busy = True) DoEvents Loop nmbw1 = ie.Windows.Count '★(1) With ie.Document.forms(0) .Item("p").Value = "焼きいも" .Item("Login").Click End With nmbw2 = ie.Windows.Count '★(2) ★(1)と★(2)で、開かれている窓の数を取得し、 nmbw1 < nmbw2 なら 新しい窓は ie.Windows(nmbw2 - 1) ということになります。

japan_3
質問者

お礼

すみません、 nmbw1 = ie.Windows.Count でエラーになります。 nmbw1 = Windows.Count なら2ととれますが、 ie.Windows(nmbw2 - 1)のWindowsプロパティが無いと 言われます。 なぜ駄目なのかと開いたウィンドウの操作を教えていただきたく思います。よろしくお願い致します。

japan_3
質問者

補足

ありがとうございます。 この方法で試してみます。 ただ、これってIE6で使えなかったりしますか? 末端にIE7か8を入れようと思いますが、IE6でも動く方法はありますか? また、IE6の環境で動かそうとすると「そんなプロパティまたはメソッドは定義されていません」みたいなエラーが出るのですが、 ie.windows.countの部分はvbaを保存したときはエラーは出ません。 vbaが悪いのかブラウザにそのようなメソッド(関数)がないのか いまいち判断が付かないです。

関連するQ&A

  • vba IE操作 教えてgoo マイページ

    賃貸・タウン情報の「Q&A広場」 で教えてgooを使っているのですが 2個目のie_waitが機能しないというか意味がない状態になります。 ********************************************************** Sub test() Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://hiroba.chintai.net/login?return_url=http%3A%2F%2Fhiroba.chintai.net%2Fmypage#tabs" Call ie_wait '1個目 objIE.Document.all("mailaddress").Value = "あああ" objIE.Document.all.Password.Value = "1111" objIE.Document.all.login_skip.Click objIE.Document.Forms(1).submit Call ie_wait '2個目 End Sub -------------------------------------------------- Sub ie_wait() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.ReadyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub ********************************************************** 二個目のie_waitは、 ie_waitの操作が完了しないのに次のコードへ進んでしまいます。 一個目のie_waitは、 objIE.Navigate "http://hiroba.chintai.net/login?return_url=http%3A%2F%2Fhiroba.chintai.net%2Fmypage#tabs" が表示さえるのを待つコードですが、 objIE.Document.Forms(1).submitでログインして、マイページが表示されるまで待つには、 どのようなコードを入れればいいのでしょうか?

  • フリーズしてしまいます。

    アクセスでWebBrowserコントロールを使ってIE操作をしているのですが フリーズしてしまいます。 フォームに、WebBrowser0を配置して、 ---------------------------------- Private Sub Form_Load() Me.WebBrowser0.Navigate "http://login.yahoo.co.jp/config/login?logout=1" Call wait 省略・・・ End Sub ---------------------------------- Sub wait() Const READYSTATE_COMPLETE As Long = 4 Do Until Me.WebBrowser0.ReadyState = READYSTATE_COMPLETE Loop Do While Me.WebBrowser0.Busy = True DoEvents Loop End Sub ---------------------------------- を実行すると必ずフリーズします。 ---------------------------------- Sub wait() Do While Me.WebBrowser0.Busy = True DoEvents Loop End Sub ---------------------------------- にしたら問題なく表示されます。 でもこれだけだと、表示し終わりません。 表示されてないのに次のコードへ進んでしまいます。 そもそもなぜフリーズするのでしょうか? アクセス2007です。ご回答よろしくお願いします。

  • vbaでyahooメールの受信メールの一覧を読み取

    vbaでyahooメールの受信メールの一覧を読み取る方法はありますか? Sub test() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://login.yahoo.co.jp/config/login?logout=1" 'ログアウトする Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Navigate "https://login.yahoo.co.jp/config/login?.src=&.pd=&.done=http%3A//www.yahoo.co.jp/" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Document.all.UserName.Value = "" objIE.Document.all.passwd.Value = "" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Document.Forms(0).submit Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Navigate "http://jp.mc1003.mail.yahoo.co.jp/mc/welcome?.rand=6i0loli2li7s6&noFlush&YY=940152127#_pg=showFolder&fid=Inbox&order=down&tt=84&pSize=25&.jsrand=6381767" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop Debug.Print objIE.Document.Body.innerHTML Set objIE = Nothing End Sub これでログインまではできるのですが、その後のソースを読み取っても受信メールの一覧は読み取れません。 ログイン後に、vbaではなく手動でWEBクエリをやってソースに書き出してみましたがやはり受信メールだけは読み取れません。 WEBクエリならフォルダの一覧は読み取れました。 VBAで読み取るのは不可能なのでしょうか?

  • WebBrowserにてsubmitの前にnavigateしてしまう

    いつもお世話になっております。 VB2005ユーザーです。 WebBrowser内の"submit"を押したあと、違うページに行きたいのですが、 "submit"を押す前に"Navigate"で指定しているページに行ってしまいます。 このようなコードを書いています。 With WebBrowser1 .Navigate("最初のURL") Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop .Document.Forms(0).InvokeMember("submit") Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop .Navigate("次の指定URL") Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop 「指定URL」は"submit"により新しいHTMLが生まれるので、その後の作業のためにどうしても"submit"を押したいのですが、上のようなコードですと先に「指定URL」に行ってしまいます。 "submit"をクリックせず、無視してしまうのです。 Navigate("次の指定URL")を外せばクリックしてくれるのですが・・・。 WebBrowserを完全に待機させる方法などが必要なのでしょうか? 宜しくご教授のほどお願い致します。

  • vba ie操作 ボタンを押したい(2)

    https://ca.omc-card.co.jp/member/omcplus_login.html のサイトにログインしたいのですが、ログインボタンが押せません。 ソースは、 ********************************************************************************** <FORM action="../member/xt_mem_top_login.asp" method="post" name="form1"><input type="hidden" name="sid" value=""><input type="hidden" name="pw" value="">     ~~~省略~~~ <TABLE border="0" cellspacing="0" cellpadding="5" class="tab_button_bottom15"> <TR> <TD><A href="javascript:checkInput(document.form1);"><IMG src="../img/button/login.gif" alt="ログイン" width="160" height="35" border="0"></A></TD> </TR> </TABLE> </FORM> ********************************************************************************** です。 --------------------------------------------------------------------------------- Sub test() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://ca.omc-card.co.jp/member/omcplus_login.html" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Document.forms(0).Item("sid_input").Value = "×××" objIE.Document.forms(0).Item("pw_input").Value = "×××" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop 'objIE.Document.forms(1).submit 'エラーになる objIE.Document.all.Item("document.form1").Click 'エラーになる objIE.Document.forms(0).getElementsByTagName("input")(0).Click 'エラーにならないけどクリックもされない。 objIE.Document.forms(0).getElementsByTagName("input")(1).Click 'エラーにならないけどクリックもされない。 objIE.Document.forms(0).getElementsByTagName("document.form1")(1).Click 'エラーになる objIE.Document.forms(1).getElementsByTagName("input")(1).Click 'エラーになる Set objIE = Nothing End Sub --------------------------------------------------------------------------------- テキストにIDとPWを入れるところまでは出来たのですが、 ログインボタンを押すことができません。 すいませんがご教授ご回答よろしくお願いしますm( )m

  • オブジェクト変数または With ブロック変数が設定されていません。

    下記の様に組みましたが、下記の★印の所で止まる様な事があります。 毎回止まるわけではないのですが、止まる時に「オブジェクト変数または With ブロック変数が設定されていません。」と表示されますが、 原因は何か?どの様にすればいいのか?など詳しく教えてください。 よろしくお願いします。 Sub test() Dim objIE As Object Dim strCOMMENT As String Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://" While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop 'データをセットする 'htmlドキュメント フォーム(0番目) アイテムに転記(代入)する objIE.Document.forms(0).Item("username").Value = "11111" objIE.Document.forms(0).Item("password").Value = "11111" While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Document.all.subm.Click While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop For Each link In objIE.Document.Links If link.href = "http://" Then link.Click End If Next While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop 'タイトル・コメントの読み込み strtitle = Sheets("sheet1").Range("k7") strCOMMENT = Sheets("sheet1").Range("k9") Application.WindowState = xlMinimized While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Document.forms(0).Item("title").Value = strtitle objIE.Document.forms(0).Item("comment").Value = strCOMMENT While objIE.readystate <> 4 While objIE.busy = True DoEvents ' Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Document.all.submit.Click While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop 'フォーム(0番目)を .Submit(確認) する objIE.Document.forms(0).getElementsByTagName("input")(11).Click '←★この部分で止まる時があります。 While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop For Each link In objIE.Document.Links If link.href = "http://" Then link.Click End If Next While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 7, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Quit '.Quitで閉じる End Sub

  • WebBrowserについて

    Visual Studio 2008を使っています 途中で処理が停止しまい困っています デバックで一時停止をすると Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop この部分で作業が止まっています 何かいい方法はないでしょうか? ソースは下記の通りです WebBrowser1.Navigate(New Uri("http://※※※※※※※※※※※※)) Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop ______________________________ Threading.Thread.Sleep(1000)とか入れても止まってしまいます 秒数はいろいろ試しましたが駄目でした WebBrowser1.Navigate(New Uri("※※※※※※※※※※※※)) Threading.Thread.Sleep(1000) Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop

  • UWSC(LIST選択できず)

    初心者です。 UWSCの自動化で上手くいかない所を、どなたか教えていただけないでしょうか? 内容はあるサイトにログオンした後、コンボBOXで選択する画面を自動化したいのですが上手くいきません。UWSCの記載は下記の通りです。 どなたかお分かりになる方よろしくお願いします。m(_ _)m ID = INPUT("貴方のIDは?") PW = INPUT("貴方のPWは?") IE = CREATEOLEOBJ("INTERNETEXPLORER.APPLICATION") IE.VISIBLE = TRUE IE.NAVIGATE("あるサイト") repeat sleep(0.1) until !ie.busy and ie.readystate=4 ie.document.forms[0].elements[2].value =ID ie.document.forms[0].elements[3].value =PW repeat sleep(0.1) until !ie.busy and ie.readystate=4 ie.document.forms[0].submit repeat sleep(0.5) until !ie.busy and ie.readystate=4 ret = IELINK(IE,"あるリンク") repeat sleep(0.5) until !ie.busy and ie.readystate=4 ie.document.forms[0].elements[0].VALUE ="あるコンボ選択肢" ↑ここだけ上手く動かないです。 ie.document.forms[0].elements[2].value ="01/02/2007" ie.document.forms[0].elements[3].value ="07/07/2007" repeat sleep(0.5) until !ie.busy and ie.readystate=4 ie.document.forms[0].elements[4].CLICK()

  • 「地図」で検索するにはどういう操作をすればいいので

    ヤフーのトップページから 値を入れて検索を押すまではできるのですが 「ウェブ」ではなく「地図」で検索するにはどういう操作をすればいいのでしょうか? Sub yahoo() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" Do While objIE.Busy = True DoEvents Loop Do While objIE.Document.ReadyState <> "complete" DoEvents Loop objIE.Document.forms(0).elements("p").Value = "東京" '‘「地図」をクリックする操作をしたい objIE.Document.forms(0).submit Set objIE = Nothing End Sub 宜しくお願いいたします。

  • ie操作 2回目のwaitが無視される

    FC2にログインし、アクセス解析のページを開きたいのですが Dim objIE As InternetExplorer Sub test() Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "http://fc2.com/login.php" Call wait objIE.document.all("email").Value = "test@yahoo.co.jp" objIE.document.all("pass").Value = "test" objIE.document.all.Item("Image").Click Call wait 'ここが無視される!!! objIE.navigate "http://analyzer.fc2.com/" End Sub Sub wait() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.readyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub このコードだとうまくいきません。 このコードをF5で実行すると、エラーにはならないのですが、 objIE.navigate "http://analyzer.fc2.com/" ができてません。 objIE.navigate "http://analyzer.fc2.com/"の部分にブレークポイントを設置し、 ログイン後の画面がちゃんと表示されたことを確認して、 objIE.navigate "http://analyzer.fc2.com/"に進むと、 objIE.navigate "http://analyzer.fc2.com/"が無視され、 http://analyzer.fc2.com/のページに移りません。 同じ条件なのに、 objIE.navigate "http://analyzer.fc2.com/"の部分にブレークポイントを設置し、 ログイン後の画面がちゃんと表示されたことを確認して、 objIE.navigate "http://analyzer.fc2.com/"に進むと、 実行時エラー -2147024726のオートメーションエラーになることがあります。 どうやったら、2回目のwaitが無視されずに進みますか? ログインされると http://fc2.com/login.php から http://id.fc2.com/?login=done へURLが変わりますが objIEをウォッチウィンドウで見てると、ずっとhttp://fc2.com/login.phpのままです。 環境:win8.1/エクセル2010

専門家に質問してみよう