【问题标题】:On Error Resume Next to ignore Error 440 when attempting to create an existing folderOn Error Resume Next 不工作/创建文件夹错误 440
【发布时间】:2019-09-08 23:58:38
【问题描述】:

第 1 步: 我想创建一个文件夹,如果它失败(因为它可能已经存在),我希望它忽略并继续:

    Sub MakeFolder()

    'declare variables
    Dim outlookApp As Outlook.Application
    Dim NS As Outlook.NameSpace

    'set up folder objects    
    Set outlookApp = New Outlook.Application
    Set outlookApp = New Outlook.Application
    Set NS = outlookApp.GetNamespace("MAPI")
    Set objOwner = NS.CreateRecipient("email@host.com")
    objOwner.Resolve
    Set outlookInbox = NS.GetSharedDefaultFolder(objOwner, olFolderInbox)

    'make a folder, maybe
    Dim newFolder 
    On Error Resume Next
    Set newFolder = outlookInbox.Folders.Add("myNewFolder")
    On Error GoTo -1
    On Error GoTo 0
    End Sub

但我仍然收到错误:

我怎样才能得到这个runnign?如果该文件夹不存在,它会顺利运行并创建它。

第二步: 我有一个可能随时间变化的文件夹列表(大约 60 个)。因此,我想运行一个脚本检查新文件夹,然后创建它们:

     For Each fol In folders
        On Error Resume Next
        Set newFolder = outlookInbox.Folders.Add(fol)
        If Err.Number <> 0 Then
            On Error GoTo -1
        Else:
            Debug.Print fol & " created "
        End If
        On Error GoTo 0
    Next ID

同样,outlookInbox.Folders.Add() 如果无法创建该文件夹,则无论下一个返回如何,都会引发错误。我该怎么办?

编辑

[解决方法见第一条评论]

【问题讨论】:

  • 在 IDE 中,转到 Tools>Options>General 并确保在 Error Trapping 块下您没有将其设置为“Break on All Errors”。
  • 你正在写 Resume Next 或 GoTo 0 但我没有看到任何 Next 或 0....
  • @IRENEG On Error Resume Next 不需要在 For...Next 循环内。这是告诉 VBA 吞下发生的任何错误的正常方式。同样,GoTo 0 是告诉 VBA 恢复正常错误处理的正常方式,不需要标签 0。
  • @David Zemens 成功了。我真的被这个“IDE”打败了我现在记得设置这个选项是为了在出现错误的情况下获得“调试”按钮......
  • 哈哈,是的,我以前去过那里,您很少需要从“中断未处理的错误”之外的任何内容中切换它。基本上,如果错误被On Error... 语句捕获,您(通常)不希望您的代码抛出调试对话框(如果您需要调试/检查某些东西,您可以添加一个 MsgBox 调用或断点,请务必在分发给其他人之前删除..

标签: vba error-handling outlook directory


【解决方案1】:

现在您已经修复了 IDE,您可以使用以下代码

Option Explicit
Public Sub Example()
    Dim olNs As Outlook.NameSpace
    Set olNs = Application.GetNamespace("MAPI")

    Dim Inbox  As Outlook.Folder
    Set Inbox = olNs.GetDefaultFolder(olFolderInbox)

    Dim SubFolder As Outlook.Folder

    '// SubFolder Name
    Dim FolderName As String
    FolderName = "myNewFolder"

    '// Check if folder exist else create one
    If FolderExists(Inbox, FolderName) = True Then
        Debug.Print "Folder Exists"
        Set SubFolder = Inbox.Folders(FolderName)
    Else
        Set SubFolder = Inbox.Folders.Add(FolderName)
    End If

End Sub


'//  Function - Check folder Exist
Private Function FolderExists(Inbox As Folder, FolderName As String)
    Dim Sub_Folder As MAPIFolder

    On Error GoTo Exit_Err
    Set Sub_Folder = Inbox.Folders(FolderName)

    FolderExists = True
        Exit Function

Exit_Err:
    FolderExists = False

End Function

【讨论】:

  • 如果 IDE 配置为“中断所有错误”(如在 OP 的情况下),这将无法避免错误。像您在这里所做的那样划分代码和错误处理是很好的,但这实际上并不能解决问题。
  • 感谢此版本的“检查文件夹并以防万一创建它”。我见过很多其他的,但这个看起来不错。
  • 我必须将函数指定为布尔值,否则它就像一个魅力!最后是一个不错的解决方案(在 VBA 标准下)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多