CHill60
Эта ошибка означает, что папка не существует в этой "области" Outlook.
Если вы отлаживаете свой код и наблюдаете за содержимым objNS
вы поймете, что он содержит список почтовых ящиков, а не список папок в почтовом ящике.
Вам нужно сначала "указать" на соответствующий почтовый ящик, а затем получить список папок, например
Dim objItems As Variant
Set objItems = Session.GetDefaultFolder(olFolderInbox).Parent.Folders
Существуют методы поиска других почтовых ящиков (общий доступ, приглашение и т. д.), описанные здесь -
Работа с папками Outlook VBA и нестандартными папками Outlook[
^]
Вам все равно нужно будет правильно обработать эту ошибку, поскольку вы полностью полагаетесь на то, что кто-то правильно введет имя папки. Есть и другие проблемы с вашим кодом …
* Вы должны полностью квалифицировать диапазон, который вы используете, например
ThisWorkbook.Sheets(1).Range("A" & ThisRow).Value
* Вам следует избегать использования
ActiveCell
.. зачем использовать две строки кода, когда одна будет делать, но важно, что другой код или действия пользователя могут "захватить" ActiveCell.
Range("B" & ThisRow).Select
ActiveCell.Value = EmailCount
становится
ThisWorkbook.Sheets(1).Range("B" & ThisRow).Value = EmailCount
* Вы увеличиваете
ThisRow
прежде чем вы обновите счетчик на листе, чтобы все было смещено на 1
Лично я бы использовал a для каждого цикла, а не полагался на то, что список будет обновляться, и Вам, вероятно, придется иметь рекурсивный вызов для обработки подпапок.
Взгляните на это
vba - могу ли я перебирать все электронные письма Outlook в папке, включая подпапки? - переполнение стека[
^]
Вероятно, что - то вроде следующего-хотя обратите внимание, что я еще не проверил это полностью
Sub HowManyEmails()
Dim objOL As Object
Set objOL = CreateObject("Outlook.Application")
Dim objNS As Object
Set objNS = objOL.GetNamespace("MAPI")
Dim EmailCount As Integer
Dim ThisRow As Integer
ThisRow = 0
Dim count As Long
Dim objFolder As Variant
For Each objFolder In objNS.Folders
count = 0
ThisRow = ThisRow + 1
ThisWorkbook.Sheets(1).Range("A" & ThisRow).Value = objFolder.Name
ThisWorkbook.Sheets(1).Range("B" & ThisRow).Value = objFolder.Items.count
count = count + HowManyEmailsInFolder(objFolder)
Debug.Print objFolder.Name
Next
End Sub
Private Function HowManyEmailsInFolder(ByVal oParent As Outlook.MAPIFolder) As Long
Dim oFolder As Outlook.MAPIFolder
Dim oMail As Outlook.MailItem
Dim numEmails As Long
numEmails = numEmails + oParent.Items.count
If (oParent.Folders.count > 0) Then
For Each oFolder In oParent.Folders
numEmails = numEmails + HowManyEmailsInFolder(oFolder)
Next
End If
HowManyEmailsInFolder = numEmails
End Function
ormonds
Это сработало, но не совсем так, как я ожидал - он перечислил все объекты на моей личной машине, включая те общие папки, в которых я являюсь делегатом. Я запишу еще один вопрос о том, как получить все общие папки и только их - я администратор Exchange, так что это должно быть возможно.
Спасибо за вашу помощь.
CHill60
Удачи, рад, что смог помочь.
К сожалению, из - за моей установки здесь я не могу помочь дальше с этим уровнем детализации-следовательно, не могу полностью протестировать то, что я сделал.
Возможно, стоит поставить часы на objFolder и посмотреть на свойства - из памяти есть способ отличить общие папки, но детали ускользают от меня.