Excel 单击表格单元格时如何调用MailItem.Display方法?
我需要调用OutlookExcel 单击表格单元格时如何调用MailItem.Display方法?,excel,vba,outlook,Excel,Vba,Outlook,我需要调用OutlookMailItem.Display方法,在Excel中单击表列中的特定单元格时显示 下面是我填写表格的模块 ”此模块执行电子邮件检索和查看。动态地将电子邮件信息添加到表中并创建 '在模式窗口中打开Outlook邮件项目的链接。 选项显式 '初始化Outlook对象 Dim appOL、appNS、appFolder、电子邮件作为对象 '初始化ListObject 作为ListObject的Dim tbl '将电子邮件信息添加到tbl_电子邮件_数据 公共子addDataTo
MailItem.Display方法,在Excel中单击表列中的特定单元格时显示
下面是我填写表格的模块
”此模块执行电子邮件检索和查看。动态地将电子邮件信息添加到表中并创建
'在模式窗口中打开Outlook邮件项目的链接。
选项显式
'初始化Outlook对象
Dim appOL、appNS、appFolder、电子邮件作为对象
'初始化ListObject
作为ListObject的Dim tbl
'将电子邮件信息添加到tbl_电子邮件_数据
公共子addDataToEmailTable()
'GetDefaultFolder(6)是登录Outlook桌面版本的用户的“收件箱”。
'不考虑收件箱中的子文件夹,也不适用于Web Outlook版本。
Set appOL=CreateObject(“Outlook.Application”)
设置appNS=appOL.GetNamespace(“MAPI”)
设置appFolder=appNS.GetDefaultFolder(6)
'初始化表
设置tbl=ThisWorkbook.Worksheets(“电子邮件”).ListObjects(“tbl\u电子邮件\u数据”)
暗行数与长行数相同
行数=1
如果tbl.DataBodyRange为空,则
tbl.ListRows.Add
如果结束
'循环浏览电子邮件并将信息输入tbl_电子邮件_数据
对于appFolder.Items中的每封电子邮件
如果email.Unread=True,则
tbl.DataBodyRange.Cells(行计数,1).Value2=“未读”
其他的
tbl.DataBodyRange.Cells(行计数,1).Value2=“读取”
如果结束
tbl.DataBodyRange.Cells(rowCount,2).Value2=email.SenderName
tbl.DataBodyRange.Cells(rowCount,3).Value2=email.SentOn
tbl.DataBodyRange.Cells(rowCount,4).Value2=email.Subject
rowCount=rowCount+1
下一封电子邮件
端接头
我打算创建一个带有组合框的用户表单,因此当选中时,文本框将填充item.body
这不包括嵌入的图像和HTML格式的消息
我看到Outlook有一个用于mailitem的方法,它可以直接打开电子邮件而不退出Excel。因此我找到了如何调用mailitem.Display方法,该方法基于一个表,该表表示Outlook收件箱文件夹中的电子邮件信息。很多尝试和错误,但我成功了。下面是处理所有这些问题的模块的完整代码
Option Explicit
Public excelInbox As Collection
Dim appOL, appNS, appInbox, appItem As Object
Public isOnline As Boolean
Public Function checkConnection(status As Boolean)
Set appOL = CreateObject("Outlook.Application")
Set appNS = appOL.GetNameSpace("MAPI")
If appNS.Offline = True Then
MsgBox "Outlook account is not connected to Exchange server. Please verify network connection to get updated Inbox preview"
status = False
Set appNS = Nothing
Set appOL = Nothing
Else
MsgBox "Outlook account is online"
status = True
End If
Set appInbox = appNS.GetDefaultFolder(6)
Set excelInbox = New Collection
End Function
Public Sub makeExcelInbox()
Call checkConnection(isOnline)
If isOnline <> True Then Exit Sub
Set appInbox = appNS.GetDefaultFolder(6) '6 is the enumeration for Inbox root folder in Outlook.
'loop and place only emails into excel Inbox.
For Each appItem In appInbox.Items
If appItem.Class = 43 Then excelInbox.Add appItem '43 represents a mail item in Outlook.
Next appItem
End Sub
Public Sub makeEmailPreviewTable()
Call makeExcelInbox
If excelInbox.Count <> 0 Then
Dim tbl As ListObject
Dim rowCount As Integer
Set tbl = ws_email.ListObjects("tbl_emailData")
rowCount = 1
For Each appItem In excelInbox
If appItem.Unread = True Then
tbl.DataBodyRange.Cells(rowCount, 1).Value2 = "Unread"
Else
tbl.DataBodyRange.Cells(rowCount, 1).Value2 = "Read"
End If
tbl.DataBodyRange.Cells(rowCount, 2).Value2 = appItem.SenderName
tbl.DataBodyRange.Cells(rowCount, 3).Value2 = appItem.SentOn
tbl.DataBodyRange.Cells(rowCount, 4).Value2 = appItem.Subject
rowCount = rowCount + 1
Next appItem
Set tbl = Nothing
ElseIf excelInbox.Count = 0 Then MsgBox "No messages to show in Inbox Preview."
End If
End Sub
Public Function getEmailForDisplay(Target As Range)
'Call makeExcelInbox
For Each appItem In excelInbox
If Target.Value = appItem.Subject Then appItem.Display
Next appItem
End Function
重要的是,我仍在设计这个程序,因此如果您对代码进行采样,您必须确保有一个名为“tbl_emailData”的表和一个名为“ws_email”的工作表。然后,当您想要运行代码时,请确保首先运行子“MakeMailPreviewTable”。在我的设计中,工作表和单元格都将被锁定,因此只有主题列单元格可以选择,这可以防止用户选择多个单元格时出现运行时错误
更新:在选择事件中添加错误处理,以忽略多个选择错误。这将忽略,然后在选择适当的单元格后,在Outlook模式下显示电子邮件。因此我找到了如何调用MailItem.display方法,该方法基于表示Outlook收件箱文件夹中电子邮件信息的表。很多尝试和错误,但我成功了。下面是处理所有这些问题的模块的完整代码
Option Explicit
Public excelInbox As Collection
Dim appOL, appNS, appInbox, appItem As Object
Public isOnline As Boolean
Public Function checkConnection(status As Boolean)
Set appOL = CreateObject("Outlook.Application")
Set appNS = appOL.GetNameSpace("MAPI")
If appNS.Offline = True Then
MsgBox "Outlook account is not connected to Exchange server. Please verify network connection to get updated Inbox preview"
status = False
Set appNS = Nothing
Set appOL = Nothing
Else
MsgBox "Outlook account is online"
status = True
End If
Set appInbox = appNS.GetDefaultFolder(6)
Set excelInbox = New Collection
End Function
Public Sub makeExcelInbox()
Call checkConnection(isOnline)
If isOnline <> True Then Exit Sub
Set appInbox = appNS.GetDefaultFolder(6) '6 is the enumeration for Inbox root folder in Outlook.
'loop and place only emails into excel Inbox.
For Each appItem In appInbox.Items
If appItem.Class = 43 Then excelInbox.Add appItem '43 represents a mail item in Outlook.
Next appItem
End Sub
Public Sub makeEmailPreviewTable()
Call makeExcelInbox
If excelInbox.Count <> 0 Then
Dim tbl As ListObject
Dim rowCount As Integer
Set tbl = ws_email.ListObjects("tbl_emailData")
rowCount = 1
For Each appItem In excelInbox
If appItem.Unread = True Then
tbl.DataBodyRange.Cells(rowCount, 1).Value2 = "Unread"
Else
tbl.DataBodyRange.Cells(rowCount, 1).Value2 = "Read"
End If
tbl.DataBodyRange.Cells(rowCount, 2).Value2 = appItem.SenderName
tbl.DataBodyRange.Cells(rowCount, 3).Value2 = appItem.SentOn
tbl.DataBodyRange.Cells(rowCount, 4).Value2 = appItem.Subject
rowCount = rowCount + 1
Next appItem
Set tbl = Nothing
ElseIf excelInbox.Count = 0 Then MsgBox "No messages to show in Inbox Preview."
End If
End Sub
Public Function getEmailForDisplay(Target As Range)
'Call makeExcelInbox
For Each appItem In excelInbox
If Target.Value = appItem.Subject Then appItem.Display
Next appItem
End Function
重要的是,我仍在设计这个程序,因此如果您对代码进行采样,您必须确保有一个名为“tbl_emailData”的表和一个名为“ws_email”的工作表。然后,当您想要运行代码时,请确保首先运行子“MakeMailPreviewTable”。在我的设计中,工作表和单元格都将被锁定,因此只有主题列单元格可以选择,这可以防止用户选择多个单元格时出现运行时错误
更新:在选择事件中添加错误处理,以忽略多个选择错误。这将忽略,然后在选择适当的单元格后,在Outlook模式中显示电子邮件