VBでのIE操作

このQ&Aのポイント
  • VBでIE操作をしようとして色々調べています。色んなサイトを見ながら途中までは何とかできましたが、どうしてもリンク先を表示できません。
  • Excel2007使用  IE7  VB初心者です。やりたい内容は、VBでIEを立ち上げて、ページからリンクをクリックして表示されたページに検索したい項目を入力し、結果をエクセルに反映することです。
  • VBでIE操作のコードを作成していますが、画像になっているハイパーリンクをクリックする方法がわかりません。現在までのコードにも間違いがある可能性があるため、ご指摘いただけると助かります。
回答を見る
  • ベストアンサー

VBでのIE操作

VBでのIE操作をしようとして色々調べています。 色んなサイトを見ながら途中までは何とかできましたが、どうしてもリンク先を表示できません。 お分かりになる方いましたら、お力添えいただければ幸いです。 状況: Excel2007使用  IE7  VB初心者です。 やりたい内容: VBでIEを立ち上げる ↓ ページからリンクをクリックする (ページ上に画像が貼り付けてあって、そこにURLくっついててハイパーリンクになっている。) (セキュリティの関係でハイパーリンク先を初期で表示することはできない。) ↓ 表示されたページに検索したい項目を入力 ↓ 結果をエクセルに反映する。 以上の作業をVBで組もうと思ってます。 よろしくお願いします。 Option Explicit Sub IE_Test() 'IEの起動 Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True '処理したいページを表示します。 objIE.Navigate "(表示したいページ)" 'ページの表示待ち   While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True DoEvents Wend '開かれたIEを探す。 Dim objSHELL As Object Dim objWINDOW As Object Dim newIE As InternetExplorer '調べる項目に対して、、、 For yCNT = 3 To 102 ' If Trim(Cells(yCNT, 1)) = "" Then Exit For 'A列が空白になったらループを抜ける ここがわからない。。。 (画像になっているハイパーリンクをクリックしたい、、、) 'シェルのオブジェクトを作成する Set objSHELL = CreateObject("Shell.Application") Set newIE = objSHELL.Windows(objSHELL.Windows.Count - 1) Set objSHELL = Nothing '念のため、新しいウインドウの表示を待つ While newIE.readyState <> READYSTATE_COMPLETE Or newIE.Busy = True DoEvents Wend 'ページが表示されたので、表示された文章に対して、処理を行います。 newIE.document.all("phone_no").Value = Cells(yCNT, 1) 'A列の文字を参照する newIE.document.all("exec").Click '表示されたウインドウ(newIE)からデータをセットする Cells(yCNT, 2) = newIE.document.body.innerText '検索の結果をエクセルに反映 '新しいIE(子IE)を閉じる newIE.Quit Set newIE = Nothing '前のIE(親IE)を閉じる   objIE.Quit set objIE = Nothing Next yCNT End Sub 上記が現在までのできているコードです。 ここにも色々間違いがある可能性もあります。 ご指摘頂けましたら幸いです。 よろしくお願いします。

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

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

>他にも問題が山積みのようでした。 >違う部分で新たに質問を投げているので・・・お力添えお願いします。  この件に関しましては、新しいご質問の方へ、回答を書いておきました。  さて、yamaguchi816 さんがお書きの コード を拝見して、いくつかお節介を焼きたくなりましたので、暇つぶしにご覧ください。 -------------------------------------------------- 【1】[With ステートメント] のすすめ(賛否両論あるかも。。。)  objIE や newIE が コード中に何度も出てきて 読みづらいので http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_060.html の「Withステートメントの利用」でもご覧ください。 -------------------------------------------------- 【2】[マルチ ステートメント] のすすめ(賛否両論あるかも。。。)  お示しの コード の中で、 'ページの表示待ち While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True DoEvents Wend という フレーズ が出てきますが、IE の操作をするときには、ページ を遷移するたびにこの フレーズ を書かなければならなくなったりして、関数にして利用していらっしゃる方もいらっしゃいますが、私は、[With ステートメント] と併用して、 While .Busy Or .ReadyState <> 4: DoEvents: Wend という フレーズ を単語登録して書いています。 -------------------------------------------------- 【3】「表示待ち」について '表示待ち wait_time = DateAdd("s", 2, Now()) Do While Now() < wait_time DoEvents Loop という フレーズ が何回も出てきますが、これは Application.Wait (Now + TimeValue("0:0:2")) ではいけませんか?  私は、 a)While .Busy Or .ReadyState <> 4: DoEvents: Wend だけでは、ページ が表示し切れないときに、 b)Application.Wait (Now + TimeValue("0:0:2")) も入れてみて(単なる様子見)、コード がちゃんと進行するような秒数を記入したりします。  この件に関しては、とても詳しい方もいらっしゃいますが、私は、取り敢えず、「したい事が出来れば良い」ので、気にせずに、a・bを適当にちりばめて コード を書いています。 -------------------------------------------------- 【4】「Next yCNT」の位置について(実はこれが一番重要)  お示しの位置に「Next yCNT」を置くと、既に、 newIE.Quit Set newIE = Nothing してしまっていますので、 For yCNT = 3 To 1002 したときに、newIE が行方不明になってしまいます。  「Next yCNT」は newIE.Quit の前に置きましょう。 -------------------------------------------------- 【5】「前のIEを閉じる」の位置について  これは、どちらでも良いのですが、用が済んだらさっさと退席してもらった方が、コード が見やすくなるようですので、「リンクの貼ってある画像をクリック」して、新しい ページ が表示されたら、 objIE.Quit Set objIE = Nothing するようにしてみました。 --------------------------------------------------  他にも、細々と変えておりますので、次の回答をご覧ください。

その他の回答 (3)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.4

Option Explicit Sub ie_test()   '【1】IEを起動し、データの入力画面を開くまでの操作   Dim objIE As Object   Dim i As Integer   Set objIE = CreateObject("InternetExplorer.Application")   With objIE     .Visible = True     '処理したいページを表示します。     .navigate "処理したいページ"     'ページの表示待ち     While .ReadyState <> READYSTATE_COMPLETE Or .Busy: DoEvents: Wend     Application.Wait (Now + TimeValue("0:0:2"))     'リンクの貼ってある画像をクリック     For i = 0 To .document.images.Length - 1       If InStr(.document.images.Item(i).outerHTML, "image/btn131b1.gif") > 0 Then         .document.images.Item(i).Click       End If     Next     '表示待ち     Application.Wait (Now + TimeValue("0:0:2"))     '前のIEを閉じる     objIE.Quit   End With   Set objIE = Nothing   '【2】データを入力する操作   Dim objSHELL As Object   Dim newIE As InternetExplorer   Dim yCNT As Long   '新しいIEをシェルオブジェクトに格納する   Set objSHELL = CreateObject("Shell.Application")   Set newIE = objSHELL.Windows(objSHELL.Windows.Count - 1)   Set objSHELL = Nothing   With newIE     '新しいウィンドウのログインボタンを押す     .document.forms(0).submit     While .Busy Or .ReadyState <> 4: DoEvents: Wend     '調べる項目     For yCNT = 3 To Cells(Rows.Count, 1).End(xlUp).Row       If Trim(Cells(yCNT, 1)) = "" Then Exit For 'A列が空白になったらループを抜ける       'ページが表示されたので処理を行います。       .document.frames(0).document.all("phone_no").Value = Cells(yCNT, 1)  'A列の文字を参照する       .document.frames(0).document.all("exec").Click       '表示待ち       Application.Wait (Now + TimeValue("0:0:2"))       '表示されたウインドウからデータをセットする       Cells(yCNT, 2) = .document.frames(1).document.body.innerText '検索の結果をエクセルに反映     Next yCNT     '新しいIEを閉じる     .Quit   End With   Set newIE = Nothing End Sub

yamaguchi816
質問者

お礼

非常に分かりやすい説明ありがとうございます。 もとよりVBの勉強をしていたわけではなく、仕事を捗らせる為にネットで色々検索してただけだったのですが、ここまで解り易い説明は初めて見ました。 お陰様で、やろうとしていたことが完璧にできました。 何から何までありがとうございます。 また何かの機会にご質問させていただくことがありましたら、その際はどうぞよろしくお願い申し上げます。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.2

 #1 の DOUGLAS_ です。  「Item(i)」の i の初期値は「0」ですから、 For i = 1 To objIE.Document.images.Length ではなくて、 For i = 0 To objIE.Document.images.Length - 1 でしたね。  失礼いたしました。  <(_ _)>

yamaguchi816
質問者

お礼

ありがとうございます。 おかげさまで画像のクリックはできましたが、他にも問題が山積みのようでした。 また、今度は違う部分で新たに質問を投げているのでお分かりになるようでしたら、またお力添えお願いします。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

 ご質問の内容は、サイト の作りによって、操作の方法も変ってくるかと存じます。  ということで、先ずは、 >ここがわからない。。。 >(画像になっているハイパーリンクをクリックしたい、、、) という点についてのみお答えいたします。 >ページ上に画像が貼り付けてあって、 >そこにURLくっついててハイパーリンクになっている ということは、その辺りの html タグ に <a href="~~"><img src="●●.gif"></a> というようなことが書かれているかと存じますので、 For i = 1 To objIE.Document.images.Length  If InStr(objIE.Document.images.Item(i).outerHTML, "●●.gif") > 0 Then   objIE.Document.images.Item(i).Click  End If Next などとして、画像を クリック することができるかと存じます。 #お分かりにならないことがありましたら、ご遠慮なくお尋ねください。

関連するQ&A

  • VBでのIE操作

    VBでのIE操作をしようとして色々調べています。 色んなサイトを見ながら途中までは何とかできましたが、どうしてもリンク先を表示できません。 お分かりになる方いましたら、お力添えいただければ幸いです。 状況: Excel2007使用  IE7  VB初心者です。 やりたい内容: VBでIEを立ち上げる ↓ ページからリンクをクリックする (ページ上に画像が貼り付けてあって、そこにURLくっついててハイパーリンクになっている。) (セキュリティの関係でハイパーリンク先を初期で表示することはできない。) ↓ 表示されたページに検索したい項目を入力 ↓ 結果をエクセルに反映する。 以上の作業をVBで組もうと思ってます。 よろしくお願いします。 Option Explicit Sub ie_test() 'IEの起動 Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True '処理したいページを表示します。 objIE.navigate "処理したいページ" 'ページの表示待ち While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True DoEvents Wend '開かれたIEを探す。 Dim objSHELL As Object Dim objWINDOW As Object Dim newIE As InternetExplorer Dim wait_time As Date Dim yCNT As Long Dim i As Integer '表示待ち wait_time = DateAdd("s", 2, Now()) Do While Now() < wait_time DoEvents Loop 'リンクの貼ってある画像をクリック For i = 0 To objIE.document.images.Length - 1 If InStr(objIE.document.images.Item(i).outerHTML, "image/btn131b1.gif") > 0 Then objIE.document.images.Item(i).Click End If Next '表示待ち wait_time = DateAdd("s", 2, Now()) Do While Now() < wait_time DoEvents Loop 'シェルのオブジェクトを作成する Set objSHELL = CreateObject("Shell.Application") Set newIE = objSHELL.Windows(objSHELL.Windows.Count - 1) Set objSHELL = Nothing '新しいウィンドウのログインボタンを押す Dim objINPUT As Object 'Inputタグ格納用 For Each objINPUT In newIE.document.all.tags("INPUT") If objINPUT.Value = "ログイン" Then objINPUT.Click Exit For End If Next '調べる項目 For yCNT = 3 To 1002 ' If Trim(Cells(yCNT, 1)) = "" Then Exit For 'A列が空白になったらループを抜ける 'ページが表示されたので処理を行います。 newIE.document.all("phone_no").Value = Cells(yCNT, 1) 'A列の文字を参照する newIE.document.all("exec").Click ※ここでオブジェクト変数。。。のエラーが発生する※ '表示待ち wait_time = DateAdd("s", 2, Now()) Do While Now() < wait_time DoEvents Loop '表示されたウインドウからデータをセットする Cells(yCNT, 2) = newIE.document.body.innerText '検索の結果をエクセルに反映 '新しいIEを閉じる newIE.Quit Set newIE = Nothing '前のIEを閉じる objIE.Quit Set objIE = Nothing Next yCNT End Sub 初心者なので色々調べたのですがわかりませんでした。。。

  • VBAでIE操作をするサンプル

    VBAでIE操作をするサンプルをネットでいくつか見ているのですが Sub Sample1() Dim objShell As Object Dim objIE As New InternetExplorer Set objShell = CreateObject("Shell.Application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" Set objIE = Nothing Set objShell = Nothing End Sub Sub Sample2() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" Set objIE = Nothing End Sub ではどちらを使った方がいいのでしょうか? 圧倒的にSample2の方がネットでは多いのですが Sample1のやり方もあることを知りました。 Sample1の方法でブラウザを開くメリットはあるのでしょうか?

  • objIE  2個目のサイズが適用されません。

    VBAです。 Dim objShell As Object Dim objIE As New InternetExplorer Const READYSTATE_COMPLETE As Long = 4 Sub test1() Set objShell = CreateObject("Shell.Application") objIE.Visible = True objIE.Top = 0 objIE.Left = 0 objIE.Width = 100 objIE.Height = 100 objIE.navigate "http://www.goo.ne.jp/" objIE.Navigate2 "http://www.goo.ne.jp/", 2048 Set objIE = Nothing Set objShell = Nothing Set objShell = CreateObject("Shell.Application") objIE.Visible = True objIE.navigate "http://www.goo.ne.jp/" objIE.Navigate2 "http://www.goo.ne.jp/", 2048 'できない objIE.Top = 20 objIE.Left = 20 objIE.Width = 100 objIE.Height = 100 Set objIE = Nothing Set objShell = Nothing End Sub のように二つのブラウザを立ち上げて サイズを変えたいのですが 2個目のサイズが適用されません。 エラーにもなりません。 なぜでしょうか?

  • VBのコードが理解できません 解説いただけないでしょうか?

    Dim ObjIE As Object Dim ObjShell As Object Dim ObjWindow As Object Dim WinExist As Boolean WinExist = False Set ObjShell = CreateObject("Shell.Application") For Each ObjWindow In ObjShell.Windows If TypeName(ObjWindow.Document) = "HTMLDocument" Then  WinExist = True  Set ObjIE = ObjWindow End If Next Set ObjShell = Nothing If Not WinExist = True Then Set ObjIE = CreateObject("InternetExplorer.Application") End If ObjIE.Navigate "http://nantokakantoka.html" ObjIE.Visible = True このコードを解説いただけないでしょうか? 特に WinExist For Each ObjWindow In ObjShell.Windows If TypeName(ObjWindow.Document) = "HTMLDocument" Then が何をしているのか分からないんです。

  • エクセル VBA で IE操作 

    エクセルVBAにて IEを操作し リンクをクリックするには どのような記述になりますでしょうか? たとえば http://okwave.jp/mypage へアクセスし画面右上 カテゴリ をクリック 次に Excel(エクセル) をクリック という具合に 画面に表示されている文字を順番にクリックしたいです。 マクロを見つけてきましたが クリックというのはどう記述していいやらさっぱりです。 Sub testIE() Dim objIE As InternetExplorer 'IEオブジェクトを準備 Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット objIE.Visible = True 'IEを表示 objIE.navigate "http://okwave.jp/mypage" 'IEでURLを開く Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち DoEvents Loop

  • ie操作 ボタンが押せる時と押せない時がある

    こんばんは。よろしくお願いします。 ie操作でボタンが押せる時と押せない時があるのですが、 違いがわかりません。 --------------------------------------------------------- Sub test1() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.mitsui-direct.co.jp/customer/" 'ダイレクトにログインページへはいけない。 Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Navigate "javascript:gotoMyhp();" Set objIE = Nothing End Sub --------------------------------------------------------- これなのですが、http://www.mitsui-direct.co.jp/customer/のサイトへいって、 右側の「Myホームページログイン」を押したいのですが、 最初は、objIE.Navigate "javascript:gotoMyhp();" でうまくいってたのですが、 なぜか出来なくなってしまいました。 そんな事ありますか? コードが間違ってるのでしょうか? ご教授よろしくお願いします。

  • 「ページが表示されました」まで取得したい

    IEを立ち上げてステータスバーのテキストを取得して、 「ページが表示されました」を取得出来たら、次のコードへ進みたいのですが、 下のコードでStatusTexttを書き出しても「ページが表示されました」まで取得できません。 Sub test() Dim objIE As InternetExplorer Dim i As Long Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://www.goo.ne.jp/" objIE.Visible = True Workbooks.Add Cells(1, 1) = objIE.StatusText i = 2 Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Cells(i, 1) = objIE.StatusText i = i + 1 Loop Cells(i, 1) = objIE.StatusText Set objIE = Nothing End Sub Do While objIE.Busy = True Or objIE.ReadyState <> 4 ここら辺のコードを弄ればいいような気がしますが、うまくいきません。 ご回答よろしくお願いします。

  • 【VBA】IEのリンクを新しいタブで開く

    VBAでIEを制御しリンク(アンカー)<a href="***">を新しいタブで開くようにしたいのですが可能でしょうか? 仮にグーグルのトップページ(http://www.google.co.jp/)の『検索オプション』(http://www.google.co.jp/advanced_search?hl=ja)を新しいタブで開くとします 実際に開きたいリンクのURLは固定ではないためURLの指定では開けませんが、飛びたいリンクの文言(『検索オプション』)は固定です リンクに飛ぶ前に飛ぶ先のURLを取得する仕方か、Shift+Ctrl+クリックのようにリンクを新しいタブで開く方法を教えてください 一度普通にリンクに飛んでからURLを取得し、戻ってから新しいタブで開くぐらいしかできないのでしょうか? Sub 新しいタブで開く() Dim objIE As Object Dim objShell Dim URL As String Set objShell = CreateObject("Shell.Application") For n = objShell.Windows.Count To 1 Step -1 Set objIE = objShell.Windows(n - 1) If Right(UCase(objIE.FullName), 12) = "IEXPLORE.EXE" Then objIE.Navigate "http://www.google.co.jp/" Exit For End If Next Set objShell = Nothing objIE.Visible = True Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop For Each Obj In objIE.Document.getElementsByTagName("a") If Obj.innerText = "検索オプション" Then Obj.Click Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop URL = objIE.Document.URL objIE.GoBack Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Navigate URL, CLng(&H800) Exit For End If Next End Sub よろしくお願いいたします

  • IE操作 StatusTextの文字を取得したい

    現在IE9を使っています。 IE8なら、添付画像の赤で囲った部分に "ページが表示されました"と表示されますが、IE9では表示されません。 ここに文字を表示し、文字を取得するにはどうすればいいでしょうか? ************************************* Sub Sample() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.goo.ne.jp/" objIE.StatusText = True '意味ないっぽい Debug.Print objIE.StatusText objIE.Quit Set objIE = Nothing End Sub ************************************* これでは取得されませんでした。 Do DoEvents Loop Until objIE.StatusText = "ページが表示されました" のように、ページが表示されたら、次のコードに進む・・・とやりたいです。

  • エクセルVBAで、IEからコピーするには

    エクセル2000,win2000,IE6です。 次のような、コードを書きました。 Sub t03ccc() Dim objIE As Object 'IE オブジェクト参照用 Dim objShell As Object 'Shell オブジェクト参照用 Dim objWindow As Object 'Window オブジェクト参照用 Set objShell = CreateObject("Shell.Application") For Each objWindow In objShell.Windows '起動中のタイトルを探して。 If Left(objWindow.document.Title, 7) = "Office系" Then Set objIE = objWindow 'オブジェクトを代入 Msg = "Office系" Exit For End If Next If Msg <> "Office系" Then MsgBox "・・・スクリーニング結果一覧・・・がありません" Exit Sub End If objIE.ExecWB 17, 0 'OLECMDID_SELECTALL = 17 全てを選択 objIE.ExecWB 12, 0 'OLECMDID_COPY = 12 コピー Sheets("Sheet3").Select Rows("1:200").ClearContents Range("A1").Select ActiveSheet.Paste '''' objIE.Quit Set objIE = Nothing Set objShell = Nothing Set objWindow = Nothing End Sub これで、エクセルとIEしか開いてないときは巧くいくのですが、 エクスプローラーを同時に開くと実行時エラー438が出ます。 よろしくお願いします。