みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。
前回の記事はこちら。
ログインが必要なサイトをスクレイピングする際の、ログイン処理をメソッド化する方法をお伝えしました。
さて、しばらくお世話になってきた、読み込み待ち用のWaitメソッドですが、意図的に待ち時間を増やしたいときありますよね。
今回は、その点をパワーアップしていきますよ。
エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する方法です。
では、行ってみましょう!
前回のおさらい
では、前回のおさらいからです。
IEを操作するクラスIEObjectのコードはこちらです。
Public IE As InternetExplorer
Public Document As HTMLDocument
Private Sub Class_Initialize()
Set IE = New InternetExplorer
IE.Visible = True
End Sub
Private Sub Class_Terminate()
IE.Quit
End Sub
Public Sub Navigate(ByVal url As String)
IE.Navigate url
Wait
Set Document = IE.Document
End Sub
Public Sub Wait()
Do While IE.Busy = True Or IE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
End Sub
Sub LogIn()
Const LOGIN_URL As String = "https://example.com/wp-admin/" 'ログインURL
With Me
.Navigate LOGIN_URL
With .Document
.getElementById("user_login").Value = "XXXXXX" 'ユーザー名を指定
.getElementById("user_pass").Value = "XXXXXXXX" 'パスワードを指定
.getElementById("wp-submit").Click
End With
End With
End Sub
前回はLogInメソッドを作りました。
そのおかげで、ログインしているかどうかといった判定もするにも関わらず標準モジュールがとてもスッキリします。
そんな、検証用の標準モジュールのプロシージャはこちらでした。
Sub MySub()
Dim ieObj As IEObject: Set ieObj = New IEObject
ieObj.LogIn
Stop
End Sub
Waitメソッドに指定の秒数の待ち時間を入れたい
さて、先ほど紹介したコードにIEObjectクラスのWaitメソッドというものがあります。
これは、IEが読み込み待ち完了まで待つためのメソッドです。
URLを踏んでサーバーから新たなWebページを読み込むときなどは、このメソッドによる読み込み待ちで十分なのです。
ただ、ブラウザ上でJavaScriptが動作するようなときには、それが最後まで実行されない間に、マクロが次の処理を実行しに行ってしまうようなケースがあります。
そのようなときに、意図的に何秒かの待ちをプラスして入れたいというときがあるんです。
指定秒数だけマクロの動作を停止する
指定の日時までマクロの実行を停止する
この目的を達成するときに活躍するのが、ApplicationメソッドのWaitメソッドです。
これは、指定の日時までマクロの実行を停止するというものです。
今から指定の秒数後を求める
Waitメソッドで指定する日時を「今から指定の秒数後」にしたいわけですね。
例えば、こうします。
Application.Wait Now + TimeSerial(0, 0, sec)
現在日時を取得するNow関数に加えて、時、分、秒から時刻を生成するTimeSerial関数を使います。
TimeSerial関数の「秒」を秒数secを加算した時間まで停止するとするのです。
待ち時間を加えたWaitメソッド
では、IEObjectクラスのWaitメソッドを修正していきましょう。
Public Sub Wait(ByVal sec As Long)
Do While IE.Busy = True Or IE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
Application.Wait Now + TimeSerial(0, 0, sec)
End Sub
これで、WaitメソッドではIEの読み込み待ちをした上で、引数で受け取った秒数sec分だけ意図的に停止します。
では、以下の検証用のプロシージャを実行して確認してみましょう。
Sub MySub()
Dim ieObj As IEObject: Set ieObj = New IEObject
With ieObj
.Navigate "https://tonari-it.com"
.Wait 5
End With
End Sub
しかし、実行すると以下のようにコンパイルエラーになってしまいます。
IEObjectクラスのNavigateメソッドでも、Waitメソッドを使っていたんでした…。
そして、そこで引数を与えていなかったのでエラーになっちゃいました。
引数を省略可能にする
ここで、引数を0などとしても良いのですが、せっかくなのでもう少し使い勝手をよくしましょう。
Waitメソッドの引数を省略可能にするのです。
Subプロシージャを宣言する、Subステートメントで以下のように指定をすることで、引数の省略と省略時のデフォルト値の指定が可能です。
'処理
End Sub
ということで、Waitメソッドを以下のように変更します。
Public Sub Wait(Optional ByVal sec As Long = 0)
Do While IE.Busy = True Or IE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
Application.Wait Now + TimeSerial(0, 0, sec)
End Sub
これで先ほどの検証用プロシージャを実行します。
本ブログのトップページが読み込まれた後、しばらくする(5秒後)とIEが閉じるのが確認できるはずです。
まとめ
以上、エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する方法をお伝えしました。
読み込み待ちをするWaitメソッドは、本記事のように省略可能な待ち秒数を受け取れるようにしておくと、汎用的に便利に使えますね。
また、IEクラスのグッドな追加機能があれば紹介していきますね。
どうぞお楽しみに!
連載目次:エクセルVBAでIEを操作するクラスを作る
エクセルVBAでInternetExplorerを操作してWebスクレイピング、まだまだ現役で必要となる現場もあるでしょう。このシリーズでは、IEを使ったスクレイピングをするときに便利なクラスの作り方をお伝えします。- エクセルVBAでIEを操作するもっとも簡単なクラスを作成する方法
- エクセルVBAでIEを操作するクラスでWebページを開くメソッドを追加する
- エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法
- エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを作成
- エクセルVBAでIEを操作するクラスにリンクテキストでa要素を探してリンクする方法
- エクセルVBAでIEを操作するクラスにテーブルのデータを取得するメソッドを追加する方法
- エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する
- エクセルVBAでIEを操作するクラスに検索入力&ボタンクリックのメソッドを追加する方法
- エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法
- エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する