特集

Excel VBAでIEを思いのままに操作できるプログラミング術 ~窓の杜 特別レッスン~

「できたらいいな」を実現! IE自動操作を体験してみよう

 みなさん、こんにちは! はじめまして、の人もいっぱいいますよね? ボクの名前は翠田あい(みどりた・あい)、4月19日に発売されてからアチコチで話題の本『Excel VBAでIEを思いのままに操作できるプログラミング術』に、Excel VBAのマスコットキャラクターとして登場させてもらってます!

 今回は窓の杜の読者のみなさんに、VBAによるIE操作を体験していただくための特別レッスンにやってきました~。「これは面白い」とか「これは役に立つ」って思ってくれたら、ぜひ本の方もチェックしてみてくださいね。

 あっ、Twitter(@AiMidorita)でも、IE操作だけじゃなくExcel全般についてゆるーくつぶやいてますので、フォローよろしくお願いしますっ!

Excel VBAとは

 Excel VBAというのは、Excelの操作を自動化してくれる「マクロ」という機能を使うためのプログラミング言語です。Excelにあらかじめ「ああしろ」「こうしろ」という命令を記録しておいて、その命令をあとで再生できる、ってイメージするとわかりやすいかもしれませんね。

 もし、Excel VBAをあまりちゃんと勉強したことがない人でも、この記事を読んで「これができればとても楽になる!」って思えたなら、これをきっかけにExcel VBAを勉強してみるのもいいかもしれませんよ?

 プログラミングの勉強は、「やりたい」と思う気持ちと、実践することが一番大切なんです!

Excel VBAからのIE操作でできること

 Webブラウザーにはいろんな種類があるけど、とくに会社や学校では「Internet Explorer(IE)」を使ってることが多いんじゃないでしょうか? 今回は、Excel VBAからそのIEを操作する方法を紹介します!

 あっ、そもそも「Excel VBAからIEを操作できる」と言っても、それで具体的にどんなことができるのかピンとこない人がいるかもしれませんね。

 たとえばWebページを見て、そこに書いてある情報をExcelのワークシートにコピペして、また次のWebページを見てコピペして……っていう繰り返しの作業、ありますよね? またはその逆で、ワークシートに一覧になってるデータをWebページの入力欄にコピペして登録、みたいな作業とか……。

 こういう作業が全自動でできるようになれば、とっても素敵じゃありませんか? 実はこれ、今回紹介するExcel VBAからのIE操作テクニックを使えばできちゃうんです。

やってみよう! ~翠田あいを探せ!~

 今回は実際にExcel VBAでのIEの自動操作をみんなに体験してもらうために、簡単なサンプルを用意しました。街のどこかにいるボクを探し出す、ちょっとしたゲームみたいな感覚で、Webページからボクの画像を探し出してみてください。テクニックを深く理解しなくても「具体的にどんなことができるの?」とか、「プログラムのソースコードはどれくらいの分量なの?」とか、だいたいの雰囲気を掴んでもらえるとうれしいです。

 このWebページを開くと、ボクがいそうな場所がたくさんリストアップされています。

移動先のリストが表示される
リンクをクリックすると移動先が表示

 手で一つひとつのリンクをクリックして調べてもいいんですけど、今回はこれをVBAで自動化して見つけちゃおう、というわけです。

VBAでプログラミングするための準備

 今日、初めてVBAでプログラミングするって人もいますよね? そんな人にもボクが手とり足とり教えちゃいますので、心配しないでくださいね。「VBEを開いてModule1を追加する」と聞いてやり方がわかる人は、ここは読み飛ばしても大丈夫です。

 それでは、VBAでプログラミングするための準備をしていきますよ~。まずはリボンにVBAプログラミング関連の機能をひとまとめにした[開発]タブを表示します。この操作はExcel 2010/2013のものだから、それ以外のバージョンにはまた別の方法を後ほどご紹介しますね。あと、すでに[開発]タブが表示されている場合は飛ばしてオッケーですよ。

 [ファイル]タブをクリックして[オプション]をクリックすると、「Excelのオプション」という画面が出ます。ここで[リボンのユーザー設定]を選択して右側の[開発]にチェックを入れて、右下の[OK]ボタンをクリックしてください。

 Excelのリボンに[開発]タブ、表示されましたか? 確認してみてくださいね。

 次にVBE(Visual Basic Editor)と呼ばれる「VBAをプログラミングする場所」を開く方法です。[開発]タブをクリックして、一番左の[Visual Basic]ボタンをクリックしてください。

 するとExcelとは別のウィンドウが表示されますよね? これがVBEで、これからVBAでプログラミングする際に使うメイン画面なんですよ~。ちなみに、VBEの開き方はExcelのバージョンによっていろいろあるけど、どのバージョンでも[Alt]+[F11]のショートカットキーで開けるから覚えておくと便利ですよ? Excel 2003/2007の場合はこの方法でVBEを開いて、この先に進んでくださいね。

 それでは早速プログラミングを……と言いたいところだけれど、ちょっと待ってくださいね。VBAプログラムを書くための専用の部品、「モジュール」を追加しましょう。VBE画面の左側にあるツリーの[VBAProject]を右クリックして、[追加]→[標準モジュール]と選択してください。

 ツリーに「Module1」という部品が追加されましたか? これをダブルクリックすると、VBE画面の右側が「Module1」を編集するために開いた状態になります。これで「Module1」にプログラミングできるようになりました!

 ここまで来たらもう大丈夫。安心してこの先のVBAからのIE操作を体験してみてくださいね!

 さてさて、じゃあ早速VBAのコードを書いていきますよ? はじめにメインの処理を書く「Mainプロシージャ」を作って、IEの画面を開くところまで処理を書いちゃいましょう。プロシージャっていうのはいくつかの処理をまとめたもので、他のプログラミング言語で言う「関数」などと意味はだいたい同じ、という理解でここではOKですよ。

Sub Main()      Dim ie As Object      Set ie = CreateObject("InternetExplorer.Application")      ie.Visible = True  End Sub

 このプロシージャを作ったら、[F5]キーを押して実行してみてください。何もWebページが表示されていないIEが開いたら成功です。

 詳しい説明は『Excel VBAでIEを思いのままに操作できるプログラミング術』の本でしているので、ここではちょっとだけ解説しますね。ポイントは変数ieに、プログラムで開いたIEの画面を格納しているところです。だから、このあと変数ieをVBAから操作することで、IEの画面そのものも操作できるようになります。

 たとえば、次に作る「URLへ移動する」という処理も、変数ieの「Navigateメソッド」を実行することで実現できるんです。

 それじゃあ、プロシージャの末尾を示す「End Sub」行の前に次のコードを追加してから、もう一回Mainプロシージャを実行してみてください。

'画面へ移動する      ie.Navigate "http://www.forest.impress.co.jp/article/2013/05/excelvba/"

 今度は白いページじゃなくて、場所の一覧ページが表示されましたか?

 IEを開いてWebページを表示するだけなら、たったの4行でできちゃうんです。今回は詳しい解説は省略しているので意味はわからないかもしれませんが、結構簡単ですよね!

 それじゃあ、場所の一覧ページから各場所に移動してボクを探す処理を作っていきましょう……と言いたいところですけど、ちょっと待ってくださいね。

 これからWebページを開いて、内容をチェックして……という処理の繰り返しを作るんですけど、実はWebページが完全に開ききる前にVBAから操作するとエラーになっちゃうんです。

 IEのアドレスバーにURLを入力して[Enter]キーを押しても、すぐに画面が表示されませんよね? VBAからIEを操作するときも同じで、ちゃんと表示されるのを待ってあげないといけないんです。

 そこで、まずはwaitNavigationプロシージャをMainプロシージャの後に追加しましょう。

'画面移動の完了待ち  Sub waitNavigation(ie As Object)      Do While ie.Busy Or ie.ReadyState < 4          DoEvents      Loop  End Sub

 次にMainプロシージャのEnd Sub行の前にwaitNavigationプロシージャの呼び出しを追加しましょう。

waitNavigation ie

 これで変数ieはWebページの移動が完了した状態で扱えるようになりました!

 というわけで、いよいよ場所の一覧ページを操作します。リンクされた各ページに移動するのだから、まずはリンク先URLの一覧を取得するコードを、MainプロシージャのEnd Sub行の前に追加しましょう。

'すべてのハイパーリンクのURLを取得      Dim a As Object      Dim urls As New Collection      For Each a In ie.Document.getElementsByTagName("A")          urls.Add a.href      Next

 ポイントは「ie.Document.getElementsByTagName("A")」というところ。これは「IEのHTML文書からAタグをすべて取得する」という処理をしています。

 Aタグにはハイパーリンク先のURLがhref属性で指定されているから、「コレクション“urls”」に一旦格納してあとで使えるようにします。コレクションがわからないって人は、「複数の同じような情報を一括して格納するもの」と思ってもらえればここではオッケーですよ。

 これで各ページに移動する準備は整いました。次に、各ページにボクがいるかをチェックする処理を作っていきましょう。

 まずは下準備として、さっきURLの一覧を格納したコレクションurlsのそれぞれのURLに対し、処理を行うループを作ります。あとでチェックした結果を書き出すために使うカウンタ変数iも、このタイミングであわせて用意しておきますね。以下のコードを、MainプロシージャのEnd Sub行の前に追加しましょう。

'すべてのページをチェック      Dim url As Variant      Dim i As Long      i = 1      For Each url In urls            'ここで各URLに対して処理        Next

 それじゃあ最後に、チェックとその結果の書き出し処理を作ってみましょう! Webページへ移動→移動先の情報を書き出し→ボクの存在をチェック・書き出しっていう流れです。ちなみにボクは「AiMidorita.png」という画像なので、このファイル名をチェックしていきますね。

 さっき追加したFor Each ~ Nextの間(「'ここで各URLに対して処理」というコメントがあるところ)に、以下のコードを挿入してみてください。

'Webページを移動          ie.Navigate url          waitNavigation ie          '場所を書き出し          ActiveSheet.Cells(i, 1).Value = i          ActiveSheet.Cells(i, 2).Value = ie.Document.Title	'(1)場所の名称(タイトルバーの内容)          ActiveSheet.Cells(i, 3).Value = ie.LocationURL		'(2)場所のURL          '翠田あいの存在をチェック          If InStr(ie.Document.body.innerHTML, "AiMidorita.png") > 0 Then	'(3)翠田あいの画像有無をチェック              ActiveSheet.Cells(i, 4).Value = "○"          Else              ActiveSheet.Cells(i, 4).Value = "-"          End If          i = i + 1

 調べた結果をワークシートの1列目に連番、2列目に場所の名前、3列目にURL、4列目にボクがいるかいないかを書き出す処理をしています。

 ポイントとなるところだけ説明すると、

  1. 「IEのHTML文書からタイトルを取得する」という処理で、具体的にはIEのタイトルバーに表示されるものと同じ文字列が取得できます。
  2. 「IEのURLを取得する」という処理で、これはアドレスバーに表示されてるURLと同じです。
  3. 「IEのHTML文書の本文(body)タグ内部のHTMLソースに"AiMidorita.png"という文字列が含まれているか」というチェックをしています。

 本当なら画像タグに限定して調べたりした方が確実なんですけど、ここではちょっと簡単に作っちゃいました。

 それじゃあ作ったMainプロシージャを実行して、ボクを探してみてください!
ちゃんと見つかりました? なお、今回作成したプログラムの全文は以下に掲載していますので、うまく動かなかった場合は見比べてみてくださいね。

http://www.forest.impress.co.jp/article/2013/05/excelvba/samplecode.txt

おわりに

 Excel VBAからIEを動かすっていうことのイメージ、具体的にわかってもらえたでしょうか? ただ動かすだけだったらいろんな方法がありますけど、その結果をそのままワークシートに一覧表で記録できるのがExcelでのいいところですよねっ!

 今回作ったプログラムは、お仕事に応用することもできるんです。前に頼まれて作ってあげたことがあるのは……たとえば社内のWebシステムから受注データを取得して決済・商品発送状況を一覧化したり、顧客データから特定の条件に当てはまる顧客を抽出したり、なんてこともできるんです!

 このほかにも、『Excel VBAでIEを思いのままに操作できるプログラミング術』では、以下のような実際のサイトを操作するサンプルを解説してます。

  • ツタヤ在庫店舗検索
  • ツタヤ発売・レンタル開始日チェック
  • Yahoo!メール 雛形差し込み一括送信
  • 食べログのデータベース化
  • Webサイトキーワードチェック

 テクニックを理解してから実践サンプル作りにチャレンジして、一冊やり終えたらきっといろんなことに応用できるようになりますよ!

 さらにさらに、この特別レッスン公開日の5月16日から1週間限定で、なんと電子書籍が本の約半額で購入できるキャンペーン中!? これはもう今日から始めるしかないですねっ!

 みんなが手間をかけてる作業、それExcelでできるかもっ♪ ぜひチェックしてみてくださいね!

編集部より:壁紙&書籍プレゼントのお知らせ!

 特別レッスン掲載を記念して、「翠田あい」とExcelのワークシートをイメージした壁紙を2種類ご用意しました。これでいつでもExcelと一緒!? 解像度毎に3サイズ用意しましたので、お使いの環境に合ったものをダウンロードしてご利用ください。

翠田あい壁紙 タイプ1
翠田あい壁紙 タイプ2

 また、本記事で紹介した書籍『Excel VBAでIEを思いのままに操作できるプログラミング術』を、抽選で5名様にプレゼントいたします。ふるってご応募ください!

プレゼントの応募は締め切りました。

(翠田 あい)