VBA для переноса электронной почты из приложения Outlook в Excel

Мне нужна ваша помощь, ребята, если вы можете. Я новичок в VBA, поэтому все еще учусь, и мой код, вероятно, не очень мощный, но я хотел бы воплотить его в жизнь. Это работает, но не так, как я ожидал. Я делюсь с вами своим кодом Excel VBA для получения электронной почты из Outlook. Когда я запускаю Excel и Outlook и запускаю код vba, я получаю ошибку в этой строке =>

Set Folder = Outlook.Session.Folders(MailboxName).Folders(Pst_Folder_Name).Folders(subFolderName)

но когда я закрываю и снова открываю Outlook, он работает и помещает всю информацию в таблицу до 30 дней назад, а затем я получаю сообщение «объект не поддерживает этот метод свойства» code438.. в этой строке =>

Sheets(1).Cells(iRow, 1) = Folder.Items.Item(iRow).ReceivedTime

К вашему сведению... У меня есть адрес электронной почты по умолчанию, настроенный в Outlook, который принадлежит мне, и общий адрес электронной почты, который также используют другие люди, и в общем адресе электронной почты есть подфайл. поэтому я пытаюсь получить электронное письмо только с общего адреса электронной почты и подпапки.

Вот код:

Sub GetEmailsInTo()

    Dim ol As Outlook.Application
    Dim ns As Outlook.Namespace
    Dim Pst_Folder_Name As String
    Dim MailboxName As String
    Dim subFolderName As String
    
    Set ol = New Outlook.Application
    Set ns = ol.GetNamespace("MAPI")
    
'Mailbox or PST Main Folder Name (As how it is displayed in your Outlook Session)
MailboxName = "[email protected]"

'Mailbox Folder or PST Folder Name (As how it is displayed in your Outlook Session)
Pst_Folder_Name = "Inbox"

'subfolder name
subFolderName = "important"

Set Folder = Outlook.Session.Folders(MailboxName).Folders(Pst_Folder_Name).Folders(subFolderName)
If Folder = "" Then
    MsgBox "Invalid Data in Input"
    GoTo end_lbl1:
End If
    
Range("A2", Range("A2").End(xlDown).End(xlToRight)).Clear

'Date
Columns("A:A").Select
Selection.NumberFormat = "[$-409]ddd dd/mm/yy;@"
Range("A2:A500").Select
Selection.ColumnWidth = 13
Range("A2:A500").HorizontalAlignment = xlLeft
Range("A2:A500").VerticalAlignment = xlCenter
    
   Range("A1:E1").Select
 With Selection
        .VerticalAlignment = xlBottom
        .WrapText = False
        .RowHeight = 55
        .HorizontalAlignment = xlCenter
End With

    Range("B2:B500").Select
With Selection
    .WrapText = True
    .ColumnWidth = 16
    .Rows.AutoFit
    .HorizontalAlignment = xlLeft
    .VerticalAlignment = xlCenter
    
End With

    Range("C2:C500").Select
    With Selection
    .WrapText = True
    .ColumnWidth = 40
    .Rows.AutoFit
    .HorizontalAlignment = xlLeft
    .VerticalAlignment = xlCenter
    
End With

    Range("D2:D500").Select
With Selection
    .WrapText = True
    .ColumnWidth = 170
    .Rows.AutoFit
    .VerticalAlignment = xlTop
    .HorizontalAlignment = xlLeft
    
End With

 Range("E2:E500").Select
With Selection
    .WrapText = True
    .ColumnWidth = 50
    .Rows.AutoFit
    .VerticalAlignment = xlTop
    .HorizontalAlignment = xlLeft
    
End With

    'Rad Through each Mail and export the details to Excel for Email Archival
Sheets(1).Activate

For iRow = 2 To Folder.Items.Count
    Sheets(1).Cells(iRow, 2).Select
    Sheets(1).Cells(iRow, 1) = Folder.Items.Item(iRow).ReceivedTime
    Sheets(1).Cells(iRow, 2) = Folder.Items.Item(iRow).SenderName
    Sheets(1).Cells(iRow, 3) = Folder.Items.Item(iRow).Subject
    Sheets(1).Cells(iRow, 4) = Folder.Items.Item(iRow).To
    Sheets(1).Cells(iRow, 5) = Folder.Items.Item(iRow).CC
    
Next iRow
    
    MsgBox "Email import complete"


    
end_lbl1:
    
End Sub

Попробуйте Set Folder = ns.Folders(MailboxName).Folders(Pst_Folder_Name).Folders(sub‌​FolderName)

Black cat 18.08.2024 10:05

если я поменяю его на ns.Fol... то будет то же самое. работает и получает все электронные письма, но показывает ошибку в строке Sheets(1).Cells(iRow, 1) = Folder.Items.Item(iRow).ReceivedTime и выдает мне ошибку. следует просто сказать MsgBox «Импорт электронной почты завершен».

Miki 18.08.2024 11:56

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

niton 18.08.2024 12:31

Разбейте Set Folder на три части, чтобы увидеть, где возникает первая ошибка.

niton 18.08.2024 12:36

@niton, если я запускаю код без этой части => Set Folder = Outlook.Session.Folders(MailboxName).Folders(Pst_Folder_Name‌​).Folders(subFolderN‌​ame) и запускаю первый как Set Folder = Outlook.Session.Folders( MailboxName) работает без ошибок, когда я пытаюсь запустить файл входящих сообщений и подфайл, получая ошибку в коде => Sheets(1).Cells(iRow, 1) = Folder.Items.Item(iRow).ReceivedTime

Miki 18.08.2024 14:26

Ожидается один вопрос на пост. Вы можете задать новый вопрос о папке. Set Folder = ns.Folders(MailboxName) и Set Folder = Folder.Folders(Pst_Folder_Name) и Set Folder = Folder.Folders(subFolderName). Укажите ошибку и в какой строке она возникает.

niton 18.08.2024 15:36
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
6
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

iRow=2
For iRowAct = 1 To Folder.Items.Count
  If Folder.Items.Item(iRowAct).Class = olMail Then
    Sheets(1).Cells(iRow, 2).Select
    Sheets(1).Cells(iRow, 1) = Folder.Items.Item(iRowAct).ReceivedTime
    Sheets(1).Cells(iRow, 2) = Folder.Items.Item(iRowAct).SenderName
    Sheets(1).Cells(iRow, 3) = Folder.Items.Item(iRowAct).Subject
    Sheets(1).Cells(iRow, 4) = Folder.Items.Item(iRowAct).To
    Sheets(1).Cells(iRow, 5) = Folder.Items.Item(iRowAct).CC
    iRow = iRow + 1
  End If
Next iRowAct

Если Folder.Items.item(iRow).Class = olMail Тогда => ошибка => индекс массива выходит за пределы

Miki 18.08.2024 14:12

@miki Аааа. Пожалуйста. см. редактирование.

Black cat 18.08.2024 14:41

Прошу прощения за задержку, меня не было... все работает великолепно @Black cat. Большое спасибо за обновление кода для меня. +++++

Miki 20.08.2024 07:39

Не-mailitem может не иметь свойства mailitem. Кроме того, iRow на один больше, чем индекс элемента.

Option Explicit

Sub GetEmailsInToV2()

    Dim ol As Outlook.Application
    Dim ns As Outlook.Namespace
    
    Dim mailboxFolder As Outlook.folder
    Dim inboxFolder As Outlook.folder
    Dim subFolder As Outlook.folder
    
    Dim mailboxName As String
    Dim inboxName As String
    Dim subFolderName As String
    
    Dim iRow As Long
    
    Set ol = New Outlook.Application
    Set ns = ol.GetNamespace("MAPI")
    
    'Mailbox Name as displayed in your Outlook Session)
    mailboxName = "[email protected]"
    
    inboxName = "Inbox"
    
    'subfolder name
    subFolderName = "important"
    
    ' No attempt to address unknown error referencing the subfolder
    Set mailboxFolder = ns.Folders(mailboxName)
    Set inboxFolder = mailboxFolder.Folders(inboxName)
    Set subFolder = inboxFolder.Folders(subFolderName)
    
    Range("A2", Range("A2").End(xlDown).End(xlToRight)).Clear
    
    'Date
    With Columns("A:A")
        .NumberFormat = "[$-409]ddd dd/mm/yy;@"
        .ColumnWidth = 13
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlCenter
    End With
    
    With Range("B:B")
        .WrapText = True
        .ColumnWidth = 16
        .Rows.AutoFit
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlCenter
    End With
    
    With Range("C:C")
        .WrapText = True
        .ColumnWidth = 40
        .Rows.AutoFit
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlCenter
    End With
    
    With Range("D:D")
        .WrapText = True
        .ColumnWidth = 170
        .Rows.AutoFit
        .VerticalAlignment = xlTop
        .HorizontalAlignment = xlLeft
    End With
    
    With Range("E:E")
        .WrapText = True
        .ColumnWidth = 50
        .Rows.AutoFit
        .VerticalAlignment = xlTop
        .HorizontalAlignment = xlLeft
    End With
    
    With Range("A1:E1")
        .VerticalAlignment = xlBottom
        .WrapText = False
        .RowHeight = 55
        .HorizontalAlignment = xlCenter
    End With

    'Read each mail and export the details to Excel for Email Archival
    'Sheets(1).Activate
    
    For iRow = 2 To subFolder.Items.Count + 1
    
        With subFolder.Items.Item(iRow - 1)
        
            ' Non-mailitems may not have mailitem properties
            If .Class = olMail Then
                'Sheets(1).Cells(iRow, 2).Select
                Sheets(1).Cells(iRow, 1) = .ReceivedTime
                Sheets(1).Cells(iRow, 2) = .SenderName
                Sheets(1).Cells(iRow, 3) = .Subject
                Sheets(1).Cells(iRow, 4) = .To
                Sheets(1).Cells(iRow, 5) = .CC
                
                ' Clear requires an entry in column E
                If Sheets(1).Cells(iRow, 5) = "" Then
                    Sheets(1).Cells(iRow, 5) = "-"
                End If
                
            Else
                Sheets(1).Cells(iRow, 1) = "-"  ' Clear requires an entry in column A
                Sheets(1).Cells(iRow, 3) = "Not a mailitem."
                Sheets(1).Cells(iRow, 5) = "-"   ' Clear requires an entry in column E
            End If
            
        End With
        
    Next
    
    MsgBox "Email import complete"

End Sub

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

Miki 20.08.2024 07:43

Другие вопросы по теме