读取共享盘.msg邮件时ReceivedTime属性报错问题
问题核心错误点
- 声明的
oMsg、MailItem两个邮件对象全程未做实例化赋值,直接读取对象属性必然触发错误91(对象变量未设置),这是当前报错的直接原因。 - 读取邮件属性的逻辑写在了文件遍历循环外部,就算对象赋值正确,也无法给遍历到的每一个msg文件匹配对应的接收时间。
- 使用
With oMsg块时oMsg本身未被初始化,属于无效代码块。 - 遍历文件时未做后缀过滤,会把文件夹内非msg格式的文件纳入处理,后续会触发类型不匹配报错。
- 手动拼接文件路径容易出现斜杠缺失/重复的问题,直接调用
oFile.Path属性即可获取文件的完整绝对路径,无需手动拼接。 - 行计数器
i未显式设置初始值,容易出现写入位置错位。
修复后可直接运行的代码
Sub FileSearchAlt() Dim oFSO As Object Dim oFolder As Object Dim oFile As Object Dim i As Long Dim oOutlookApp As Object Dim oMsg As Object ' 前期绑定可改为 As Outlook.MailItem,运行速度更快 ' 初始化核心对象 Set oFSO = CreateObject("Scripting.FileSystemObject") Set oOutlookApp = CreateObject("Outlook.Application") ' 替换下面的路径为实际存放msg文件的共享盘文件夹路径 Set oFolder = oFSO.GetFolder("C:\替换为你的实际文件夹路径") ' 初始化写入位置,第1行写表头,从第2行开始写数据 i = 2 Cells(1, 1) = "邮件文件完整路径" Cells(1, 2) = "邮件真实接收时间" ' 遍历文件夹内所有文件 For Each oFile In oFolder.Files ' 仅处理后缀为msg的Outlook邮件文件 If LCase(oFSO.GetExtensionName(oFile.Path)) = "msg" Then ' 加载本地msg文件为Outlook邮件对象 Set oMsg = oOutlookApp.Session.OpenSharedItem(oFile.Path) ' 写入路径和接收时间 Cells(i, 1) = oFile.Path Cells(i, 2) = oMsg.ReceivedTime ' 统一设置日期格式,避免显示异常 Cells(i, 2).NumberFormat = "yyyy-mm-dd hh:mm:ss" ' 关闭邮件对象,释放内存 oMsg.Close 1 ' 前期绑定可写为 olDiscard Set oMsg = Nothing i = i + 1 End If Next oFile ' 释放所有对象,避免进程残留 Set oFolder = Nothing Set oFSO = Nothing Set oOutlookApp = Nothing ' 自动调整列宽,方便查看 Columns("A:B").AutoFit End Sub
使用说明
- 代码默认采用后期绑定写法,不需要提前在VBA编辑器里勾选Outlook对象库引用,替换路径后即可直接运行。
- 只有通过
OpenSharedItem方法加载本地msg文件后,才能读取到邮件内嵌的ReceivedTime属性,这个时间是邮件头记录的真实接收时间,和文件系统记录的创建/修改时间无关,完全匹配需求。 - 代码每次读取完单封邮件都会主动释放对象,遍历大量文件时不会出现Outlook后台进程残留、内存占用过高的问题。
- 如果需要遍历子文件夹内的msg文件,可以在现有逻辑基础上增加递归遍历子文件夹的代码即可。
内容的提问来源于stack exchange,提问作者Unda
相关产品推荐
相关产品推荐

