エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する


wait

photo credit: eeems via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。

前回の記事はこちら。

エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。今回は、エクセル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メソッドです。

これは、指定の日時までマクロの実行を停止するというものです。

Application.Wait 日時

今から指定の秒数後を求める

Waitメソッドで指定する日時を「今から指定の秒数後」にしたいわけですね。

例えば、こうします。

Application.Wait Now + TimeSerial(0, 0, sec)

現在日時を取得するNow関数に加えて、時、分、秒から時刻を生成するTimeSerial関数を使います。

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ステートメントで以下のように指定をすることで、引数の省略と省略時のデフォルト値の指定が可能です。

Sub プロシージャ名(Optional パラメータ As 型 = デフォルト値)
 '処理
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を使ったスクレイピングをするときに便利なクラスの作り方をお伝えします。
  1. エクセルVBAでIEを操作するもっとも簡単なクラスを作成する方法
  2. エクセルVBAでIEを操作するクラスでWebページを開くメソッドを追加する
  3. エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法
  4. エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを作成
  5. エクセルVBAでIEを操作するクラスにリンクテキストでa要素を探してリンクする方法
  6. エクセルVBAでIEを操作するクラスにテーブルのデータを取得するメソッドを追加する方法
  7. エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する
  8. エクセルVBAでIEを操作するクラスに検索入力&ボタンクリックのメソッドを追加する方法
  9. エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法
  10. エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する

タイトルとURLをコピーしました