Доступ к папке, содержащей только числа в имени, из Outlook VBA? - PullRequest
0 голосов
/ 17 июня 2020

В существующей иерархии папок почтового ящика есть папка, содержащая подпапки с именами «01», «05», «06» и т. Д. c. Обратите внимание, что числа не идут подряд: «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 содержит буквенно-цифровую c строку или строку, состоящую только из чисел, со значением больше, чем количество элементов, если ContainerFolder (например, «2020»), все работает. Однако, если NameStr имеет значение «02» (или другое значение, достаточно низкое, чтобы его можно было интерпретировать как порядковый номер существующей подпапки), первый оператор набора вместо сбоя и возврата Nothing возвращает указатель на третью папку (считая от ноль, 02 соответствует 3-му пункту) в папке контейнера. В приведенном выше примере это будет «06». Папка с именем «02» не будет создана.

Очевидно, интерпретатор VBA «любезно» преобразует строку «02» в целое число 2, а затем возвращает указатель на третью папку. Как мне предотвратить такое поведение? Как заставить Outlook проверять наличие папки, в имени которой есть только цифры?

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

Folders принимает строку, представляющую имя папки или просто порядковый номер. Чтобы убедиться, что вы получите папку, вы можете перебрать все подпапки и проверить имя папки. Следуя этому пути, вы можете быть уверены, что получите то, что вам нужно.

0 голосов
/ 18 июня 2020

Основываясь на ответе нитона, а также на мнениях других, вот мое решение. Вместо того, чтобы пытаться получить указатель на папку, и если это не удается, создайте папку, давайте попробуем сначала создать папку, проигнорируем ошибку, если папка уже существует, а затем получим указатель независимо от того, была ли папка предварительно существовал или был создан заново.

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 в последнем операторе является необязательной.

Большое спасибо всем участникам!

0 голосов
/ 17 июня 2020

Результатом 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
...