Проверьте, существует ли папка outlook; если не создать - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь проверить, существует ли папка;если это не так, то создайте его.Ниже просто выдает ошибку во время выполнения.

 Sub AddClose()
 Dim myNameSpace As Outlook.NameSpace
 Dim myFolder As Outlook.Folder
 Dim myNewFolder As Outlook.Folder
 Set myNameSpace = Application.GetNamespace("MAPI")
 Set myFolder = myNameSpace.GetDefaultFolder(olFolderInbox)

            If myFolder.Folders("Close") = 0 Then
                myFolder.Folders.Add("Close").Folders.Add ("EID1")
                myFolder.Folders("Close").Folders.Add ("EID2")
                myFolder.Folders("Close").Folders.Add ("EID3")

            End If
End Sub

Однако, если папка существует, то работает нижеследующее ...

If myFolder.Folders("Close") > 0 Then
    MsgBox "Yay!"            
End If

Почему?Что я могу сделать, чтобы исправить проблему?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я не понимаю: If myFolder.Folders("Close") = 0 Then. myFolder.Folders("Close") - это папка, и я бы не стал сравнивать ее с нулем. У вас есть ссылка на сайт, где объясняется эта функциональность, потому что я хотел бы ее понять?

Я хочу создать папку, если она не существует достаточно часто, чтобы написать функцию. Моя функция не имеет идеальных параметров для ваших требований, но она работает. Я предлагаю его как проверенный код, который делает то, что вы хотите, или как источник идей для вашего собственного кода.

Sub DemoGetCreateFldr показывает, как использовать функцию GetCreateFldr для достижения желаемого эффекта.

Я не использую GetDefaultFolder, потому что в моей системе он возвращает ссылку на магазин, которым я не пользуюсь. «Файл данных Outlook» - это хранилище Outlook по умолчанию, но мастер создал отдельное хранилище для каждого из двух моих адресов электронной почты. В Set Store = Session.Folders("Outlook Data File") замените «Файл данных Outlook» именем магазина, содержащего папку «Входящие», для которой вы хотите создать подпапки.

При первом вызове GetCreateFldr создается папка «Закрыть», если она не существует, а затем создается папка «EID1». Я сохраняю ссылку на папку и использую Debug.Print, чтобы продемонстрировать, что она возвращает правильную ссылку.

Для папок «EID2» и «EID3» я не сохраняю ссылку, соответствующую вашему коду.

Если существуют папки «Закрыть», «EID1», «EID2» и «EID3», GetCreateFldr не пытается создать их, хотя все равно возвращает ссылку.

Надеюсь, это поможет.

Sub DemoGetCreateFldr()

  Dim FldrEID1 As Folder
  Dim FldrNameFull(1 To 3) As String
  Dim Store As Folder

  Set Store = Session.Folders("Outlook Data File")

  FldrNameFull(1) = "Inbox"
  FldrNameFull(2) = "Close"

  FldrNameFull(3) = "EID1"
  Set FldrEID1 = GetCreateFldr(Store, FldrNameFull)
  Debug.Print FldrEID1.Parent.Parent.Parent.Name & "|" & _
              FldrEID1.Parent.Parent.Name & "|" & _
              FldrEID1.Parent.Name & "|" & _
              FldrEID1.Name

  FldrNameFull(3) = "EID2"
  Call GetCreateFldr(Store, FldrNameFull)

  FldrNameFull(3) = "EID3"
  Call GetCreateFldr(Store, FldrNameFull)

End Sub
Public Function GetCreateFldr(ByRef Store As Folder, _
                              ByRef FldrNameFull() As String) As Folder

  ' * Store identifies the store, which must exist, in which the folder is
  '   wanted.
  ' * FldrNameFull identifies a folder which is or is wanted within Store.
  '   Find the folder if it exists otherwise create it. Either way, return
  '   a reference to it.

  ' * If LB is the lower bound of FldrNameFull:
  '     * FldrNameFull(LB) is the name of a folder that is wanted within Store.
  '     * FldrNameFull(LB+1) is the name of a folder that is wanted within
  '       FldrNameFull(LB).
  '     * FldrNameFull(LB+2) is the name of a folder that is wanted within
  '       FldrNameFull(LB+1).
  '     * And so on until the full name of the wanted folder is specified.

  ' 17Oct16  Date coded not recorded but must be before this date

  Dim FldrChld As Folder
  Dim FldrCrnt As Folder
  Dim ChildExists As Boolean
  Dim InxC As Long
  Dim InxFN As Long

  Set FldrCrnt = Store

  For InxFN = LBound(FldrNameFull) To UBound(FldrNameFull)
    ChildExists = True
    ' Is FldrNameFull(InxFN) a child of FldrCrnt?
    On Error Resume Next
    Set FldrChld = Nothing   ' Ensure value is Nothing if following statement fails
    Set FldrChld = FldrCrnt.Folders(FldrNameFull(InxFN))
    On Error GoTo 0
    If FldrChld Is Nothing Then
      ' Child does not exist
      ChildExists = False
      Exit For
    End If
    Set FldrCrnt = FldrChld
  Next

  If ChildExists Then
    ' Folder already exists
  Else
    ' Folder does not exist. Create it and any children
    Set FldrCrnt = FldrCrnt.Folders.Add(FldrNameFull(InxFN))
    For InxFN = InxFN + 1 To UBound(FldrNameFull)
      Set FldrCrnt = FldrCrnt.Folders.Add(FldrNameFull(InxFN))
    Next
  End If

  Set GetCreateFldr = FldrCrnt

End Function
0 голосов
/ 19 ноября 2018

Во-первых, вы сравниваете результат вызова myFolder.Folders("Close") (который должен вернуть объект MAPIFolder) с целым числом (0). Вам необходимо использовать оператор Is Nothing или Is not Nothing.

Во-вторых, MAPIFolder.Folders.Item() вызывает исключение, если папка с заданным именем не найдена. Вам нужно перехватить это исключение (такое же уродливое, как и в VBA) либо проверить значение Err.Number, либо проверить, что возвращаемый объект установлен

On Error Resume Next
set subFolder = myFolder.Folders.Item("Close")
if subFolder Is Nothing Then
  subFolder = myFolder.Folders.Add("Close")
End If
...