ExcelのVBAを使ってSeleniumを動かしてみました

#1．概要

業務でExcelのVBAからSeleniumを用いて自動テストを実施することがあったので、その方法を記事にまとめました。本記事では基本的なプログラムの説明と、自動テスト中でよく使った対象URLのエビデンスを自動でとるプログラムについて説明しています。

また、VBA用のSeleniumのインストール方法は以下記事を参照ください。

[VBAからchromeスクレイピング](https://qiita.com/400800mkouyou/items/735704557e52bd5c08dc)

※本内容はSeleniumを導入し、ExcelのVBAで使えるようになっていることが前提です。

#2．VBAでSeleniumを動かす方法

###2.1　エディタの用意
まずは、Excelを起動し「開発＞Visual Basic」から開発画面を表示させます。
※開発が表示されていない場合は、「ファイル＞オプション」を選択し、その後リボンのユーザー設定から右側にある「開発」にチェックを入れて、OKボタンを押下してください。

次にプログラムを作成するためモジュールを表示させます。
「挿入＞標準モジュール」を選択すると、画面左側にModuleが表示され真ん中にエディタが現れます
※モジュール名を変えたい場合は、「表示＞プロパティウインドウ」を表示させ（オブジェクト名）から変更できます。

###2.2　基礎プログラムの起動
表示されたエディタにまず以下プログラムを入力してください。

```vb
Sub sample()
	Dim Driver As New ChromeDriver

	Driver.Get "https://www.yahoo.co.jp/"
	Stop
End Sub
```

上記が基本的なVBAプログラムの構造です。VBAではプロシージャという単位でプログラムを作成していきます（**Sub～ではじまり、End Subで終わる部分**）

そしてさらに、**Dimで始まる変数の宣言部分**と**実際の処理部分**に分かれます。
変数部分ではプログラムに必要な変数を定義します。基本的にSeleniumかつChromeを使うことが多いので「Dim Driver As New ChromeDriver」の定義が必須となります。
※上記の定義で、ChromeをSeleniumで動かす「Driver」という変数を定義しています。

処理部分では今回「変数名.Get "開きたいサイトのURL"」を記載することで、Chromeで指定したサイトを開くことができます。ただ、開いただけだとすぐに閉じてしまうので、Stopでプログラムを停止させています。

上記の基本プログラムをもとにしながら徐々に拡張させていきます。


#3．エビデンスを自動で取得するプログラム

以下によく使った対象URLのエビデンスを自動で取得するプログラムを記載しています。
ただ、前提条件として以下のExcelファイルを作成している必要があります。

「test」というシートを作成し、B列に表示したい対象のURLを記載してください。また、シート名は以下のように「test」「1」「2」「3」と作成してください。

■「test」シートの中身

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547663/c8d831a6-196a-d3db-8601-d19c1790d8fa.png)

■作成する各シート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547663/5873f40a-3cad-f122-dd2d-18be60bc57b4.png)

以下が実際に作成したプログラムになります。

```vb
Sub sample()
	Dim Driver As New ChromeDriver
	Dim i As Long
	 
	With ThisWorkbook.Worksheets("test")
		For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
			Driver.Get .Range("B1").Offset(i - 1, 0)
			Driver.TakeScreenshot(0).Copy
			DoEvents
			ThisWorkbook.Worksheets("" & i & "").Activate
			DoEvents
			ThisWorkbook.Worksheets("" & i & "").Range("A1").PasteSpecial
			.Activate
		Next
	End With
End Sub
```

■2～3行目（Dim Driver As New ChromeDriver、Dim i As Long）
変数定義ではChromeを動かす「Driver」のほかに、ループ文を動かす「i」という変数を定義しています。

■5行目（With ThisWorkbook.Worksheets("test")）
対象となるシートを動作するように指定します。

■6行目（For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row）
For文で1から「B行目の一番下の列番号」回までループするようにしています。
※このCells（...）の記載方法については、以下資料を参考ください。
https://excel-ubara.com/excelvba1/EXCELVBA318.html

■7行目（Driver.Get .Range("B1").Offset(i - 1, 0)）
B1に記載されているURLのサイトを開きます。また、B1を基準にループごとに1列ずつ移動したセルのURLを読み込むようにしています。

■8行目（Driver.TakeScreenshot(0).Copy）
表示された画面のスクリーンショットを取り、コピーします。

■9行目（DoEvents）
制御をオペレーティングシステムによって処理させるように制御を戻しています。
コピペ処理を行う場合は、ちょくちょくこの「DoEvents」を挟まないと「1004」エラーとなるようです。
（なぜそうなるのか、よくわかりません…）

■10行目（ThisWorkbook.Worksheets("" & i & "").Activate）
「i」番目のシートを活性化させて、「i」シート上で動作できるようにします。

■11行目（DoEvents）
9行目と同じ

■12行目（ThisWorkbook.Worksheets("" & i & "").Range("A1").PasteSpecial）
「i」シートのA1セルに、8行目でコピーした画面をペーストします。

■13行目（.Activate）
活性化させた「i」シートをもとに戻します

■14行目（Next）
For文の初めに戻ります。

以上のプログラムを動作するとGoogle、Yahoo、Amazonのサイトに遷移し、各画面のスクリーンショットを取って、各番号のシートに貼り付けます。

###3.2　プライバシー画面が表示される際の対応

検証画面を確認しているとSSLの設定がうまくいっておらず、ちょくちょくプライバシー画面が表示されることがありました。（「この接続ではプライバシーが保護されません」と表示される画面です）そのため、上記のプログラムに加えて以下を追記し、プライバシー画面を無理やり突破（そのまま表示）させてました。

```vb
…
	Dim myBy As New By
	
	For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
	…
		If Driver.IsElementPresent(myBy.ID("main-message")) Then
			Driver.FindElementById("details-button").Click
			Driver.FindElementById("proceed-link").Click
		End If
	…
```

■2行目（Dim myBy As New By）
プライバシー画面かどうかを検査するための「myBy」という変数を定義します。

■6行目（If Driver.IsElementPresent(myBy.ID("main-message")) Then）
ここでプライバシー画面に表示される「main-message」というIDが表示されていたら…という条件文を作成しています。

■7行目（Driver.FindElementById("details-button").Click）
画面内の「詳細表示」をクリックする。

■8行目（Driver.FindElementById("proceed-link").Click）
「（対象のURL）にアクセスする（安全ではありません）」をクリックする。

#4．その他使える機能

###4.1　デバック画面
エディタ画面の「表示 ＞ イミディエイトウィンドウ」を表示させ、「Debug.Print」文をプログラム上に記載すれば、表示させたい変数等をコンソール上に表示させることができます。

###4.2　コードの自動メンバー表示
Ctrl+スペースで自動メンバー表示が利用可能（自動で算出できない場合は、コマンドを押しても何も表示されない）

###4.3　Seleniumのメンバー一覧
「表示 ＞ オブジェクト プラウザー」からSeleniumに使えるメンバーがわかります。ここに使いたいメンバーがなければ、おそらくアドオンで追加すれば使えるのではないかと思います。

###4.4　コードのステップ実行

F8キーでプログラムを上から順に、コードを1つずつ実施してくれます。「4.1」のデバック画面と合わせて、エラーの修正をするときに便利な機能です。