先ほど、Selenium VBAで取得したコードを使って、VBAを記述することも可能だが、先ほどのものはあくまでも、Selenium VBAの使い方としての一例のコードなので、ここでは先ほど取得したVBAのコードは利用しない。
より汎用性があるように、例としてフォームを使ったスクショの撮り方と、張り付け方法を解説する。適宜アレンジして使ってほしい。
Excelフォームの基本について知りたい方は記事「Excelに入力フォームを作成、コントロールを追加、表示、ボタンでイベント実行」を参照してほしい。
ここでは「SeleniumWrapper.WebDriver」を使用するため、「SeleniumWrapper Type Libray」を参照しておく必要がある。
VBE(Visual Basic Editor)のメニューから、[ツール]→[参照設定]と選択し、表示される「参照設定」画面から、「SeleniumWrapper Type Library」にチェックを付ける(図20)。そして「OK」をクリックするだけだ。
まず、Excelメニューから[挿入]→[図形]と選択して、「角丸四角形」を配置し、テキストに「フォームの表示と指定しておく(図21)。
次に、Excelメニューから[開発]→[Visual Basic]と選択して、VBE(Visual Basic Editor)を起動する。
メニューから、[挿入]→[ユーザーフォーム]を選択する。するとフォームの画面が表示される。このフォームを選択して、プロパティの「Caption」に「画面キャプチャを撮る」と指定する。すると、フォームのタイトルが「画面キャプチャを撮る」に変わる。
次に、フォーム上にツールボックスから「リストボックス」を1個配置する。プロパティの「オブジェクト名」はデフォルトの「ListBox1」のままにしておく。
リストボックス内に表示されるフォントの種類やサイズは、プロパティの「Font」から設定が可能だ。もちろん読者の好きな書体や文字サイズに設定してもらって構わない。
全て設定したのが図22だ。
プロジェクト内のUserForm1を選択し、マウスの右クリックで表示されるメニューから、「コードの表示」を選択する。コードエディター画面が表示されるので、この中にコードを書いていく。
まずUserFormがActivateになったときに、リスト2のコードを記述する。
UserFormがActivateになったときのコードのひな型は、図23の方法で作成できる。
左のドロップダウンリストから「UserForm」を選択し、右のドロップダウンリストから「Activate」を選択すると、下記のひな型が作成される。
Private Sub UserForm_Activate() End Sub
この中にリスト2のようにコードを記述する。
Private Sub UserForm_Activate() ListBox1.AddItem ("テキスト検索.html") ListBox1.AddItem ("円を描く.html") ListBox1.AddItem ("銀行.html") ListBox1.AddItem ("道後温泉ルート検索.html") End Sub
これは、ListBoxのAddItemメソッドで各種「html」ファイルの名前を追加していくものだ。
次に、リスト2で追加された「html」が選択されたときの処理になる。この場合は、図23の左ドロップダウンリストボックスから「ListBox1」を選択し、右のドロップダウンリストボックスから「Change」を選択し、作成されたひな型の中に、リスト3のコードを記述する。
Private Sub ListBox1_Change() Dim selenium As New SeleniumWrapper.WebDriver selenium.Start "firefox", "http://2008r2.projectkyss.net/selenium/" & ListBox1.Text selenium.Open "http://2008r2.projectkyss.net/selenium/" & ListBox1.Text selenium.Wait 2000 selenium.getScreenshot().Copy selenium.stop Sheets(1).Range("A10").PasteSpecial End Sub
このChangeイベント内では、先ほど設定したSeleniumWrapper.WebDriverを使用する。
まず1行目で、新しいSeleniumWrapper.WebDriverのインスタンスである、seleniumオブジェクトを作成する。
2行目では、「Start」メソッドの引数に、Webブラウザーとして「Firefox」を指定し、例として筆者のサーバーのURLである、「http://2008r2.projectkyss.net」の「selenium」というフォルダーと、ListBox1より選択された項目名を連結して、第2引数に指定している。
筆者のサーバーにはあらかじめ、リスト2で追加した「html」ファイルをアップロードしておいた。
3行目の「Open」メソッドでListBoxより選択された「html」ファイルを開いている。4行目では、完全に「html」ファイルを読み取り表示するまで、「Wait」メソッドで2000ミリ秒(2秒)待機している。
その後5行目で、「getScreenshot().Copy」メソッドで読み込んだWebサイトのスクショを撮る。6行目でインスタンスを停止し、7行目で撮ったスクショを「A10」セルに「PasteSpecial」メソッドで張り付けている。
最後に、[挿入]→[標準モジュール]と選択し、Module1を追加し、その中に、リスト4のコードを記述する。
Option Explicit Sub フォームを開く() UserForm1.Show vbModeless End Sub
UserForm1をモードレス表示で開く。「モードレス表示」とは、通常フォームが表示された場合は、Excelの操作が不可になるが、モードレスでフォームを開いた場合は、フォームが開いていても、Excelの操作が可能になる。
このリスト4のマクロを図21の「フォームを開く」ボタンと関連付け実行した結果が、図24だ。
図24でリストボックスから「html」ファイルを選択すると、Firefoxで該当するWebサイトが表示される。スクショが自動的に取られ、「A10」のセルに、サイズの大きいまま張り付けられる。図25では、筆者自身が画像を選択してサイズを小さくし、任意の位置にそろえて配置した。
以上のように、Selenium VBAをインストールしておくと、「SeleniumWrapper」の使用が可能になり、いちいち手動でスクショを撮ってExcel上に張り付ける手間が省ける。
今回はフォームを作って、筆者自身が作った「html」のページをサーバーにアップして、それを読み込ませているが、クライアントから引き受けた仕事の場合もこれと同じことだと思う。動作を確認したいページのURLをVBAの中に記述して、リストボックスで一覧表示させ、そこから選択することでスクショを撮って、Excel上に張り付ければいい。
今回のSelenium VBAでは、Webのブラウジングを自動記録して再現してくれる、ということを理解しておいていただくといいだろう。ブラウジングしたプロセスはVBAとして書き出されるため、Excel上で管理できる。Excel上で管理ができれば、作成したWebページの一連の流れを、ExcelのVBAで再現して、クライアントに見せることも可能になる。そういった意味でも、大変に面白いツールなのではないだろうか。
また今回使っている主なコマンドは「Open」「clickAndWait」の2種類だが、もちろんテキスト入力やドロップダウンの選択も可能なので、各自調べて今回の内容を基にアレンジして使ってみてほしい。特に以下のブログが参考になると思う。
なお今回、スクショを撮ってExcel上に張り付けたが、実際に業務で使うにはそれだけでは足りないだろう。例えば、画像が大き過ぎれば画像を縮小させて全て同じサイズにする必要があったり、マクロを自動実行させる時間を指定したりしたい場合もあるはずだ。そこで後編では、スクショ取得自動化に役立つTipsをいくつか紹介するので、楽しみにしてほしい。
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev(Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Copyright © ITmedia, Inc. All Rights Reserved.