毎日特定のメールを受信して自動で保存したいというのはよくあるかなと思います。
今回はそれを実装してみました。
最初はPowerAutomateでやろうと思ったんですが、
ローカルフォルダに保存しないといけいない関係で今回はoutlookVBAでやってみました。
(非エンジニアの私としては、細かく書いておかないとこれなんだっけ?となるので備忘録も含めて書いてます)
OutlookVBAを使うにあたっての初期設定はOutlookVBAの事前準備をご覧ください
一番最後にサンプルコード付けたので、その中身を順番に解説します。
##メール受信したら動くに設定する
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) '-受信時に行う動作--
【Application_NewMailEx】の名称にすることで判別してくれるのでいじらない
コードを書く場所は【ThisOutlookSession】にする
##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