【Excel VBA×Selenium】Chromeのダウンロード先を指定してファイルを自動保存する方法

みなさんこんにちは。

Excel VBAとSeleniumを使用してWebサイトを自動操作していると、CSVやPDF、画像ファイルなどを自動でダウンロードしたい場面があるかと思います。

ところが、Chromeの通常設定のままではファイルが既定の「ダウンロード」フォルダへ保存されたり、環境によっては保存先を確認する操作が必要になったりします。

自動化ツールとして使用するのであれば、毎回同じフォルダへ自動保存できたほうが、その後のExcelへの取り込みやファイル加工まで続けて処理しやすくなります。

今回は、Excel VBA×SeleniumでChromeのダウンロード先を指定して、ファイルを自動保存する方法についてご紹介したいと思います。


この記事はこんな人におすすめ

この記事はこんな人におすすめです!

  • VBAプログラミング:初学者~中級者
  • Excel VBA×SeleniumでWebスクレイピングをしている人
  • Chromeでダウンロードするファイルの保存先を指定したい人
  • CSVやPDFなどのダウンロード処理を自動化したい人
  • ダウンロード後のファイル処理までVBAで自動化したい人

といったところでしょうか。


VBA×Seleniumに関する過去の記事

VBA×Seleniumを使用したWeb操作や、ファイルのダウンロードに関する内容については、過去の記事でもご紹介しておりますのでそちらもどうぞ。

今回の記事を読むメリット

Chromeのダウンロード先をVBAから指定できるようになると、以下のような処理を自動化しやすくなります。

  • WebサイトからCSVを指定フォルダへ自動保存する
  • ダウンロードしたExcelやCSVをVBAで続けて開く
  • ダウンロードしたファイルを別フォルダへ移動・加工する
  • 定期的なファイル取得作業を一連の処理として自動化する

特に業務で毎日同じWebサイトからファイルを取得する場合は、保存先まで固定できるだけでも後続処理をかなり作りやすくなるかと思います。

Chromeのダウンロード先を指定する設定

SeleniumBasicでは、Chromeを起動する前にSetPreferenceを設定することでダウンロード先を指定できます。

' ダウンロードしたファイルを保存するフォルダを指定
Dim downloadPath As String
downloadPath = ThisWorkbook.Path & "\Download"

' Chromeで使用するダウンロード先を設定
driver.SetPreference "download.default_directory", downloadPath

' 指定したダウンロードフォルダを使用する設定
driver.SetPreference "download.directory_upgrade", True

' ダウンロード時に保存先を確認するダイアログを表示しない
driver.SetPreference "download.prompt_for_download", False

' 上記設定を反映した状態でChromeを起動
driver.Start "Chrome"
Excel VBA SeleniumでSetPreferenceを使用してChromeのダウンロード先を設定するコード画面

ここで重要なのが、SetPreferenceはChromeを起動する前に設定するという点です。

Chrome起動後にdownload.default_directoryを変更しても、現在起動しているブラウザへ設定が反映されない場合があります。

各設定について

download.default_directory

driver.SetPreference "download.default_directory", downloadPath

ダウンロードしたファイルを保存するフォルダを指定します。

今回のサンプルでは、マクロを保存しているExcelファイルと同じ場所に「Download」フォルダを作成して、そこへ保存するようにします。

download.directory_upgrade

driver.SetPreference "download.directory_upgrade", True

Chromeで指定したダウンロードフォルダを使用するための設定です。

download.prompt_for_download

driver.SetPreference "download.prompt_for_download", False

ダウンロードするたびに保存先を確認する画面を表示しないようにします。

自動化処理では保存ダイアログが表示されると途中で処理が止まってしまうため、この設定も合わせて使用すると便利です。

サンプルコード

それでは実際に、指定したフォルダへファイルをダウンロードするサンプルコードをご紹介します。

今回はSelenium公式のダウンロード確認用ページを使用して、file_1.txtを取得します。

Sub SeleniumDownloadSample()

    ' SeleniumでChromeを操作するためのWebDriverを宣言
    Dim driver As New Selenium.WebDriver

    ' ダウンロード先フォルダのパスを格納する変数
    Dim downloadPath As String

    ' ダウンロードするファイルのフルパスを格納する変数
    Dim targetFile As String

    ' ダウンロード完了待ちの開始時刻を格納する変数
    Dim startTime As Single

    ' Excelファイルが未保存の場合、ThisWorkbook.Pathを取得できないため処理を終了
    If ThisWorkbook.Path = "" Then
        MsgBox "先にExcelファイルを保存してください。"
        Exit Sub
    End If

    ' Excelファイルと同じフォルダ内にDownloadフォルダを指定
    downloadPath = ThisWorkbook.Path & "\Download"

    ' Downloadフォルダが存在しない場合は新規作成
    If Dir(downloadPath, vbDirectory) = "" Then
        MkDir downloadPath
    End If

    ' 今回ダウンロードするファイルの保存先を指定
    targetFile = downloadPath & "\file_1.txt"

    ' 前回ダウンロードした同名ファイルが存在する場合は削除
    ' 古いファイルをダウンロード成功と誤判定しないための処理
    If Dir(targetFile) <> "" Then
        Kill targetFile
    End If

    With driver

        ' Chromeのダウンロード先をDownloadフォルダに設定
        ' SetPreferenceはChromeを起動する前に設定する
        .SetPreference "download.default_directory", downloadPath

        ' 指定したダウンロードフォルダを使用するように設定
        .SetPreference "download.directory_upgrade", True

        ' ダウンロード時に保存先確認ダイアログを表示しない
        .SetPreference "download.prompt_for_download", False

        ' 上記設定を反映した状態でChromeを起動
        .Start "Chrome"

        ' Selenium公式のダウンロード確認用ページを開く
        .Get "https://www.selenium.dev/selenium/web/downloads/download.html"

        ' id="file-1"のダウンロードリンクを取得してクリック
        .FindElementById("file-1").Click

    End With

    ' ダウンロード完了待ちを開始する時刻を取得
    startTime = Timer

    ' file_1.txtが指定フォルダへ保存されるまで待機
    Do While Dir(targetFile) = ""

        ' Windowsへ制御を返し、処理が固まったように見えるのを防ぐ
        DoEvents

        ' 15秒経過してもファイルが存在しない場合は待機を終了
        If Timer - startTime > 15 Then
            Exit Do
        End If

    Loop

    ' ファイルの存在有無によってダウンロード結果を表示
    If Dir(targetFile) <> "" Then
        MsgBox "ダウンロードが完了しました。" & vbCrLf & targetFile
    Else
        MsgBox "ダウンロードを確認できませんでした。"
    End If

    ' Chromeを終了
    driver.Quit

End Sub

コードの内容は少し長く見えますが、処理の流れはそれほど複雑ではありません。

  1. 保存先のDownloadフォルダを準備する
  2. SetPreferenceでChromeの保存先を指定する
  3. Chromeを起動してダウンロードリンクをクリックする
  4. 指定フォルダにファイルが作成されるまで待機する
  5. ダウンロード結果を確認する

実際にファイルをダウンロードする

コードを実行するとChromeが起動し、Selenium公式のダウンロード確認用ページが表示されます。

ページ内の「File 1」をVBAからクリックすると、保存先確認ダイアログを表示せずにファイルがダウンロードされます。

Excel VBA SeleniumでChromeのダウンロードページを開きFile 1を自動取得する画面

処理完了後、Excelファイルと同じ場所に作成した「Download」フォルダを確認してください。

file_1.txtが保存されていれば成功です。

ダウンロード完了を待つ処理について

Seleniumでダウンロードリンクをクリックしても、ファイルサイズやネットワーク環境によって保存完了まで時間がかかる場合があります。

そのため、クリック直後にファイルを開こうとすると、まだダウンロードが完了しておらずエラーになる場合があります。

今回のサンプルでは、以下の処理で指定したファイルが作成されるまで待機しています。

' 指定したファイルが作成されるまで待機
Do While Dir(targetFile) = ""

    ' Excelが応答なしになることを防ぐ
    DoEvents

    ' 15秒経過した場合は無限ループを防ぐため終了
    If Timer - startTime > 15 Then
        Exit Do
    End If

Loop

実際の業務では、ファイルサイズやWebサイトの応答速度に合わせて待機時間を調整してください。

注意点

SetPreferenceはChrome起動前に設定する

ダウンロード先の設定は、必ずdriver.Start "Chrome"より前に記述してください。

すでに起動しているChromeへ後からdownload.default_directoryを設定しても、保存先が切り替わらない場合があります。

保存先フォルダは事前に作成しておく

指定する保存先フォルダが存在しないと正常に保存できない可能性があります。

今回のサンプルではMkDirを使用して、フォルダが存在しない場合のみ自動作成するようにしています。

同名ファイルの扱いに注意する

Chromeでは同じファイル名がすでに存在すると、環境によってファイル名の末尾へ番号が付いて保存される場合があります。

後続処理でファイル名を固定して使用する場合は、ダウンロード前に古いファイルを削除するなどの処理を追加しておくと扱いやすくなります。

Seleniumだけではダウンロード進捗を直接取得できない

ブラウザ上でダウンロードを開始することはできますが、Seleniumからファイルのダウンロード進捗を直接取得する用途には向いていません。

今回のように保存先フォルダのファイル有無を確認する方法や、必要に応じてHTTP通信を利用する方法など、用途に合わせて実装を検討してください。

最後に

いかがでしたでしょうか。

今回は、Excel VBA×SeleniumでChromeのダウンロード先を指定してファイルを自動保存する方法についてご紹介しました。

download.default_directorydownload.prompt_for_downloadを設定しておけば、指定したフォルダへ確認操作なしでファイルを保存できるようになります。

ダウンロード後にCSVをExcelへ取り込んだり、ファイル名を変更したりといった処理にもつなげやすいため、Webスクレイピングを業務自動化へ発展させる際にも便利な内容かと思います。

少しでもご参考になれば幸いです。


開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA