最近、メール関連で問題となっていて、メール情報を消失していました。
・メールアドレスのパスワードが無効化していて、突然HDDアクセスできなくなる。(昨年)
・フリーメールの運用中止があり、バックアップが間に合わなかった。(一昨年)
現在、利用できるメールは、ファイル感覚で管理したいと思っていたが、
フリーメールを主に使うので、メール専用アプリは所有していなく、
身近にあるアプリは、ノートPC購入時にオマケのExcel2013・Word2013があるくらい。
これらで、メールのメンテナンスを手軽に行えないかと考えていました。
今年1月にWindows7サポート終了で、Windows10に切り替えたPCに、再インストールしたら、
Office2013扱いになったようで、Outlook2013とPowerPoint2013が追加していたのだ。
このアプリを使うようになり、ブラウザメールに比べ、高い機能を知ります。
・複数メールアドレスを登録するだけで同時に使用できる。
・メール情報は、Excelファイルに抽出できる。
Outlook本体だけでExportが可能でも、日時情報が欠落しているのです。
さらに、抽出領域の指定なので、フォルダ数分を繰り返す必要があるのです。
そこで、アドレス別にメールを全抽出するマクロを作ってみました。
Outlookの全フォルダを検索し、Excelシートに抽出するものです。
macro機能
入力:Outlook2013のメール
出力:Excel2013のシート
・1件以上フォルダにメールが存在すれば、抽出する
(個人が追加したフォルダも対象にする)
・メールアドレスをシート名として抽出メールを展開する
・抽出項目
メール件数、受信日時、題目、送信者名、送信元アドレス、本文(255文字まで)
Sub getMail() ' outlook関連の初期設定を行う Dim i As Long Dim outlookObj As Outlook.Application Dim inboxFolder As Outlook.folder Dim myNameSpace As Object Set outlookObj = CreateObject("Outlook.Application") Set myNameSpace = outlookObj.GetNamespace("MAPI") Set inboxFolder = myNameSpace.GetDefaultFolder(olFolderInbox) ' デフォルトの受信フォルダ ' Excel関連の初期設定を行う Dim n As Long Dim acc As Account Dim sheet As Worksheet For Each acc In inboxFolder.Session.Accounts n = 2 ' 2行目から展開 Worksheets().Add After:=Worksheets(Worksheets.Count) ' 末尾に追加 Set sheet = ActiveSheet ' 現在アクティブなシートを取得する sheet.Name = acc ' Excelの先頭行に文字を設定する setSubject (sheet.Name) ' メールアドレス配下のoutlook情報を取得する Set inboxFolder = myNameSpace.folders(sheet.Name) ' メール情報のあるフォルダを検出する Call listSubFolders(inboxFolder, n, sheet.Name) Next ' 処理終了メッセージを表示する MsgBox "OutlookメールのExcel取得が完了しました。" ' 使用した変数を開放する Set outlookObj = Nothing Set myNameSpace = Nothing Set inboxFolder = Nothing End Sub Sub listSubFolders(ByVal folderOL As Outlook.folder, ByRef m As Long, ByRef nameSht As String) Dim fol As Outlook.folder For Each fol In folderOL.folders ' メール情報があれば、Excelに展開し、検索を続ける If fol.Items.Count > 0 Then ' Excelシートにメール情報を抽出する Call setCell(m, fol, nameSht) m = m + fol.Items.Count listSubFolders fol, m, nameSht End If Next Set fol = Nothing End Sub Sub setSubject(ByRef nameSht As String) With Sheets(nameSht) Range("A" & 1).Value = "件" Range("B" & 1).Value = "名前毎の件数" Range("C" & 1).Value = "受信日時" Range("D" & 1).Value = "題目" Range("E" & 1).Value = "送信者名" Range("F" & 1).Value = "送信元アドレス" Range("G" & 1).Value = "本文" End With End Sub Sub setCell(ByVal num As Integer, ByRef folder As Outlook.folder, ByRef nameSht As String) Dim i As Long Dim objItem As Object For i = 1 To folder.Items.Count Set objItem = folder.Items(i) With Sheets(nameSht) Range("A" & num).Value = num - 1 Range("B" & num).Value = folder & "[" & CStr(i) & "]" Range("C" & num).Value = objItem.ReceivedTime Range("D" & num).Value = objItem.Subject Range("E" & num).Value = objItem.SenderName Range("F" & num).Value = objItem.SenderEmailAddress Range("G" & num).Value = Left(objItem.Body, 255) End With num = num + 1 Next Set objItem = Nothing End Sub
件数が多いとそれなりに時間かかるので、ご注意ください。