【问题标题】:Accessing a folder with only numbers in its name from Outlook VBA?从 Outlook VBA 访问名称中只有数字的文件夹?
【发布时间】:2020-06-18 21:07:29
【问题描述】:

在现有邮箱文件夹层次结构中,有一个文件夹包含名为“01”、“05”、“06”等的子文件夹。请注意,数字不连续:“02”、“03”、“04”此示例中缺少。在我的 VBA 代码中,我需要检查一个名为“02”的文件夹是否存在,如果不存在,则创建它。

我目前有(被剥离到最低限度):

Dim NameStr as String
NameStr="02"
On Error Resume Next
Set NewSubFolder = ContainerFolder.folders(NameStr)
On Error GoTo 0
If NewSubFolder Is Nothing Then
    Set NewSubFolder = ContainerFolder.folders.Add(NameStr)
End If

只要 NameStr 包含一个字母数字字符串,或者一个数值大于 ContainerFolder 中的项目数的纯数字字符串(例如“2020”),一切正常。但是,如果 NameStr 设置为“02”(或其他低到足以作为现有子文件夹的序列号的值),则第一个 set 语句不会失败并返回 Nothing,而是返回指向第三个文件夹的指针(从零,02 对应于容器文件夹中的第 3 项)。在上面的示例中,这将是“06”。不会创建名为“02”的文件夹。

显然 VBA 解释器“亲切地”将字符串“02”转换为整数 2,然后返回指向第三个文件夹的指针。如何防止这种行为? 如何强制 Outlook 检查名称中只有数字的文件夹是否存在?

【问题讨论】:

  • 进一步查看我的调试输出,我什至不确定字符串“02”是否会被解释为子文件夹的序列号。似乎返回了一个指向看似随机的现有子文件夹的指针。
  • 使用 Item 属性有帮助吗? Set NewSubFolder = ContainerFolder.Folders.Item(NameStr)?
  • 我想我最初有 Item() 并删除它只是为了看看它是否有所作为。现在又加回来了。没有任何区别。
  • 没有真正解决根本问题,但您可以创建一个函数,将父文件夹和要查找的子文件夹的名称传递给该函数:该函数循环遍历子文件夹,检查每个匹配的名称,并返回匹配的子文件夹(如果不匹配,则返回 Nothing)。

标签: vba outlook


【解决方案1】:

On Error Resume Next 的结果通常是不工作的代码。您可能希望将其作为最后的手段。

Option Explicit ' Consider this mandatory
' Tools | Options | Editor tab
' Require Variable Declaration
'
' If desperate declare as variant

Sub createFolder_MinimalVerifiableExample_Dangerous_OnErrorResumeNext_TheOtherWay()

Dim containerFolder As folder
Dim newSubFolder As folder

Dim nameStr As String
nameStr = "03"

Set containerFolder = Session.GetDefaultFolder(olFolderInbox)

On Error Resume Next
' Bypass error if folder exixts
Set newSubFolder = containerFolder.folders.Add(nameStr)
On Error GoTo 0

End Sub

【讨论】:

    【解决方案2】:

    Folders 接受一个代表文件夹名称的字符串或只是一个索引号。为确保您将获得可以遍历所有子文件夹并检查文件夹名称的文件夹。按照这种方式,您可以确定您会得到您需要的。

    【讨论】:

      【解决方案3】:

      根据 niton 的回应以及其他人的贡献,这是我的解决方案。 不要尝试获取指向文件夹的指针,如果失败,请创建文件夹,让我们先尝试创建文件夹,如果文件夹已经存在则忽略错误,然后无论文件夹是否预先获取指针存在或新创建的。

      Dim containerFolder As folder
      Dim newSubFolder As folder
      
      ' containerFolder needs to point to a valid folder (code not shown)
      Dim nameStr As String
      nameStr = "03"
      
      On Error Resume Next
      Set newSubFolder = containerFolder.folders.Add(nameStr)
      On Error GoTo 0
      Set newSubFolder = containerFolder.folders.Item(nameStr)
      

      最后一条语句中的.Item 部分是可选的。

      非常感谢所有贡献者!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-20
        • 1970-01-01
        • 2015-09-11
        • 2015-04-23
        • 1970-01-01
        • 2019-06-17
        • 1970-01-01
        相关资源
        最近更新 更多