无法使用 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.PrintMsgBox 不那么烦人 感谢 Tomalak - VBA 还是新手。如果我的代码有任何其他明显的改进,那么很高兴有人指出。当我需要Dim(用于显式设置变量的类型?)和Set时仍然有点模糊 Dim 用于声明变量。 Set 和(完全可选的)Let 关键字用于为变量赋值。 Also see。转到您的 VBA IDE 选项并启用“需要变量声明”并禁用“自动语法检查”。将Option Explicit 作为第一行添加到所有还没有它的模块。晚点再谢我。 ;)

以上是关于无法使用 VBA 将电子邮件移动到预先存在的文件夹。移动到新文件夹作品的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA 检查目录是不是存在错误

VBA - 另存为后工作簿的对象会发生啥?

如何提示用户在 VBA 中选择文件位置以将文件合并到一个工作簿中

将项目移动到 Outlook 中的文件夹时设置自定义值

如果文件夹中存在 zip 文件,VBA 将无法仅限于 .dat 文件

使用 VBA 访问 Outlook 中的文件夹