OutlookのメールをExcelに出力することができます。
いくつか例を用いて解説します。
目次
特定のメールをExcelに出力する方法
やりたいこと
- 受信フォルダ内のメールの中で、タイトルに「history」が含まれるメールに対して、そのタイトルと受信日時をExcelに出力する。
- 出力先のExcelは、デスクトップに保存された「contents.xls」とする
サンプルコードは以下のとおり。
Sub ExportHistoryEmailsToExcel()
' Excelアプリケーションを宣言
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim row As Integer
' Excelを起動してブックとシートを作成
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("C:\Users\ユーザー名\Desktop\contents.xls")
Set xlSheet = xlBook.Sheets(1)
' 行番号を初期化
row = 1
' Outlookの受信トレイフォルダを取得
Dim olApp As Outlook.Application
Dim olNamespace As Outlook.Namespace
Dim olFolder As Outlook.MAPIFolder
Dim olMail As Outlook.MailItem
Dim olItems As Outlook.Items
Dim i As Integer
Set olApp = Outlook.Application
Set olNamespace = olApp.GetNamespace("MAPI")
Set olFolder = olNamespace.GetDefaultFolder(olFolderInbox)
Set olItems = olFolder.Items
' 受信フォルダ内のメールをループ
For i = 1 To olItems.Count
If TypeName(olItems(i)) = "MailItem" Then
Set olMail = olItems(i)
' メールのタイトルに「history」が含まれるかをチェック
If InStr(olMail.Subject, "history") > 0 Then
' Excelシートにデータを書き込む
xlSheet.Cells(row, 1).Value = olMail.Subject
xlSheet.Cells(row, 2).Value = olMail.ReceivedTime
row = row + 1
End If
End If
Next i
' Excelファイルを保存して閉じる
xlBook.Save
xlBook.Close
xlApp.Quit
' オブジェクトを解放
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
Set olMail = Nothing
Set olItems = Nothing
Set olFolder = Nothing
Set olNamespace = Nothing
Set olApp = Nothing
MsgBox "データがExcelファイルに出力されました。", vbInformation
End SubサブフォルダのメールをExcelに出力する方法
やりたいこと
- 受信フォルダ内の特定のフォルダ内メール全てに対して、タイトルと送信者をExcelに出力する。
- 特定のフォルダとは、「seihin」というフォルダの中にある「consumer」とする
- 出力先のExcelは、デスクトップに保存された「contents.xls」とする
サンプルコードは以下のとおり。
Sub ExportEmailsToExcel()
' Outlookオブジェクトの宣言
Dim OutlookApp As Outlook.Application
Dim Inbox As Outlook.Folder
Dim ProductFolder As Outlook.Folder
Dim ConsumerFolder As Outlook.Folder
Dim MailItem As Outlook.MailItem
Dim i As Integer
' Excelオブジェクトの宣言
Dim ExcelApp As Object
Dim Workbook As Object
Dim Worksheet As Object
' Outlookアプリケーションの初期化
Set OutlookApp = New Outlook.Application
Set Inbox = OutlookApp.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
Set ProductFolder = Inbox.Folders("seihin")
Set ConsumerFolder = ProductFolder.Folders("consumer")
' Excelアプリケーションの初期化
Set ExcelApp = CreateObject("Excel.Application")
Set Workbook = ExcelApp.Workbooks.Open(Environ("USERPROFILE") & "\Desktop\contents.xls")
Set Worksheet = Workbook.Sheets(1)
' ヘッダー行の設定
Worksheet.Cells(1, 1).Value = "タイトル"
Worksheet.Cells(1, 2).Value = "送信者"
' メール情報の出力
i = 2 ' データの開始行
For Each MailItem In ConsumerFolder.Items
' メールの件名と送信者をExcelに出力
Worksheet.Cells(i, 1).Value = MailItem.Subject
Worksheet.Cells(i, 2).Value = MailItem.SenderName
i = i + 1
Next MailItem
' Excelファイルの保存と終了
Workbook.Save
Workbook.Close
ExcelApp.Quit
' オブジェクトの解放
Set Worksheet = Nothing
Set Workbook = Nothing
Set ExcelApp = Nothing
Set ConsumerFolder = Nothing
Set ProductFolder = Nothing
Set Inbox = Nothing
Set OutlookApp = Nothing
MsgBox "メール情報をExcelに出力しました。", vbInformation
End Subサブフォルダにある特定のメールをExcelに出力する方法
やりたいこと
- Outlookで実行するVBAマクロ
- 受信フォルダ内にある特定のフォルダ内の特定のメールを検索し、条件に合致するメールの件名と送信者と受信日時をExcelに出力する
- 特定のフォルダとは、受信フォルダ直下の「製品」フォルダの中にある「リリース」フォルダとする
- 特定のメールとは、本文に「リリース情報」の文字が含まれたものとする
- 出力先のExcelは、デスクトップに保存された「contents.xls」の「リリース履歴」シートとする
- メール件名はB列、送信者はC列、受信日時はD列に出力すること
サンプルコードは以下のとおり。
Sub ExportReleaseInfoToExcel()
' Outlookオブジェクトの宣言
Dim OutlookApp As Outlook.Application
Dim Namespace As Outlook.Namespace
Dim Inbox As Outlook.Folder
Dim ProductFolder As Outlook.Folder
Dim ReleaseFolder As Outlook.Folder
Dim MailItem As Object
' Excelオブジェクトの宣言
Dim ExcelApp As Object
Dim Workbook As Object
Dim Worksheet As Object
Dim LastRow As Long
' Outlookアプリケーションの初期化
Set OutlookApp = New Outlook.Application
Set Namespace = OutlookApp.GetNamespace("MAPI")
Set Inbox = Namespace.GetDefaultFolder(olFolderInbox)
' 「製品」フォルダと「リリース」フォルダの取得
On Error Resume Next
Set ProductFolder = Inbox.Folders("製品")
If ProductFolder Is Nothing Then
MsgBox "「製品」フォルダが見つかりません。", vbExclamation
Exit Sub
End If
Set ReleaseFolder = ProductFolder.Folders("リリース")
If ReleaseFolder Is Nothing Then
MsgBox "「リリース」フォルダが見つかりません。", vbExclamation
Exit Sub
End If
On Error GoTo 0
' Excelアプリケーションの初期化
Set ExcelApp = CreateObject("Excel.Application")
Set Workbook = ExcelApp.Workbooks.Open(Environ("USERPROFILE") & "\Desktop\contents.xls")
Set Worksheet = Workbook.Sheets("リリース履歴")
' 出力先の初期設定
LastRow = Worksheet.Cells(Worksheet.Rows.Count, "B").End(xlUp).Row + 1
' 「リリース」フォルダ内のメールをループ
For Each MailItem In ReleaseFolder.Items
' メールがMailItemであることを確認
If TypeOf MailItem Is Outlook.MailItem Then
' 本文に「リリース情報」が含まれるかを確認
If InStr(MailItem.Body, "リリース情報") > 0 Then
' メールの件名、送信者、受信日時をExcelに出力
Worksheet.Cells(LastRow, 2).Value = MailItem.Subject
Worksheet.Cells(LastRow, 3).Value = MailItem.SenderName
Worksheet.Cells(LastRow, 4).Value = MailItem.ReceivedTime
LastRow = LastRow + 1
End If
End If
Next MailItem
' Excelファイルの保存と終了
Workbook.Save
Workbook.Close
ExcelApp.Quit
MsgBox "指定された条件のメール情報をExcelに出力しました。", vbInformation
' オブジェクトの解放
Set Worksheet = Nothing
Set Workbook = Nothing
Set ExcelApp = Nothing
Set ReleaseFolder = Nothing
Set ProductFolder = Nothing
Set Inbox = Nothing
Set Namespace = Nothing
Set OutlookApp = Nothing
End SubアクティブになっているメールをExcelに出力する方法
やりたいこと
- Outlookで実行するVBAマクロ
- 選択された(アクティブになっている)メールの件名と送信者と受信日時と本文を、Excelに出力する
- 出力先のExcelは、デスクトップに保存された「contents.xls」の「リリース履歴」シートとする
- メール件名はB列、送信者はC列、受信日時はD列、本文はE列に出力すること
サンプルコードは以下のとおり。
Sub ExportSelectedEmailToExcel()
' Outlookオブジェクトの宣言
Dim OutlookApp As Outlook.Application
Dim MailItem As Outlook.MailItem
' Excelオブジェクトの宣言
Dim ExcelApp As Object
Dim Workbook As Object
Dim Worksheet As Object
Dim LastRow As Long
' Outlookアプリケーションの初期化
Set OutlookApp = New Outlook.Application
' 選択されたメールを取得
On Error Resume Next
Set MailItem = OutlookApp.ActiveExplorer.Selection.Item(1)
On Error GoTo 0
' メールが選択されていることを確認
If MailItem Is Nothing Then
MsgBox "メールが選択されていません。", vbExclamation
Exit Sub
End If
' Excelアプリケーションの初期化
Set ExcelApp = CreateObject("Excel.Application")
Set Workbook = ExcelApp.Workbooks.Open(Environ("USERPROFILE") & "\Desktop\contents.xls")
Set Worksheet = Workbook.Sheets("リリース履歴")
' 出力先の初期設定
LastRow = Worksheet.Cells(Worksheet.Rows.Count, "B").End(xlUp).Row + 1
' メールの件名、送信者、受信日時、本文をExcelに出力
Worksheet.Cells(LastRow, 2).Value = MailItem.Subject
Worksheet.Cells(LastRow, 3).Value = MailItem.SenderName
Worksheet.Cells(LastRow, 4).Value = MailItem.ReceivedTime
Worksheet.Cells(LastRow, 5).Value = MailItem.Body
' Excelファイルの保存と終了
Workbook.Save
Workbook.Close
ExcelApp.Quit
MsgBox "選択されたメールの情報をExcelに出力しました。", vbInformation
' オブジェクトの解放
Set Worksheet = Nothing
Set Workbook = Nothing
Set ExcelApp = Nothing
Set MailItem = Nothing
Set OutlookApp = Nothing
End SubExcelが開いているかをチェックする方法
「Excelを他の人が開いていて読み取り専用になっていて、出力できない、、、」なんてこともあるかと。
そこで、Excelの起動チェックする方法を紹介します。
前提
- 「AI.xlsm」のファイルは、「C:\Path\To\Excel2.xlsx」の場所にあらかじめ作成されている
やりたいこと
- AI.xlsmが起動しているかどうかをチェックする関数
- もしAI.xlsmが起動している場合は、戻り値としてTrueを返す。
- もしAI.xlsmが起動していない場合は、戻り値としてFalseを返す。
Function IsWorkbookOpen(workbookName As String) As Boolean
Dim xlApp As Object
Dim wb As Object
Dim wbOpen As Boolean
On Error Resume Next
' Excelアプリケーションにアクセス
Set xlApp = GetObject(, "Excel.Application")
' Excelが起動していない場合はFalseを返す
If xlApp Is Nothing Then
IsWorkbookOpen = False
Exit Function
End If
wbOpen = False
' 開いているすべてのブックをチェック
For Each wb In xlApp.Workbooks
If wb.FullName = "C:\Path\To\AI.xlsm" Then
wbOpen = True
Exit For
End If
Next wb
' 結果を返す
IsWorkbookOpen = wbOpen
' クリーンアップ
Set wb = Nothing
Set xlApp = Nothing
End Function
' この関数を使ってAI.xlsmが起動しているかをチェックする例
Sub CheckIfAIWorkbookIsOpen()
If IsWorkbookOpen("C:\Path\To\AI.xlsm") Then
MsgBox "AI.xlsmが起動しています。"
Else
MsgBox "AI.xlsmは起動していません。"
End If
End Sub