Excel 方法';本手册';对象的'_全球';失败

Excel 方法';本手册';对象的'_全球';失败,excel,vba,outlook,Excel,Vba,Outlook,我正在尝试将邮件的主题sendername、电子邮件日期从PST邮箱复制到excel工作簿。 以下是我目前掌握的代码: Option Explicit Sub Download_Outlook_Mail_To_Excel() Dim Folder As Outlook.MAPIFolder Dim sFolders As Outlook.MAPIFolder Dim iRow As Integer, oRow As Integer Dim MailBoxName As String, Pst_F

我正在尝试将邮件的主题sendername、电子邮件日期从PST邮箱复制到excel工作簿。 以下是我目前掌握的代码:

Option Explicit
Sub Download_Outlook_Mail_To_Excel()
Dim Folder As Outlook.MAPIFolder
Dim sFolders As Outlook.MAPIFolder
Dim iRow As Integer, oRow As Integer
Dim MailBoxName As String, Pst_Folder_Name  As String


MailBoxName = "Backupmailbox"


Pst_Folder_Name = "Inbox1" 'Sample "Inbox" or "Sent Items"

'To directly a Folder at a high level
'Set Folder = Outlook.Session.Folders(MailBoxName).Folders(Pst_Folder_Name)

'To access a main folder or a subfolder (level-1)
For Each Folder In Outlook.Session.Folders(MailBoxName).Folders
    If VBA.UCase(Folder.Name) = VBA.UCase(Pst_Folder_Name) Then GoTo Label_Folder_Found
    For Each sFolders In Folder.Folders
        If VBA.UCase(sFolders.Name) = VBA.UCase(Pst_Folder_Name) Then
            Set Folder = sFolders
            GoTo Label_Folder_Found
        End If
    Next sFolders
Next Folder

Label_Folder_Found:
 If Folder.Name = "" Then
    MsgBox "Invalid Data in Input"
    GoTo End_Lbl1:
End If

'Read Through each Mail and export the details to Excel for Email Archival
ThisWorkbook.Sheets(1).Activate
Folder.Items.Sort "Received"

'Insert Column Headers
ThisWorkbook.Sheets(1).Cells(1, 1) = "Sender"
ThisWorkbook.Sheets(1).Cells(1, 2) = "Subject"
ThisWorkbook.Sheets(1).Cells(1, 3) = "Date"
ThisWorkbook.Sheets(1).Cells(1, 4) = "Size"
ThisWorkbook.Sheets(1).Cells(1, 5) = "EmailID"
'ThisWorkbook.Sheets(1).Cells(1, 6) = "Body"

'Export eMail Data from PST Folder
oRow = 1
For iRow = 1 To Folder.Items.Count
    'If condition to import mails received in last 60 days
    'To import all emails, comment or remove this IF condition
    If VBA.DateValue(VBA.Now) - VBA.DateValue(Folder.Items.Item(iRow).ReceivedTime) <= 60 Then
       oRow = oRow + 1
       ThisWorkbook.Sheets(1).Cells(oRow, 1).Select
       ThisWorkbook.Sheets(1).Cells(oRow, 1) = Folder.Items.Item(iRow).SenderName
       ThisWorkbook.Sheets(1).Cells(oRow, 2) = Folder.Items.Item(iRow).Subject
       ThisWorkbook.Sheets(1).Cells(oRow, 3) = Folder.Items.Item(iRow).ReceivedTime
       ThisWorkbook.Sheets(1).Cells(oRow, 4) = Folder.Items.Item(iRow).Size
       ThisWorkbook.Sheets(1).Cells(oRow, 5) = Folder.Items.Item(iRow).SenderEmailAddress
       'ThisWorkbook.Sheets(1).Cells(oRow, 6) = Folder.Items.Item(iRow).Body
    End If
Next iRow
MsgBox "Outlook Mails Extracted to Excel"
Set Folder = Nothing
Set sFolders = Nothing

End_Lbl1:
End Sub
选项显式
子下载\u Outlook\u Mail\u至\u Excel()
将文件夹设置为Outlook.MAPIFolder
将文件夹设置为Outlook.MAPIFolder
Dim iRow为整数,oRow为整数
Dim MailBoxName为字符串,Pst_文件夹_名称为字符串
MailBoxName=“备份邮箱”
Pst_Folder_Name=“Inbox1”示例“收件箱”或“已发送邮件”
'以直接在高级别创建文件夹
'设置文件夹=Outlook.Session.Folders(邮箱名称).文件夹(Pst文件夹名称)
'访问主文件夹或子文件夹(级别1)
对于Outlook.Session.Folders(MailBoxName).Folders中的每个文件夹
如果VBA.UCase(Folder.Name)=VBA.UCase(Pst_Folder_Name),则转到找到的标签_Folder_
对于文件夹中的每个文件夹。文件夹
如果VBA.UCase(sFolders.Name)=VBA.UCase(Pst_文件夹名称),则
设置文件夹=s文件夹
转到找到的标签\u文件夹\u
如果结束
下一个文件夹
下一个文件夹
找到标签\u文件夹\u:
如果Folder.Name=“”,则
MsgBox“输入中的数据无效”
转到端_Lbl1:
如果结束
'通读每封邮件并将详细信息导出到Excel以进行电子邮件存档
此工作簿。工作表(1)。激活
Folder.Items.Sort“已接收”
'插入列标题
此工作簿.工作表(1).单元格(1,1)=“发件人”
此工作簿。工作表(1)。单元格(1,2)=“主题”
此工作簿。工作表(1)。单元格(1,3)=“日期”
此工作簿。工作表(1)。单元格(1,4)=“大小”
ThisWorkbook.Sheets(1).单元格(1,5)=“EmailID”
'ThisWorkbook.Sheets(1).单元格(1,6)=“正文”
'从PST文件夹导出电子邮件数据
oRow=1
对于iRow=1到Folder.Items.Count
“如果有条件导入过去60天内收到的邮件
'若要导入所有电子邮件,请注释或删除此条件

如果VBA.DateValue(VBA.Now)-VBA.DateValue(Folder.Items.Item(iRow.ReceivedTime)只是几个快速调整,请尝试以下操作:

Option Explicit
Sub Download_Outlook_Mail_To_Excel()
Dim Folder          As Outlook.MAPIFolder
Dim sFolders        As Outlook.MAPIFolder
Dim iRow            As Integer
Dim oRow            As Integer
Dim MailBoxName     As String
Dim Pst_Folder_Name As String

Const xlWorkbookName As String = "C:\Users\MacroMan\MyWorkbook.xlsx" '// change as required

'// I'm using late binding in case you don't actually have a reference set.
Dim xlApp           As Object
Dim xlWB            As Object

Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False

Set xlWB = xlApp.Workbooks.Open(xlWorkbookName)

MailBoxName = "Backupmailbox"


Pst_Folder_Name = "Inbox1" 'Sample "Inbox" or "Sent Items"

'To directly a Folder at a high level
'Set Folder = Outlook.Session.Folders(MailBoxName).Folders(Pst_Folder_Name)

'To access a main folder or a subfolder (level-1)
For Each Folder In Outlook.Session.Folders(MailBoxName).Folders
    If VBA.UCase(Folder.Name) = VBA.UCase(Pst_Folder_Name) Then GoTo Label_Folder_Found
    For Each sFolders In Folder.Folders
        If VBA.UCase(sFolders.Name) = VBA.UCase(Pst_Folder_Name) Then
            Set Folder = sFolders
            GoTo Label_Folder_Found
        End If
    Next sFolders
Next Folder

Label_Folder_Found:
 If Folder.Name = "" Then
    MsgBox "Invalid Data in Input"
    GoTo End_Lbl1:
End If

'Read Through each Mail and export the details to Excel for Email Archival
xlWB.Sheets(1).Activate
Folder.Items.Sort "Received"

'Insert Column Headers
xlWB.Sheets(1).Cells(1, 1) = "Sender"
xlWB.Sheets(1).Cells(1, 2) = "Subject"
xlWB.Sheets(1).Cells(1, 3) = "Date"
xlWB.Sheets(1).Cells(1, 4) = "Size"
xlWB.Sheets(1).Cells(1, 5) = "EmailID"
'ThisWorkbook.Sheets(1).Cells(1, 6) = "Body"

'Export eMail Data from PST Folder
oRow = 1
For iRow = 1 To Folder.Items.Count
    'If condition to import mails received in last 60 days
    'To import all emails, comment or remove this IF condition
    If VBA.DateValue(VBA.Now) - VBA.DateValue(Folder.Items.Item(iRow).ReceivedTime) <= 60 Then
       oRow = oRow + 1
       xlWB.Sheets(1).Cells(oRow, 1).Select
       xlWB.Sheets(1).Cells(oRow, 1) = Folder.Items.Item(iRow).SenderName
       xlWB.Sheets(1).Cells(oRow, 2) = Folder.Items.Item(iRow).Subject
       xlWB.Sheets(1).Cells(oRow, 3) = Folder.Items.Item(iRow).ReceivedTime
       xlWB.Sheets(1).Cells(oRow, 4) = Folder.Items.Item(iRow).Size
       xlWB.Sheets(1).Cells(oRow, 5) = Folder.Items.Item(iRow).SenderEmailAddress
       'ThisWorkbook.Sheets(1).Cells(oRow, 6) = Folder.Items.Item(iRow).Body
    End If
Next iRow
MsgBox "Outlook Mails Extracted to Excel"
Set Folder = Nothing
Set sFolders = Nothing

xlWB.Close False
Set xlWB = Nothing

xlApp.Quit
Set xlApp = Nothing

End_Lbl1:
End Sub
选项显式
子下载\u Outlook\u Mail\u至\u Excel()
将文件夹设置为Outlook.MAPIFolder
将文件夹设置为Outlook.MAPIFolder
Dim iRow作为整数
Dim-oRow为整数
Dim MailBoxName作为字符串
Dim Pst_文件夹_名称为字符串
Const xlWorkbookName As String=“C:\Users\MacroMan\MyWorkbook.xlsx”//根据需要进行更改
“//我正在使用后期绑定,以防您实际上没有引用集。
将xlApp作为对象
作为对象的Dim xlWB
设置xlApp=CreateObject(“Excel.Application”)
xlApp.Visible=False
设置xlWB=xlApp.Workbooks.Open(xlWorkbookName)
MailBoxName=“备份邮箱”
Pst_Folder_Name=“Inbox1”示例“收件箱”或“已发送邮件”
'以直接在高级别创建文件夹
'设置文件夹=Outlook.Session.Folders(邮箱名称).文件夹(Pst文件夹名称)
'访问主文件夹或子文件夹(级别1)
对于Outlook.Session.Folders(MailBoxName).Folders中的每个文件夹
如果VBA.UCase(Folder.Name)=VBA.UCase(Pst_Folder_Name),则转到找到的标签_Folder_
对于文件夹中的每个文件夹。文件夹
如果VBA.UCase(sFolders.Name)=VBA.UCase(Pst_文件夹名称),则
设置文件夹=s文件夹
转到找到的标签\u文件夹\u
如果结束
下一个文件夹
下一个文件夹
找到标签\u文件夹\u:
如果Folder.Name=“”,则
MsgBox“输入中的数据无效”
转到端_Lbl1:
如果结束
'通读每封邮件并将详细信息导出到Excel以进行电子邮件存档
xlWB.工作表(1).激活
Folder.Items.Sort“已接收”
'插入列标题
xlWB.Sheets(1).单元格(1,1)=“发送方”
xlWB.表格(1).单元格(1,2)=“受试者”
xlWB.表格(1).单元格(1,3)=“日期”
xlWB.表格(1).单元格(1,4)=“大小”
xlWB.Sheets(1).单元格(1,5)=“EmailID”
'ThisWorkbook.Sheets(1).单元格(1,6)=“正文”
'从PST文件夹导出电子邮件数据
oRow=1
对于iRow=1到Folder.Items.Count
“如果有条件导入过去60天内收到的邮件
'若要导入所有电子邮件,请注释或删除此条件

如果VBA.DateValue(VBA.Now)-VBA.DateValue(Folder.Items.Item(iRow.ReceivedTime)),则需要获取(大概)已打开的Excel实例,然后使用应用程序对象限定工作簿引用。或者,创建一个新的Excel实例,并通过该实例设置对它的引用来打开工作簿。正如@MacroMan所说,问题可能是您的代码在Outlook中,无法检测您尝试使用的工作簿。谢谢@Macro Man,因为我已经尝试引用Excel应用程序对象,但失败了,请确认使用Excel.application对象在代码中所做的更改将相应地更改代码。@lifeinvba运行此代码时工作簿是否已打开?或者是否要使用代码打开工作簿?@R3uK感谢更新,因为我第一次面临此问题,如果你能修改代码并帮助我,那将非常有帮助。