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

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

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

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

Outlook

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

Q&A

解決済

1回答

2125閲覧

outlook VBAを使用した最新メールの添付ファイルを特定のフォルダへ取り込む方法

ocome85

総合スコア33

VBA

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

Outlook

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

0グッド

1クリップ

投稿2019/02/12 04:57

編集2019/02/12 04:59

OUTLOOKで使用するVBA を使うのはほぼ初めての為、
https://tonari-it.com/outlook-vba-mail-attachment-saveasfile/
https://tonari-it.com/outlook-vba-subfolder-mail-attachmentfile/
を殆ど引用という形で
フォルダ内(あさ)の最新受信1件の添付ファイルを対象(C:\保存フォルダ) へ保存できるようにしようとしています。

素人目で Set objItem = が フォルダ内最新を選択できれば動くように感じるますが、このままだと

For Each objAttachment In .Attachments

でエラーが出てしまいます。
修正方法を教えていただきたいです。

ここからコード

Sub SaveAttachmentFile() Dim objItem As Object Dim objIns As Inspector Dim strFile As String Dim strPath As String Dim objAttachment As Object Set objIns = Application.ActiveInspector Set myNamespace = GetNamespace("MAPI") Set myInbox = myNamespace.GetDefaultFolder(olFolderInbox) Set objItem = myInbox.Folders.Item("あさ") strPath = "C:\保存フォルダ\" With objItem For Each objAttachment In .Attachments strFile = strPath & objAttachment objAttachment.SaveAsFile strFile Next objAttachment End With End Sub

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーが出たのであれば、そのメッセージを質問に記載した方が、回答もしやすい場合がありますね。

VBAの場合、エラーのダイアログの「デバッグ」を押して、イミディエイトウィンドウで?Err.Descriptionとすることで取得できます。


参考:エラー原因の追い方(一例)

今回問題となったエラーはおそらく、
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
だと思われます。
このエラーは、そのオブジェクトに該当するプロパティなどがない場合に発生します。

エラー発生箇所を見るに、objItemAttachmentsが取得できないと予測できます。
また、objItemの取得方法を確認するとmyInbox.Folders.Item("あさ")となっており、FoldersItem、つまりメールなどではなくフォルダーを取得している雰囲気があります。

objItemの中身が怪しい、ということで、変数の中身を確認してみます。

実際に変数に入っているものを確認したい場合は「ローカルウィンドウ」を使うのが便利です。
ローカルウィンドウを表示しておくと、プロシージャ実行中に変数の一覧以下のように表示され、型や中身などを簡単に確認できます。
ローカルウィンドウ

こちらを見ると、objItemの中身がMAPIFolder(これは内部用のオブジェクトと思われるので、宣言に使える型としてはOutlook.Folder)であることがわかります。

という事で、今回の問題の原因は、Set objItem = が、フォルダ内最新のアイテムではなく、その一歩手間のフォルダ取得で終わっていたことだとわかりました。

コード

以上を踏まえてざっくり整理・追記を行うと以下のような感じでしょうか。

vba

1Private Sub SaveAttachmentFile2() 2'https://teratail.com/questions/173960 3 4 Dim myNamespace As Outlook.NameSpace 5 Set myNamespace = Outlook.Application.Session 6 7 '受信トレイの中の「あさ」フォルダを取得する 8 Dim myInbox As Outlook.Folder 9 Set myInbox = myNamespace.GetDefaultFolder(olFolderInbox) 10 11 Dim childFolder As Outlook.Folder 12 Set childFolder = myInbox.Folders.Item("あさ") 13 14 15 '見つかったフォルダで一番最後に追加されたもの(≒おそらく最新)を取得する 16 Dim objItem As Outlook.MailItem '他の種類のものの可能性もあるので、Objectの方が無難かも 17 Set objItem = childFolder.Items.GetLast() 18 19 20' '以下は必要に応じて 21' With childFolder.Items 22' .Sort "ReceivedTime", True '受け取った日時で降順(新しいもの順)にソートする 23' Set objItem = .GetFirst() '最初=一番新しいものを取得 24' End With 25 26 Dim strPath As String 27 strPath = "C:\保存フォルダ\" 28 29 Dim objAttachment As Outlook.Attachment 30 For Each objAttachment In objItem.Attachments 31 Dim strFile As String 32 strFile = strPath & objAttachment.FileName 33 objAttachment.SaveAsFile strFile 34 Next objAttachment 35 36End Sub

投稿2019/02/12 16:32

imihito

総合スコア2166

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

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

ocome85

2019/02/14 00:53 編集

正しく動く事は確認しましたが、他の追い方等全て確認させていただきます。 ローカルウィンドウは初めて知りました。 そこらの機能も一度調べる必要がありそうです :) ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問