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

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

ただいまの
回答率

89.10%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,295

ocome85

score 33

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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

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


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

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

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

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

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

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

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

コード

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

Private Sub SaveAttachmentFile2()
'https://teratail.com/questions/173960

    Dim myNamespace As Outlook.NameSpace
    Set myNamespace = Outlook.Application.Session

    '受信トレイの中の「あさ」フォルダを取得する
    Dim myInbox As Outlook.Folder
    Set myInbox = myNamespace.GetDefaultFolder(olFolderInbox)

    Dim childFolder As Outlook.Folder
    Set childFolder = myInbox.Folders.Item("あさ")


    '見つかったフォルダで一番最後に追加されたもの(≒おそらく最新)を取得する
    Dim objItem As Outlook.MailItem '他の種類のものの可能性もあるので、Objectの方が無難かも
    Set objItem = childFolder.Items.GetLast()


'    '以下は必要に応じて
'    With childFolder.Items
'        .Sort "ReceivedTime", True '受け取った日時で降順(新しいもの順)にソートする
'        Set objItem = .GetFirst() '最初=一番新しいものを取得
'    End With

    Dim strPath As String
    strPath = "C:\保存フォルダ\"

    Dim objAttachment As Outlook.Attachment
    For Each objAttachment In objItem.Attachments
        Dim strFile As String
        strFile = strPath & objAttachment.FileName
        objAttachment.SaveAsFile strFile
    Next objAttachment

End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/14 09:52 編集

    正しく動く事は確認しましたが、他の追い方等全て確認させていただきます。

    ローカルウィンドウは初めて知りました。
    そこらの機能も一度調べる必要がありそうです :)
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる