VBA Try and Catch(MS Outlook)

时间:2015-05-12 10:47:02

标签: vba try-catch outlook-vba

我使用以下函数来监视公共Outlook文件夹以便新电子邮件到达:

var goodRegionAndBuildings = _regionAndBuildings.filter(function(item) {
    // assumes not-empty strings are good
    // everything else is bad
    return (
        item.ModifiedOn !== "" &&
        item.BuildingName !== "" &&
        item.Latitude !== "" &&
        item.Longitude !== "" &&
        item.Region !== ""
    );
});

由于某种原因,此公用文件夹的路径会在一周内随时间变化。 Public Sub Application_Startup() Set NewMail = Application.GetNamespace("MAPI").Folders(3).Folders(2).... End Sub 中的数字有哪些变化。它从1到3不等。 显然,为了保持函数正常工作并捕获错误,当路径发生变化时,我想实现一个try和catch函数,例如:

.Folders(3)

由于我是VBA的新手,因此我很难实现这个Try and Catch功能。任何人都可以在Outlook中协助VBA代码吗?

我认为我设法实现的一个解决方案是:

Try {
    Set NewMail = Application.GetNamespace("MAPI").Folders(1).Folders(2)....
Catch Error

Try {
    Set NewMail = Application.GetNamespace("MAPI").Folders(2).Folders(2)....
Catch Error

Try {
    Set NewMail = Application.GetNamespace("MAPI").Folders(2).Folders(2)....
Catch Error

3 个答案:

答案 0 :(得分:4)

VBA中的错误处理基于 On Error 语句。以下文章介绍了如何处理VBA中的错误:

Try / Catch块用于加载项。

注意,您可以使用NameSpace.GetDefaultFolder方法获取Exchange公用文件夹存储中的所有公用文件夹文件夹。您只需传递 olPublicFoldersAllPublicFolders 值即可。请参阅以下页面上的示例代码:

答案 1 :(得分:1)

您可以先通过检查文件夹集合的Count属性来避免错误,例如:

{{1}}

答案 2 :(得分:0)

VB(A)没有结构化错误处理,因此它没有try和catch语句。

如果您希望语句失败,On Error Resume Next进行以下If Err.Number <> 0 Then ...检查即可。最好将On Error Resume Next涵盖的代码段保持在绝对最小值。您不希望默默地吞下意外的运行时错误,因为这会导致令人讨厌且难以发现的错误。

当然,以故障安全方式编写代码是另一种可能性。

按编号索引到文件夹集合并不是故障安全的,正如您所注意到的那样。通常应避免将数字索引到未知的项目集合中。幸运的是,Folders集合允许按名称编制索引。 .Folders("Foo") 很多.Folders(3)更好。

当然可能没有名为"Foo"的子文件夹,但可以通过On Error处理。

以下是使用path(反斜杠分隔,不包括\\Public Folders - mailbox name\All Public Folders\部分)的替代方法:

Function GetPublicFolderByPath(path As String) As Folder
  Dim parent As Folder, part As Variant

  Set parent = GetNamespace("MAPI").GetDefaultFolder(olPublicFoldersAllPublicFolders)

  For Each part In Split(path, "\")
    On Error Resume Next
    Set GetPublicFolderByPath = parent.Folders(part)

    If Err.Number <> 0 Then
      Set GetPublicFolderByPath = Nothing
      Exit For
    End If

    On Error GoTo 0
  Next part
End Function

像这样使用

Dim f As Folder
Set f = GetPublicFolderByPath("Folder A\Folder B\Folder C")

If f Is Nothing Then
    ' not found
Else
    ' use f
End If