无法使用 VBA 将电子邮件移动到预先存在的文件夹。移动到新文件夹作品
Posted
技术标签:
【中文标题】无法使用 VBA 将电子邮件移动到预先存在的文件夹。移动到新文件夹作品【英文标题】:Unable to move email to pre-existing folder with VBA. Move to new folder works 【发布时间】:2019-07-24 10:57:39 【问题描述】:我正在尝试将 Outlook 2010 收件箱中的电子邮件移动到文件夹的子文件夹(称为“Indidents”)。
移动由一个 VBA 例程执行,该例程传递一个子文件夹名称(问题事件引用)和对电子邮件的引用。
如果子文件夹不存在,则创建它。
如果我必须创建文件夹,则移动有效,但如果子文件夹已存在,则移动失败。
这是我的代码:
Sub AddIncidentFolder(incident, ByRef email As Outlook.mailItem)
incidentDir = "Incidents"
Dim myNameSpace As Outlook.NameSpace
Dim inbox As Outlook.Folder
' Dim incidents As Outlook.Folder
Dim incidentSubFolder As Outlook.Folder
Set myNameSpace = Application.GetNamespace("MAPI")
Set inbox = myNameSpace.GetDefaultFolder(olFolderInbox)
MsgBox "Selecting " & incidentDir & " folder"
Set incidents = inbox.Folders.item(incidentDir)
MsgBox "Selecting " & incident & " sub-folder"
On Error GoTo addSubFailed
Set incidentSubFolder = incidents.Folders.Add(incident)
MsgBox "Incident sub-folder set to " & incidentSubFolder
On Error GoTo MoveError
email.Move incidentSubFolder
Exit Sub
addSubFailed:
MsgBox "Error Creating 'Incident' folder " & incident
MsgBox "Error number: " & Err.Number _
& " " & Err.Description
Set incidentSubFolder = incidents.Folders.item(incident)
MsgBox "folder add result was " & incidentSubFolder
Resume Next
MoveError:
MsgBox "Move of email failed"
Resume Next
End Sub
所以我的想法是,如果“添加文件夹”失败,那么我假设它存在,所以我只需选择 addSubFailed
中的文件夹。
addSubFailed
中的前 2 个 MsgBox 语句会触发,但第三个不会触发,因此我认为子文件夹的“Set”会导致进一步的错误。
我对 VBA 很陌生,但对对象、属性等还不错。代码来自其他 SO 答案和 MS 文档,我看不出有任何明显错误。
编辑我认为是字符串的“事件”变量实际上是一个正则表达式匹配对象,来自这个调用代码:
For Each Match In irMatches
'MsgBox "Match is " & Match & ", value is " & Match.Value
Call addToCategory(Match, email)
Call AddIncidentFolder(Match, email)
Next
如果我将addSubFailed
例程更改为:
addSubFailed:
MsgBox "Error Creating 'Incident' folder " & incident
MsgBox "Error number: " & Err.Number _
& " " & Err.Description
MsgBox "Incident is " & incident
'Set incidentSubFolder = incidents.Folders(incident)
Set incidentSubFolder = incidents.Folders("INC000001509771")
MsgBox "folder is " & incidentSubFolder
Resume Next
然后它起作用了,所以我认为类型不匹配。将“As String”添加到“事件”参数中会给我一个类型不匹配的运行时错误。
提前感谢您的帮助。
【问题讨论】:
您是否尝试过插入断点并通过在要调试的位置写入stop
或在 VBA 代码左侧添加红点并与 F8
逐行移动来进行检查为了查看您的代码在错误触发后如何移动?当某些事情没有按预期执行时,这些调试功能应该是第一个检查。
谢谢 Oliver - 让我试试。我对 VBA 编辑器不是很熟悉。如果您看到我的编辑,我还需要了解如何检查属性和对象以了解它们是什么类型。
“移动失败” - 请包含确切的错误消息。
@Tomalak - Err.number 是 -2147352567,Err.Description 是“无法移动项目”,但我认为这取决于我的“事件”变量是正则表达式“匹配”对象而不是该对象的“值”属性...
【参考方案1】:
答案似乎是将调用代码更改为:
For Each Match In irMatches
Call addToCategory(Match, email)
Call AddIncidentFolder(Match.Value, email)
Next
虽然分配电子邮件类别的旧代码很高兴被传递一个匹配对象,Folders.Add
方法也是如此,但当传递一个匹配对象并需要匹配的 .value 属性时,切换到该文件夹不起作用.
现在是完整的代码(没有那些烦人的调试 MsgBox 的东西)):
Sub AddIncidentFolder(incident, ByRef email As Outlook.mailItem)
incidentDir = "Incidents"
Dim myNameSpace As Outlook.NameSpace
Set myNameSpace = Application.GetNamespace("MAPI")
Set inbox = myNameSpace.GetDefaultFolder(olFolderInbox)
Set incidents = inbox.Folders.item(incidentDir)
On Error GoTo addSubFailed
Set incidentSubFolder = incidents.Folders.Add(incident)
On Error GoTo MoveError
email.Move incidentSubFolder
Exit Sub
addSubFailed:
Set incidentSubFolder = incidents.Folders(incident)
Resume Next
MoveError:
MsgBox "Move of email failed"
MsgBox "Error number: " & Err.Number _
& " " & Err.Description
Resume Next
End Sub
【讨论】:
旁注Debug.Print
比MsgBox
不那么烦人
感谢 Tomalak - VBA 还是新手。如果我的代码有任何其他明显的改进,那么很高兴有人指出。当我需要Dim
(用于显式设置变量的类型?)和Set
时仍然有点模糊
Dim
用于声明变量。 Set
和(完全可选的)Let
关键字用于为变量赋值。 Also see。转到您的 VBA IDE 选项并启用“需要变量声明”并禁用“自动语法检查”。将Option Explicit
作为第一行添加到所有还没有它的模块。晚点再谢我。 ;)以上是关于无法使用 VBA 将电子邮件移动到预先存在的文件夹。移动到新文件夹作品的主要内容,如果未能解决你的问题,请参考以下文章
如何提示用户在 VBA 中选择文件位置以将文件合并到一个工作簿中