ExcelでのIE操作で検索結果を貼り付ける方法

このQ&Aのポイント
  • Excelのマクロで、指定の言語で単語を検索し、検索結果をシートに貼り付ける方法について質問があります。
  • 現在のコードでは、同じクラス名のテーブルが複数あるため、選択する検索結果に困っています。
  • どのようにしてテーブルが複数ある場合でも、検索結果を選択することができるでしょうか。
回答を見る
  • ベストアンサー

エクセルIE操作、クラスが二つあり、片方をコピー

お世話になります。 エクセルマクロでのIE操作について質問です。 環境 エクセル2007 visual basic 6.5 参照設定、デフォルトと下記二つを追加 'Microsoft Internet Controls 'Microsoft HTML object Library エクセルでB列に入力してある単語を、http://www.langtolang.com/から、指定の言語で検索し、 検索結果をシートに貼り付けるものを作ろうとしているのですが、貼り付けに困っています。 作業手順 1、B6から下へ検索したい単語を入力する 2、C2に元の言語、D2に調べたり言語を入力(入力規則で指定しました) ここからがマクロの手順です 3、IEを開き、指定のページへ移動 4、getelementsbytagnameで、言語の選択と、インプットボックスに単語入力 5、submit 6、検索結果が"no translation found"以外の場合、新しいシートを挿入し、シート名を検索単語に変更し、そこに検索結果をテーブルで貼り付け 7、テーブルに貼り付けたれた検索結果を、検索単語が羅列してあるシートの、検索単語の横に貼り付ける。訳が複数見つかった場合、横並びして張り付ける これを繰り返す。 このようなものを作りたいのですが、テーブルが複数あり、また同じクラス名のテーブルも複数あるため、どうやって、検索結果だけを選択すれば良いのか困っています。 今のコードは以下です。 よろしくお願いします。 Sub open_ie() 'enable the following reference 'Microsoft Internet Controls 'Microsoft HTML object Library 'VBA version 'VBA version 6.5.10.53 Dim home As Worksheet Set home = Sheets("Search page") home.Activate 'open IE Dim objIE As Object 'create variable Set objIE = CreateObject("InternetExplorer.Application") 'create object objIE.Visible = True 'make ie visible objIE.Navigate "http://www.langtolang.com/" 'navigate Ie to dictionary 'wait while IE is busy Do While objIE.Busy = True DoEvents Loop 'static------------------------- 'Create object variable for source and target language on IE Dim objSourceLanguage As Object Dim objTargetLanguage As Object 'choose language by variable. Dim SourceLanguage As String Dim TargetLanguage As String SourceLanguage = Worksheets("Search page").Cells(3, 2).Value TargetLanguage = Worksheets("Search page").Cells(5, 2).Value 'cell setting-------------------------- Dim i As Integer i = 6 Dim word As String 'looping procedure stard from here----------------------------- word = Cells(i, 2).Value Do While objIE.Busy = True DoEvents Loop objIE.document.forms("frmSozluk").getElementsByTagName("selectFrom") = SourceLanguage 'set source language objIE.document.forms("frmSozluk").getElementsByTagName("selectTo") = TargetLanguage 'set target language Do While objIE.Busy = True DoEvents Loop objIE.document.forms("frmSozluk").Item("txtLang").Value = word 'set word in cells(i,2) objIE.document.forms("frmSozluk").submit Do While objIE.Busy = True DoEvents Loop 'copy output---------------------------------------- Dim table As HTMLTable Dim sheet As Worksheet For Each table In objIE.document.all If table.className = "blue" Then Sheets.Add after:=Sheets("Search page") ActiveSheet.Name = word Set sheet = ActiveSheet End If Next home.Activate End Sub

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

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

>C2に元の言語、D2に調べたり言語 でしたら、 >SourceLanguage = Worksheets("Search page").Cells(3, 2).Value >TargetLanguage = Worksheets("Search page").Cells(5, 2).Value は、それぞれ、Cells(2, 3)、Cells(2, 4)、です。  コード の方が正しいと見なして、「B3に元の言語、B5に調べたい言語」として回答いたします。 >クラスが二つあり、片方をコピー >テーブルが複数あり、また同じクラス名のテーブルも複数ある とのことで、html ソース を見てみましたが、特に目的の <table> に「id」や「name」が付いている訳でもありませんので、このような場合は、html ソース を丸ごと読み取り、その中から、目的のものを切り出していくか、あるいは、WEB クエリ が使えるのなら、そちらをお使いになるのが簡単ではないでしょうか?  ということで、 1)html ソース を丸ごと読み取り、その中から、目的のものを切り出していく例 2)WEB クエリ を使った例 の2つを、ご参考に供します。  私の環境で試したところ、キーワード が6個の場合で、(1) は9秒、(2) は5秒掛かりました。  なお、 >参照設定、デフォルトと下記二つを追加 >'Microsoft Internet Controls >'Microsoft HTML object Library  上記2件は必要ありません。参照設定を外してください。  また、 >6、検索結果が"no translation found"以外の場合 は考慮しておりません。 '---------------------------------- Sub use_html_source() 'Microsoft Forms 2.0 Object Libraryを参照設定   Dim home As Worksheet   Dim objIE As Object   Dim i As Integer   Dim word As String   Dim mytable As String   Dim CB As New DataObject   Set home = Sheets("Search page")   home.Activate   Set objIE = CreateObject("InternetExplorer.Application")   Application.ScreenUpdating = False   With objIE     .Navigate "http://www.langtolang.com/"     While .Busy Or .readyState <> 4: DoEvents: Wend     .document.forms("frmSozluk").Item("selectFrom").Value = home.Cells(3, 2).Value     .document.forms("frmSozluk").Item("selectTo").Value = home.Cells(5, 2).Value     For i = 6 To home.Range("B6").End(xlDown).Row       word = Cells(i, 2).Value       .document.forms("frmSozluk").Item("txtLang").Value = word       .document.forms("frmSozluk").submit       While .Busy Or .readyState <> 4: DoEvents: Wend       mytable = .document.body.innerHTML       mytable = Mid(mytable, InStr(mytable, "class=""title"""))       mytable = Mid(mytable, InStr(mytable, "class=""blue"""))       mytable = "<table><tbody><tr" & Left(mytable, InStr(mytable, "</table>")) & "/table>"       With CB         .SetText mytable         .PutInClipboard       End With       Sheets.Add after:=Sheets(Sheets.Count)       ActiveSheet.Name = word       Range("A1:B1").Value = Array(home.Cells(3, 2).Value, home.Cells(5, 2).Value)       Range("A2").Select       ActiveSheet.Paste       Range(Range("B2"), Range("B" & Rows.Count).End(xlUp)).Copy       home.Select       Range("C" & i).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _        False, Transpose:=True       Application.CutCopyMode = False     Next i   End With   home.Activate   Set objIE = Nothing   Application.ScreenUpdating = True End Sub '---------------------------------- Sub use_web_query()   Dim home As Worksheet   Dim i As Integer   Dim word As String   Set home = Sheets("Search page")   home.Activate   Application.ScreenUpdating = False   For i = 6 To home.Range("B6").End(xlDown).Row     word = Cells(i, 2).Value     Sheets.Add after:=Sheets(Sheets.Count)     With ActiveSheet.QueryTables.Add(Connection:= _      "URL;http://www.langtolang.com/?selectFrom=" & home.Cells(3, 2).Value & _       "&selectTo=" & home.Cells(5, 2).Value & "&txtLang=" & word _       , Destination:=Range("A1"))       .WebFormatting = xlWebFormattingNone       .WebTables = "6"       .Refresh BackgroundQuery:=False     End With     ActiveSheet.Name = word     Range(Range("B2"), Range("B" & Rows.Count).End(xlUp)).Copy     home.Select     Range("C" & i).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _      False, Transpose:=True     Application.CutCopyMode = False   Next i   home.Activate   Application.ScreenUpdating = True End Sub

関連するQ&A

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

    ヤフーのトップページから 値を入れて検索を押すまではできるのですが 「ウェブ」ではなく「地図」で検索するにはどういう操作をすればいいのでしょうか? 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 宜しくお願いいたします。

  • オブジェクト変数または 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

  • vbaでIEの操作

    こんばんは。やりたいことができないので教えてください。 vbaで指定のurlを開きたいです。 エクセル2003とIE8です。 Sub test001() Dim ObjIE As Object Set ObjIE = CreateObject("InternetExplorer.application") ObjIE.Visible = True ObjIE.navigate "http://jp.msn.com/" Do While ObjIE.Busy = True '表示させるまで待つ DoEvents Loop End Sub これでIEを立ち上げてURLを開けるのですが これでは新しいウインドウで開いてしまいます。 現在IEを立ち上げていて、上記のコードを実行すると 新たなタブで開きたいですが解決策はありますか? ObjIE.Visible = True が原因かと思い、これを抜かしてみましたが そうすると何も起こりません。 VBAで既に開いているIEの新しいタブでURLを開く方法をご教授ください!よろしくお願いします。

  • VBA IEを操作。ファイルダウンロード

    IEを操作して、ファイルをダウンロードしようと思います。 色んなサイトからとってきて、使わせてもらっています。 '---------------------------------IEを開くときに使う Sub IE_OPEN(webUrl As String) Dim objShell Dim writesheet As Worksheet Dim n As Long Dim ID As String, Password As String Set objShell = CreateObject("Shell.Application") Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True ie.Navigate2 webUrl Do While ie.Busy Or ie.readyState <> 4 DoEvents Loop Dim objINPUT Set objINPUT = ie.document.getElementsByTagName("INPUT") 'ループで頭からテキストが 次へ を探す For n = 0 To objINPUT.Length - 1 '※ type="submitボタンなので、.InnerTextじゃなくて、.Valueです ※※注意 If InStr(objINPUT(n).Value, "ログイン") > 0 Then '文字列の中から見つけたら Worksheets("Sheet1").Activate Do While ie.Busy Loop objINPUT(n).Click '見つけたINPUTタグのオブジェクトをクリック Do While ie.Busy Loop Exit For End If Next Set objINPUT = Nothing 'オブジェクト変数解放 End Sub '------------------------------IEを開く(この段階では既に開いてあります。) Private Sub CommandButton1_Click() Do While ie.Busy Or ie.readyState <> 4 DoEvents Loop ie.document.all.ah_ehName.Value = Me.ComboBox1.List(Me.ComboBox1.ListIndex) 'ID Do While ie.Busy Loop Dim objINPUT Dim n As Long Set objINPUT = ie.document.getElementsByTagName("INPUT") For n = 0 To objINPUT.Length - 1 If InStr(objINPUT(n).Value, "ダウンロード") > 0 Then objINPUT(n).Click Do While ie.Busy Loop Exit For End If Next Do While ie.Busy = True DoEvents Loop SendKeys "%S", True'保存 Do While ie.Busy = True DoEvents '何もしないループ(笑) Loop SendKeys "%O",True'ファイルを開く? Do While ie.Busy = True DoEvents Loop 'ie.Quit End Sub ’==================- 面倒なので、IEはPublic変数として モジュールに書いています。 (色んなモジュールを経由する必要があるため、このような手段を取りました) SendKeysをIEに送るというのが出来ずに困っています。 ダウンロードというボタンを押してのダウンロードなので、 ダウンロード用のURL等は分かりません。 Excel2003を使っています。 どうにかSendkeysで出来ないでしょうか? もしくは、もう少し分かりやすい方法は無いでしょうか。 (ファイルを保存しますか?のダイアログの「保存」をクリックして  所定の場所におき、開きたい。 そのまま開くのでもいいけれど、動作が不安定になるのは困る) 以上、よろしくお願い致します。

  • VBA IE操作 メルカリの検索窓に入力できません

    お世話になります。 Win7/エクセル2010/IE11 使用です エクセルVBAよりIEでメルカリ(https://www.mercari.com/jp/)の 検索窓にテキスト文字を入力させたいのですが、入力できません。 Sub GoogleSearch() Dim objIE As Object Dim objInpTxt1 As HTMLInputElement Dim objInpTxt2 As HTMLInputElement Dim URL1 As String Dim myKey As Variant myKey = "あ" Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "https://www.mercari.com/jp/" Call IEWait(objIE) Set objInpTxt1 = objIE.document.getElementsByName("keyword")(0) objInpTxt1.Value = myKey    ’テキストが入力されません 'objIE.document.forms(0).submit ’検索ボタンを押すコードが知りたいです objIE.Quit Set objIE = Nothing End Sub 'IEを待機する関数 Function IEWait(ByRef objIE As Object) Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop End Function -------- メルカリの検索窓のInputタグのtypeがtextではなくsearchとなっていますが 何か関係がありますでしょうか? あと、できましたら 上記のコードでは、コメントアウトしている 検索ボタンをクリックするコードも教えてもらえると幸いです <i>タグの意味がよくわかりません。 <i class="icon-search"></i> お手数をおかけしますが よろしくお願いします

  • ie操作 ローカルパスだとエラーになる

    ヤフーなら問題なくコードが動くのに、URLがローカルのパスだと、エラーになってしまいます。 具体的には、 *********************************************************** Sub Sample1() Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://www.yahoo.co.jp/" objIE.Visible = True Do Until objIE.ReadyState = 4 Loop Do While objIE.Busy = True DoEvents Loop End Sub *********************************************************** だと、問題なく実行されるのに、 *********************************************************** Sub Sample2() strFName = MyDesktop & "\index.html" Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate strFName objIE.Visible = True Do Until objIE.ReadyState = 4 Loop Do While objIE.Busy = True DoEvents Loop End Sub ------------------------- Function MyDesktop() Dim WSH As Variant Set WSH = CreateObject("Wscript.Shell") MyDesktop = WSH.SpecialFolders("Desktop") Set WSH = Nothing End Function *********************************************************** だと、 Do Until objIE.ReadyState = 4 で オートメーションエラー 起動されたオブジェクトはクライアントから切断されました。 となります。 なぜローカルだと、エラーになるのでしょうか? 何が違うのでしょうか?

  • IEの操作(Busy)でエラーになる

    下記コードを実行するとBusyの所でエラーになってしまいます。 何が悪いのでしょうか?教えて下さい。 Excel2000で起動しました。 Sub tst031() Dim fff As String 'ファイルパス Dim objIE As Object 'オブジェクト Dim Myhtml As Variant 'HTMLタグデータ Dim objTAG As Object '制御htmlファイル fff = "http://oshiete.goo.ne.jp/" 'Webページ表示 Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate fff '画面表示待ち Do While objIE.Busy = True DoEvents Loop For Each objTAG In objIE.document.body.all Debug.Print objTAG.tagName Next objIE.Quit 'MsgBox Myhtml End Sub

  • vba ie操作 ログインしたい

    いつもお世話になっております。 前回ご回答いただいた方ありがとうございました。 またまた困ったことにログインしたいサイトがあるのですがうまくできません。 URLはhttps://www.a-q-f.com/openpc/USB0100S01Action.do?aqf_id=S0000&send_url=https://www.a-q-f.com/&get_userInfo=&r=2941249539317530063 なのですが、ログインが二つあり、左側でログインしたいのですが、ボタンを押下できません。 **************************************************** Sub 永久不滅ドットコム() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "https://www.a-q-f.com/openpc/USB0100S01Action.do?aqf_id=S0000&send_url=https://www.a-q-f.com/&get_userInfo=&r=2941249539317530063" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Document.all.ID.Value = "test" objIE.Document.all.idPassword.Value = "test" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop For i = 0 To objIE.Document.Links.Length - 1 If objIE.Document.Links(i).innerHTML Like "*alt=ログイン*" Then '何も起こらない objIE.Document.Links(i).Click Exit For End If Next i objIE.Document.Forms(0).Click '何も起こらない objIE.Document.Forms(0).Submit 'エラーになる Set objIE = Nothing End Sub **************************************************** をやってみましたが無理でした・・・ ご教授よろしくお願いします。

  • 「オブジェクトの破棄」と「メモリの解放」は同じ意味

    「オブジェクトの破棄」と「メモリの解放」は同じ意味ですか? ********************************* Sub Sample1() Dim objIE As Object Dim buf As String Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "http://oshiete.goo.ne.jp/" Do While objIE.busy DoEvents Loop Do While objIE.Document.readyState <> "complete" DoEvents Loop Set objIE = Nothing End Sub ********************************* の場合の「Set objIE = Nothing」は、 「オブジェクトの破棄」でしょうか? 「メモリの解放」でしょうか? どちらでもありますか? ご回答よろしくお願いします。

  • ie操作 ログインボタンを押せないです

    こんばんは。いつもお世話になっております。 ie操作でうまく行かないので教えてください。 イトーヨーカドーのサイトにログインしたいのですがログインボタンが押下できません。 Sub test() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://www.iy-net.jp/" Do While objIE.Busy = True DoEvents Loop objIE.Document.all("userId").Value = ID objIE.Document.all("password").Value = PW objIE.Document.forms(0).submit Set objIE = Nothing End Sub --------------------------------------------------------- だと、 「ハイフンを除く7ケタを半角数字でご入力ください」になってしまいます。 ログインボタンが押せてないのかもしれないけど、よくわかりません。 --------------------------------------------------------- Sub test() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://www.iy-net.jp/" Do While objIE.Busy = True DoEvents Loop objIE.Document.all("userId").Value = ID objIE.Document.all("password").Value = PW For i = 0 To objIE.Document.Links.Length - 1 If objIE.Document.Links(i).innerText = "ログイン" Then objIE.Document.Links(i).Click Exit For End If Next i Set objIE = Nothing End Sub --------------------------------------------------------- にすると、 https://www.iy-net.jp/nspc/logininput.do のURLが表示されて会員認証の画面になってしまいます。 だからって objIE.Navigate "https://www.iy-net.jp/" を https://www.iy-net.jp/nspc/logininput.do にして objIE.Document.forms(0).submit すると https://www.iy-net.jp/nspc/searchresult.do のページが表示されて 「再度 TOPページよりログインいただけますようお願い申し上げます。」 になってしまいます。 ログインする方法を教えていただけますか? ご教授よろしくお願いします。