从Outlook VBA中访问一个名称中只有数字的文件夹?

问题描述 投票:0回答:1

在现有的邮箱文件夹层次结构中,有一个文件夹,其中包含名为 "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对应于第三项)。那就是上面例子中的 "06"。不会创建名为 "02 "的文件夹。

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

vba outlook outlook-vba
1个回答
0
投票

结果是 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

0
投票

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


0
投票

基于 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 最后一句话中的部分是可选的。

衷心感谢所有贡献者

© www.soinside.com 2019 - 2024. All rights reserved.