質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

0回答

1569閲覧

outlookで最新のメールの添付ファイルを自動保存したい

ma2shiro

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2021/12/06 06:38

前提・実現したいこと

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)

補足

デバックモードでは最新分を取得できており、実際の実行では最新の一つ前になっているため
添付ファイルを取る前のメールアイテム指定の段階に問題があると考えています。

上記ソースの訂正方法をアドバイス頂けないでしょうか?
本当にお忙しい所大変申し訳無いのですがご助力頂けますと嬉しく思います。

以上、よろしくおねがいします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問