みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けエクセルVBAでIEを操作するシリーズです。
前回はこちらの記事でテーブルの情報を取得する方法についてお伝えしました。
今回は少し趣向を変えまして、IEを操作してWEBページ内の検索窓に任意のキーワードを入力して送信する方法です。
エクセルに検索したいキーワードをリストアップしておいて、それを順番に検索してその結果を取り出す…というようなプログラムが想定できますね。便利そうです。
では、行ってみましょう!
今回のお題:検索窓に任意の文字列を入力して検索
今回は「Yahoo!JAPAN」の検索窓から任意の文字列で検索をしたいと思います。
検索窓はコチラですね。
これをVBAで操作しちゃいましょう。
この検索窓にInputBoxで入力してもらった文字列を入力し検索結果を表示する、というのを今回のお題とします。
検索窓を表す要素を取得する
デベロッパツールで検索窓の要素を調べる
Google Chromeのデベロッパーツールで、それらの要素が何者なのか、そしてどのように取得できるかを見てみましょう。
Ctrl + Shift + I でデベロッパーツールを開いて、上部にある「Select an element…」のアイコンをクリックします。
その後、調べたい要素である検索窓をクリックすると、Elementsのエリアに対象の要素部分のHTMLがフォーカスされます。
これが検索窓を表す要素ですね。
id属性で要素を取得する
右クリックして「Copy→Copy outerHTML」としますと、このform要素がごっそり取得できます。
この部分を抜粋すると以下の通り。
textタイプのinput要素ですが、id属性がありますね…!
idが振られている場合は、getElementByIdメソッドを使ってHTMLドキュメントの中で一意に要素を掴めるのでとても助かります。
類似の命令で、getElementsByTagNameメソッドや、getElementsByClassNameメソッドなどがありますが、これらはElementsつまり複数形であることに注意してください。取得できるものも1つの要素ではなくて、要素のコレクションになります。
テキストボックスに値を入力する
取得したinput要素はHTMLInputElementオブジェクトとなりますが、そのテキストボックスの値を設定するにはValueプロパティを使います。
この値を書き換えれば、検索窓にテキストを入力できるというわけです。
検索ボタンを表す要素を取得する
同様に、検索ボタンのほうも調べてみましょう。
デベロッパーツールで見てみると…
buttonタイプのinput要素で、こちらもid属性があります。
こちらも、一意に取得可能ですね!
ボタンをクリックする
こちらも、HTMLInputElementオブジェクトになりますが、検索開始をするにはクリックする必要があります。
そのためには、Clickメソッドを使います。
検索窓に入力した後に、検索ボタンをクリックすれば、検索をかけることができるはずです。
これで準備完了です。
IEで検索窓にキーワードを入力して送信するプログラム
以上を踏まえてプログラムを書いてみますとこうなります。
Sub MySub()
Dim keyword As String
keyword = InputBox("キーワードを入力してください")
Dim objIE As InternetExplorer
Set objIE = New InternetExplorer
objIE.Visible = True
objIE.Navigate "https://www.yahoo.co.jp/"
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
Dim htmlDoc As HTMLDocument
Set htmlDoc = objIE.Document
With htmlDoc
.getElementById("srchtxt").Value = keyword
.getElementById("srchbtn").Click
End With
End Sub
実行しますと、まずInputBoxでダイアログが表示されるのでキーワードを入力してEnter。
すると、IEが立ち上がり、入力フォームに値が入力され、検索結果ページが表示されます。
まとめ
以上、VBAでIEで検索窓にキーワードを入力して送信するプログラムについてお伝えしました。
WEBスクレイピングではGoogleChromeの検証機能がとても強い味方になります。検証できて筋道が決まってしまえば、もうプログラムは8割がた完成と言っても良いかも知れません。
ぜひどんどん活用してマスターしてくださいね。
次回はブログの記事一覧を取得する方法についてをお伝えできればと思います。
どうぞお楽しみに!
連載目次:エクセルVBAでIEを操作してWEBスクレイピング
IEを操作してWEBページのデータを取得して、エクセルのデータとして取り込む、つまりWEBスクレイピングをエクセルVBAで実現します。各種WEBページを課題として様々なデータの取得の仕方を解説していきたいと思います。
- 【エクセルVBAでIE操作】10分で終わるセッティングとWEBページの閲覧確認
- 【エクセルVBAでIE操作】HTMLタグと要素そしてドキュメントの取得
- 【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
- 【エクセルVBAでIE操作】ページ内のリンク先URLを全部取得する
- 【エクセルVBAでIE操作】ディスクリプションなどの要素をname属性でGetする
- 【エクセルVBAでIE操作】hタグなどの要素をタグ名でGetする
- 【エクセルVBAでIE操作】WEBページのテーブル要素を自動で取得する方法
- 【エクセルVBAでIE操作】WEBページのテーブル要素からセルのデータを取り出す方法
- 【エクセルVBAでIE操作】IEで検索窓にキーワードを入力して送信する方法
- 【エクセルVBAでIE操作】検索結果一覧から記事タイトルを取得する方法
- 【エクセルVBAでIE操作】ブログの記事一覧ページから公開日とカテゴリを取得する
- 【エクセルVBAでIE操作】ページャーをめくって複数ページからデータを取得する
- 【エクセルVBAでIE操作】ユーザー名とパスワードを入力してログインをする
- 【エクセルVBAでIE操作】name属性を利用して画像ボタンをクリックする
- 【エクセルVBAでIE操作】alt属性・src属性を利用して画像ボタンをクリックする
コメント
いつも大変参考にさせて頂いております。本もとても勉強になりました。
1店伺いたいのですが、htmlの中にidがない場合は、どのように要素をつかめばいいのでしょうか?
スコさん
コメントありがとうございます。
id以外の方法について、当ブログでいくつか紹介しています。
class属性で取得する方法、タグで取得する方法、name属性で取得する方法などがありますので、ご覧下さい。
https://tonari-it.com/vba-ie-pagenation/
https://tonari-it.com/vba-ie-get-tagname/
https://tonari-it.com/vba-ie-get-name/
迅速なご返信ありがとうございました。また、もう一件伺いたい事がございますので、お声いただけますと幸いです。
サイトによって要素を取得できないなどあるのでしょうか?
あるサイトでname属性で値を入力出来たのだますが、自社の社内システムで同様に取得しようとしたところ失敗致しました。
このような事象はあるのか、また対策などあるのかお教え頂きたく思います。
はい、サイトによっては目的の要素を取得するのが難しいこともあるかと思います。
こればかりは、サイトの作りや環境に依存してしまうので、解決法は一概には言えません。
やはり、そうした事象はあるのですね。お答え下さりありがとうございました。