前提・実現したいこと
outlookで特定のメールを受信時にメールの仕分けで"フォルダB"に移動させ
添付ファイルのエクセルを"保存先のフォルダパス"に自動保存させたい
発生している問題・エラーメッセージ
エラーメッセージなし 該当コード実行時、自動振り分け対象になっているメールが対象とならず、最新の一つ前のメールが対象となってしまい 保存する際に最新の添付ファイルが保存されない
該当のソースコード
VBA
1Private Declare PtrSafe Function AddClipboardFormatListener Lib "user32.dll" (ByVal hWnd As LongPtr) As Long 2Private Declare PtrSafe Sub sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long) 3Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long 4Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long 5Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long 6 7 8Sub tst() 9 10'---------------ここから添付ファイルの共有フォルダへの保存 11 12'https://teratail.com/questions/173960 13 14 Dim time As Long 15 time = 30000 16 sleep time 17 18 19 Dim myNamespace As Outlook.NameSpace 20 Set myNamespace = Outlook.Application.Session 21 22 Dim myInbox As Outlook.Folder 23 Set myInbox = myNamespace.GetDefaultFolder(olFolderInbox) 24 25 Dim childFolder As Outlook.Folder 26 Set childFolder = myInbox .Folders.Item("フォルダA").Folders.Item("フォルダB") 27 28 29 '見つかったフォルダで一番最後に追加されたもの(≒おそらく最新)を取得する 30 Dim objItem As Outlook.MailItem '他の種類のものの可能性もあるので、Objectの方が無難かも 31 Set objItem = childFolder.Items.GetLast() 32 33 34' '以下は必要に応じて 35' With childFolder.Items 36' .Sort "ReceivedTime", True '受け取った日時で降順(新しいもの順)にソートする 37' Set objItem = .GetLast() '最初=一番古いものを取得 ラスト=最新のもの 38' End With 39 40 Dim strPath As String 41 strPath = "保存先のフォルダパス" 42 43 Dim objAttachment As Outlook.Attachment 44 For Each objAttachment In objItem.Attachments 45 Dim strFile As String 46 47 strFile = strPath & objAttachment.FileName 48 If InStr(strFile, ".xls") <> 0 Then 49 objAttachment.SaveAsFile strFile 50 'エクセルファイルのみ移動させる 51 52 53 End If 54 Next objAttachment 55 56 57 Set objItem = Nothing 58 Set objInbox = Nothing 59 Set objFolder = Nothing 60 61'------------- 62 63End Sub 64
試したこと
スクリプト実行の最初にスリープ30secを導入:受信に時間がかかり、最新のメールが受信仕切る前にスクリプトが実行されている可能性を考えた
→変化なし
Set objItem = childFolder.Items.GetLast()の部分を
' With childFolder.Items
' .Sort "ReceivedTime", True '受け取った日時で降順(新しいもの順)にソートする
' Set objItem = .GetLast() '最初=一番古いものを取得 ラスト=最新のもの
' End With
に変更
→変化なし
補足情報(FW/ツールのバージョンなど)
outlook 2016 (16.0.5182.1000)
補足
デバックモードでは最新分を取得できており、実際の実行では最新の一つ前になっているため
添付ファイルを取る前のメールアイテム指定の段階に問題があると考えています。
上記ソースの訂正方法をアドバイス頂けないでしょうか?
本当にお忙しい所大変申し訳無いのですがご助力頂けますと嬉しく思います。
以上、よろしくおねがいします
あなたの回答
tips
プレビュー