Excel 单击表格单元格时如何调用MailItem.Display方法?

Excel 单击表格单元格时如何调用MailItem.Display方法?,excel,vba,outlook,Excel,Vba,Outlook,我需要调用OutlookMailItem.Display方法,在Excel中单击表列中的特定单元格时显示 下面是我填写表格的模块 ”此模块执行电子邮件检索和查看。动态地将电子邮件信息添加到表中并创建 '在模式窗口中打开Outlook邮件项目的链接。 选项显式 '初始化Outlook对象 Dim appOL、appNS、appFolder、电子邮件作为对象 '初始化ListObject 作为ListObject的Dim tbl '将电子邮件信息添加到tbl_电子邮件_数据 公共子addDataTo

我需要调用Outlook
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模式中显示电子邮件