VBA × Selenium × OutlookでPDFを自動取得&メール送信する方法

アイキャッチ画像

業務効率化や情報収集の自動化に興味がある方に向けて、今回は「VBA × Selenium × Outlook」を組み合わせたPDF自動取得&メール送信ツールをご紹介します。
具体的には、特定のWebサイトにログインしてPDFを取得、取得したPDFを指定フォルダに保存、保存したPDFをメールに添付して送信するという一連の処理を自動化しています。

この記事では、実際に使える形のフルコードを掲載したうえで、処理の流れから技術的なポイント、応用例、注意点まで、整理して解説していきます。


目次

処理フローの概要

このツールは、以下の3ステップで構成されています:

① SeleniumでWebにログインし、PDFをダウンロード

  • VBAからSeleniumを呼び出し、Chromeブラウザを起動
  • 指定されたWebサイトにログインし、目的のPDFリンクをクリック
  • PDFをブラウザで開いた状態で、SendKeysを使って保存処理を実行

② 指定フォルダに保存

  • 保存先はローカルの「Downloads」フォルダなど任意に指定可能
  • ファイル名は日付に連動して自動生成(例:PDF20250829.pdf)

③ Outlook経由でPDFをメール送信

  • VBAからOutlookを操作し、保存したPDFを添付
  • 件名や宛先も自動生成され、メールは表示状態でスタンバイ(手動送信)

フルコード(PDF取得+メール送信)

それではさっそくコードを見ていきましょう。

今回は実例として「日本証券新聞のPDFを取得 → PDFを自動送信」というシーンを題材にしていますが、「任意のWebサービスにも応用できる汎用的な仕組み」ですので、ぜひご自身の業務に合わせてカスタマイズしてみてください。

コード内には、わかりやすくするためのコメントを記載しています。

Sub GetPDF_nsjournal()
    On Error GoTo ErrHandler

    Dim driver As New Selenium.ChromeDriver
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim user_Mail As String
    Dim user_Pass As String
    Dim pdfDate As String
    Dim savePath As String

    '---初期設定---
    Set wb = Workbooks("Demo.xlsm")
    Set ws = wb.Sheets("Sheet1")
    user_Mail = ws.Cells(1, 1).Value
    user_Pass = ws.Cells(2, 1).Value
    pdfDate = Format(Date, "m月d日")
    savePath = Environ("USERPROFILE") & "\Downloads\PDF" & Format(Date, "yyyymmdd") & ".pdf"

    '---ログイン情報チェック---
    If user_Mail = "" Or user_Pass = "" Then
        MsgBox "ログイン情報が未入力です", vbExclamation
        Exit Sub
    End If

    '---ブラウザ起動---
    driver.AddArgument "--start-maximized"
    driver.Start "Chrome"
    driver.Get "https://www.nsjournal.jp/membership-login/"

    '---ログイン処理---
    driver.FindElementByName("swpm_user_name").SendKeys user_Mail
    driver.FindElementByName("swpm_password").SendKeys user_Pass
    driver.FindElementByName("swpm-login").Click
    driver.Wait 5000    '5秒待機

    '---PDFページへ遷移---
    On Error Resume Next
    driver.FindElementByXPath("/html/body/div[1]/header/nav/div[1]/ul/li[11]/a").Click
    If Err.Number <> 0 Then MsgBox "PDFページへの遷移に失敗しました": Exit Sub
    On Error GoTo ErrHandler

    '---当日リンクを探す---
    If driver.FindElementsByPartialLinkText(pdfDate).Count = 0 Then
        MsgBox "本日分のPDFリンクが見つかりません", vbExclamation
        Exit Sub
    End If
    driver.FindElementByPartialLinkText(pdfDate).Click
    driver.Wait 3000    '3秒待機

    '---PDFリンクをクリック---
    driver.FindElementByXPath("//p[@class='files']/a").Click
    Application.Wait Now + TimeValue("0:00:02")

    '---PDF保存(SendKeys)---
    AppActivate "Chrome"
    SendKeys "^s", True
    Application.Wait Now + TimeValue("0:00:02")
    SendKeys "{ENTER}", True

    '---保存完了待機---
    Dim waitTime As Double
    waitTime = Timer + 5
    Do While Timer < waitTime
        DoEvents
    Loop

    '---保存確認---
    If Dir(savePath) = "" Then
        MsgBox "PDFの保存に失敗しました", vbCritical
        Exit Sub
    End If

'    MsgBox "PDF保存完了:" & savePath, vbInformation
    Exit Sub

ErrHandler:
    MsgBox "エラー発生:" & Err.Description, vbCritical
End Sub
Sub Send_nsjournal()
    On Error GoTo ErrHandler

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim user_Mail As String
    Dim toaddress As String
    Dim subject As String
    Dim attached As String
    Dim outlookObj As Outlook.Application
    Dim mailItemObj As Outlook.MailItem
    Dim myattachments As Outlook.Attachments

    '---初期設定---
    Set wb = Workbooks("Demo.xlsm")
    Set ws = wb.Sheets("Sheet1")
    user_Mail = ws.Cells(1, 1).Value
    toaddress = user_Mail
    subject = "日本証券新聞_" & Format(Date, "yyyymmdd")
    attached = Environ("USERPROFILE") & "\Downloads\PDF" & Format(Date, "yyyymmdd") & ".pdf"

    '---メールアドレス確認---
    If toaddress = "" Then
        MsgBox "送信先メールアドレスが未入力です", vbExclamation
        Exit Sub
    End If

    '---添付ファイル確認---
    If Dir(attached) = "" Then
        MsgBox "添付ファイルが見つかりません:" & attached, vbExclamation
        Exit Sub
    End If

    '---Outlook起動とメール作成---
    Set outlookObj = CreateObject("Outlook.Application")
    Set mailItemObj = outlookObj.CreateItem(olMailItem)
    mailItemObj.To = toaddress
    mailItemObj.subject = subject

    '---添付ファイル追加---
    Set myattachments = mailItemObj.Attachments
    myattachments.Add attached

    '---メール表示(手動送信)---
    mailItemObj.Display
'    MsgBox "メールが作成されました。内容を確認して送信してください。", vbInformation
    Exit Sub

ErrHandler:
    MsgBox "メール送信処理中にエラーが発生しました:" & Err.Description, vbCritical
End Sub

以上、エラー処理・安定化・コメント付きのコードを掲載しました。
以下のような構成になっています。

  • Sub GetPDF_nsjournal():PDF取得と保存処理
  • Sub Send_nsjournal():Outlookでメール作成・添付処理

コードは日付連動・ファイル名自動生成・保存確認・メール表示まで含まれており、再利用しやすくなるよう意識しています。


技術的ポイントと工夫

Seleniumでブラウザを自動操作

  • VBAからSelenium Basicを使ってChromeを起動
  • FindElementByName や FindElementByXPath を使って、ログインフォームやリンクを操作
  • driver.Wait や Application.Wait を組み合わせて、ページ読み込みを安定化

ログインセッション維持のための工夫(SendKeys)

  • PDFがログイン後しかアクセスできない場合、XMLHTTP では取得不可
  • そのため、SeleniumでPDFを開いた状態で、SendKeysによる保存操作を採用
  • AppActivate “Chrome” → SendKeys “^s” → SendKeys “{ENTER}” の流れで保存処理を実行

Outlookメールとの連携

  • VBAからOutlookを起動し、CreateItem でメールオブジェクトを生成
  • Attachments.Add でPDFファイルを添付
  • Display メソッドでメールを表示し、内容確認後に手動送信

この連携により、ファイル取得から送信までを完全自動化することが可能になりました。


応用例:他の業務にも展開可能

この仕組みは、PDF取得に限らず、さまざまな業務に応用できます。

  • 社内ポータルから日次レポートを取得 → 保存 → 担当部署へメール
  • ECサイトや管理画面から売上CSVを自動取得 → 集計ファイルに統合
  • 社外ベンダーのサイトから請求書PDFをまとめて取得

このように、ログイン → ファイル取得 → 保存 →通知という流れは、業種を問わず活用できます。


使用時の注意点

ログイン情報の管理

  • 本ツールでは、ログインIDやパスワードをExcelシートに記載しています
  • 他人にPCを触られると情報漏洩のリスクがあるため、ファイルの保護やPCのアクセス制限が必要です

環境依存

  • 本ツールは、Windows環境+Chrome+Outlookが前提です
  • Macやクラウド環境では動作しない可能性があるため、環境要件を事前に確認してください

利用規約の確認

  • Webサイトによっては、自動取得やスクレイピングが禁止されている場合があります
  • 利用規約を確認し、非商用・個人利用の範囲での使用に留めることをおすすめします

活用例(おまけ)

筆者はJIA(証券コード:7172)の株主優待の1つとして、日本証券新聞デジタル版を無料で閲覧できる権利を保有しています。
毎朝、自宅のPCでこのツールを実行し、PDF版の新聞を自分宛に送信。
昼休みにスマホで通信量を気にせず、保存済みのPDFを読む──そんな使い方をしています。


まとめ

  • VBA × Selenium × Outlook の組み合わせで、Web操作からファイル取得・メール送信までを自動化できる
  • 投資家・ビジネスパーソン・情報収集を効率化したい人にとって、汎用性の高い仕組み
  • 注意点を守れば業務改善や情報共有にも応用可能

この記事が「日々の定型業務を楽にしたい」と考えている方の参考になれば嬉しいです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次