1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Outlookで添付ファイルをローカルに保存したいのでやってみた

Last updated at Posted at 2021-12-15

毎日特定のメールを受信して自動で保存したいというのはよくあるかなと思います。
今回はそれを実装してみました。

最初はPowerAutomateでやろうと思ったんですが、
ローカルフォルダに保存しないといけいない関係で今回はoutlookVBAでやってみました。
(非エンジニアの私としては、細かく書いておかないとこれなんだっけ?となるので備忘録も含めて書いてます)

OutlookVBAを使うにあたっての初期設定はOutlookVBAの事前準備をご覧ください
一番最後にサンプルコード付けたので、その中身を順番に解説します。

##メール受信したら動くに設定する

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)  '-受信時に行う動作--

【Application_NewMailEx】の名称にすることで判別してくれるのでいじらない

コードを書く場所は【ThisOutlookSession】にする
図2.png

##Outlook操作準備と初期フォルダ指定

GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)

【GetNamespace】はOutlookのメールや予定表、連絡先といった様々なデータにアクセスすることができるオブジェクトの指定が必要です。
ただ、今は“MAPI”だけですので、そのまま覚えてしまうといいですね。

【GetDefaultFolder】は指定されたフォルダの種類を選びます。【olFolderInbox】は受信トレイの事ですね。
詳しくはMSのヘルプをご覧ください

##メールが入るフォルダを指定

objFolder = objInbox.Folders.Item("test")

<階層構造時の書き方>
objFolder = objInbox.Folders.Item("test").objInbox.Folders.Item("test2")

階層構造になっていると【.】でつないで記載をしましょう。

##フォルダ内のメール(オブジェクト)を取得

For Each objItem In objFolder.Items
   xxxxx
Next

【objFolder.Items】がフォルダの中身全部取得するので、1メールずつ処理させるためにループが必要

##添付ファイル数を取得

For i = 1 To objItem.Attachments.Count
   xxxxx
Next

複数ファイルがある場合は、ループが必要

##未既読の確認と設定

<設定>
objItem.UnRead = False

<判定だけ>
if objItem.UnRead = False then 
  xxxx
End If

Falseが既読、Trueが未読
if文で書くと判定だけなので変更されない

##指定の拡張子があればファイルを保存

 If InStr(objItem.Attachments.Item(i), ".csv") <> 0 Then
    objItem.Attachments.Item(i).SaveAsFile strPath & objItem.Attachments.Item(i)
 End If  

【Instr】で第2引数の文字(ここでは .csv)までの文字をカウントして処理
【.】のみにすることで、全拡張子にすることも可能

【SaveAsFile】でファイルを保存(パスは後ろで指定)

サンプルコード(まとめ)

ということで、多少はしょった部分を含めてサンプルコードになります

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)  '-受信時に行う動作--

    Dim objInbox As Object
    Dim objFolder As Object
    Dim strPath As String
    Dim i As Long
     
    Set objInbox = GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
    
    '添付ファイルがあるメールのフォルダを指定します。
    Set objFolder = objInbox.Folders.Item("test")
    '添付ファイルの保存先を指定。
    strPath = "C:\outlook_DL\"

    '添付ファイル保存処理
    For Each objItem In objFolder.Items
        For i = 1 To objItem.Attachments.Count             
            '未読だったら動作
            If objItem.UnRead = False Then
                GoTo Continue        
            Else
            '添付ファイルに指定の拡張子がある場合のみ処理
                If InStr(objItem.Attachments.Item(i), ".") <> 0 Then
                    objItem.Attachments.Item(i).SaveAsFile strPath & objItem.Attachments.Item(i)
                End If            
                '既読にする
                objItem.UnRead = False          
            End If   
    Continue:    
        Next i   
    Next objItem
 
    Set objItem = Nothing
    Set objInbox = Nothing
    Set objFolder = Nothing

End Sub
1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?