2011年11月17日木曜日

step4 添付ファイルを一括で自動保存

step3 送信者のアドレス、件名を習得できるようになりました
step3.5 文字列操作で必要な最低限の知識もカバーしました。

これで下準備は万全です。

今回は、早速メールに添付されているファイルを一括でマクロを使って保存する方法について整理しましょう。

これでほとんど目標に掲げたことをカバーできるようになります。




NTTフレッツ光






Sub Outlook_test()
Dim objOL As Object
Dim objNAMESPC As Object
Dim myfolder As Object

Set objOL = CreateObject("Outlook.Application")
Set objNAMESPC = objOL.GetNamespace("MAPI")
Set myfolder = objNAMESPC.GetDefaultFolder(olFolderInbox)
Debug.Print myfolder

myfolder.Items.Count
Debug.Print myfolder.Items.Count

Dim path As String
path ="C://abc/"  '保存先のフォルダ名

Dim i As Long
i = 1
Dim ItemNumber As Long
ItemNumber = myfolder.Items.Count
Do While i <= ItemNumber
   Debug.print "受信時間" & myfolder.Items(i).ReceivedTime & "アドレス" & myfolder.Items(i).SenderEmailAddress & "件名" & myfolder.Items(i).Subject

 If UCase(myfolder.Items(i).SenderEmailAddress) Like UCase("yamada[@]outlook[.]com") then
            Dim attm as Integer
       attm = myfolder.Items(i).Attachments.Count
          For j =1 to attm
              myfolder.Items(i).Attachments(j).SaveAsFile (path & myfolder.Items(i).Attachments(j).DisplayName)
          Next j
i = i + 1
Loop
End Sub
さて解説です。
Dim path As String path ="C://abc/" '保存先のフォルダ名。
ここで、保存先フォルダを指定しています。 あとで、ファイル保存するとこれでも触れますが、最後に「/」(もしくは「\」)を付けて下さい。 これがないと、フォルダ名とファイル名がごっちゃになってしまい、保存できません。
If UCase(myfolder.Items(i).SenderEmailAddress) Like UCase("yamada[@]outlook[.]com") then Dim attm as Integer attm = myfolder.Items(i).Attachments.Count For j = attm myfolder.Items(i).Attachments(j).SaveAsFile (path & myfolder.Item(i).Attachments(j).DisplayName)
ここが本日のポイント。 やっていることは、 yamada[@]outlook[.]comから届いたメールのみを対象にして、添付してあるファイルを順番に、指定したフォルダに保存 です。 UCase関数で、すべて大文字にしてあげてます。 どの文字が大文字か事前に予想できない場合は、全て大文字化してしまえばスルーすることはないですし、個別に条件を追加しなくてもすみます。 <ここで、注意点!> 「@」「-」「_」「.」などは[]でくくって下さい。 くくらないとこれら記号は、文字列として処理できません。 ちなみに、ファイルが複数添付されていてもいいように、
attm = myfolder.Items(i).Attachments.Count
で添付ファイルの合計数を数えて、1番目からその合計数まで保存作業を繰り返させています。 保存作業はここですね。
myfolder.Items(i).Attachments(j).SaveAsFile (path & myfolder.Item(i).Attachments(j).DisplayName)
「SaveAsFile」で、保存 「DisplayName」が添付ファイルのファイル名を取得するメソッドです。 DisplayNameはDisplayとありますが、拡張子を非表示にしていても、拡張子付きでファイル名を返してくれます。 これで、添付ファイルは保存できるようになりました。 しかもファイルがいくつ添付されていようと対応可能です。 100個で200個でも問題なし!! ただ、安定したツールにするにはいくつかハードルが残っています。 ・保存フォルダに既に同一ファイル名があったらどうする? ・一つのアドレスしか指定してないけど、実際にはもっとたくさんある ・アドレスだけじゃなくて、もっと複数の条件で絞らないといらない添付ファイルまで保存してしまう。 などなど。 次のエントリーで、そうした問題を整理しながら回避する方法をまとめましょう。 PVランキング 人気ブログランキングへ

3 件のコメント:

  1. 素晴らしい。とても役に立ちます。
    ただ
    myfolder.Items(i).Attachments(j).SaveAsFile (path & myfolder.Item(i).Attachments(j).DisplayName)
    の二番目がitemでなくて複数形にしないとだめでした。一応ご報告まで。

    For j = attm も
    For j = 1 To attm としました。
    いろいろ方言があって素人にはたまりません。
    ありがとうございました。

    返信削除
  2. コメントありがとうございました。
    頂いたミスは修正いたしました。
    item itemsはどの文脈で使うかによって使い分けが必要です。
    上記のように、()つきの添え字が必要な場合は複数形になります。
    ご理解の一助になれば幸いです

    返信削除
  3. 私は、簡単なマクロをネットで探して、意味や用語も曖昧なまま、コピペで上手く動けば成功!と喜んでいるレベルです。このStep4で気付いたことを書きます。
    1.8行目の(olFolderInbox)は、(6)に変更しました(Wrod2013、Outlook2013の環境です)
    2.15行目のフォルダーは、先に作っておかないとエラーがでます
    3.27行目 For j =1 to attm は、イコールと1の間にブランクがありませんが、張り付けると自動的に間が空きます
      初心者の自分は、初体験で大変驚きました
    4."Loopに対応するDoがありません"とのメッセージが出ますので、31行目Loopの前に End If を挿入しました
    結果は、大成功!このようなページを作っていただき改めて感謝いたします。ありがとうございました。

    返信削除