step3.5 文字列操作で必要な最低限の知識もカバーしました。
これで下準備は万全です。
今回は、早速メールに添付されているファイルを一括でマクロを使って保存する方法について整理しましょう。
これでほとんど目標に掲げたことをカバーできるようになります。
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個でも問題なし!!
ただ、安定したツールにするにはいくつかハードルが残っています。
・保存フォルダに既に同一ファイル名があったらどうする?
・一つのアドレスしか指定してないけど、実際にはもっとたくさんある
・アドレスだけじゃなくて、もっと複数の条件で絞らないといらない添付ファイルまで保存してしまう。
などなど。
次のエントリーで、そうした問題を整理しながら回避する方法をまとめましょう。
素晴らしい。とても役に立ちます。
返信削除ただ
myfolder.Items(i).Attachments(j).SaveAsFile (path & myfolder.Item(i).Attachments(j).DisplayName)
の二番目がitemでなくて複数形にしないとだめでした。一応ご報告まで。
For j = attm も
For j = 1 To attm としました。
いろいろ方言があって素人にはたまりません。
ありがとうございました。
コメントありがとうございました。
返信削除頂いたミスは修正いたしました。
item itemsはどの文脈で使うかによって使い分けが必要です。
上記のように、()つきの添え字が必要な場合は複数形になります。
ご理解の一助になれば幸いです
私は、簡単なマクロをネットで探して、意味や用語も曖昧なまま、コピペで上手く動けば成功!と喜んでいるレベルです。このStep4で気付いたことを書きます。
返信削除1.8行目の(olFolderInbox)は、(6)に変更しました(Wrod2013、Outlook2013の環境です)
2.15行目のフォルダーは、先に作っておかないとエラーがでます
3.27行目 For j =1 to attm は、イコールと1の間にブランクがありませんが、張り付けると自動的に間が空きます
初心者の自分は、初体験で大変驚きました
4."Loopに対応するDoがありません"とのメッセージが出ますので、31行目Loopの前に End If を挿入しました
結果は、大成功!このようなページを作っていただき改めて感謝いたします。ありがとうございました。