Функция VBA для разбора тела электронной почты для адреса электронной почты, написать в excel

у меня есть такое требование, что мне нужна функция для итерации всех писем в папке Outlook (2010) и получения адреса электронной почты из тела письма. Письма из Inbox Online Applicants TEST CB FOLDER

в теле будет только один адрес электронной почты. Это письмо должно быть записано в файл excel email_output.xls нашел на рабочем столе.

С эта ветка форума Я нашел и немного изменил окончательный макрос, чтобы соответствовать моим потребностям, как я мог (только имейте беглое знание VBA):

Option Explicit 
Sub badAddress() 
    Dim olApp As Outlook.Application 
    Dim olNS As Outlook.NameSpace 
    Dim olFolder As Outlook.MAPIFolder 
    Dim Item As Object 
    Dim regEx As Object 
    Dim olMatches As Object 
    Dim strBody As String 
    Dim bcount As String 
    Dim badAddresses As Variant 
    Dim i As Long 
    Dim xlApp As Object 'Excel.Application
    Dim xlwkbk As Object 'Excel.Workbook
    Dim xlwksht As Object 'Excel.Worksheet
    Dim xlRng As Object 'Excel.Range
    Set olApp = Outlook.Application 
    Set olNS = olApp.GetNamespace("MAPI") 
    Set olFolder = olNS.GetDefaultFolder(olFolderInbox).Folders("Online Applicants").Folders("TEST CB FOLDER")
    Set regEx = CreateObject("VBScript.RegExp") 
     'define regular expression
    regEx.Pattern = "b[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z]{2,4}b" 
    regEx.IgnoreCase = True 
    regEx.Multiline = True 
     ' set up size of variant
    bcount = olFolder.Items.Count 
    ReDim badAddresses(1 To bcount) As String 
     ' initialize variant position counter
    i = 0
    ' parse each message in the folder holding the bounced emails
    For Each Item In olFolder.Items 
        i = i + 1 
        strBody = olFolder.Items(i).Body 
        Set olMatches = regEx.Execute(strBody) 
        If olMatches.Count >= 1 Then 
            badAddresses(i) = olMatches(0) 
            Item.UnRead = False 
        End If 
    Next Item
     ' write everything to Excel
    Set xlApp = GetExcelApp 
    If xlApp Is Nothing Then GoTo ExitProc 
    If Not IsFileOpen(Environ("USERPROFILE") & "Desktopemail_output.xls") Then 
    Set xlwkbk = xlApp.workbooks.Open(Environ("USERPROFILE") & "Desktopemail_output.xls") 
    End If      
    Set xlwksht = xlwkbk.Sheets(1) 
    Set xlRng = xlwksht.Range("A1") 
    xlApp.ScreenUpdating = False 
    xlRng.Value = "Bounced email addresses" 
    ' resize version
    xlRng.Offset(1, 0).Resize(UBound(badAddresses) + 1).Value = xlApp.Transpose(badAddresses) 
    xlApp.Visible = True 
    xlApp.ScreenUpdating = True 
ExitProc: 
    Set xlRng = Nothing 
    Set xlwksht = Nothing 
    Set xlwkbk = Nothing 
    Set xlApp = Nothing 
    Set olFolder = Nothing 
    Set olNS = Nothing 
    Set olApp = Nothing 
    Set badAddresses = Nothing 
End Sub 
Function GetExcelApp() As Object 
     ' always create new instance
    On Error Resume Next 
    Set GetExcelApp = CreateObject("Excel.Application") 
    On Error GoTo 0 
End Function 
Function IsFileOpen(FileName As String) 
    Dim iFilenum As Long 
    Dim iErr As Long      
    On Error Resume Next 
    iFilenum = FreeFile() 
    Open FileName For Input Lock Read As #iFilenum 
    Close iFilenum 
    iErr = Err 
    On Error GoTo 0      
    Select Case iErr 
    Case 0: IsFileOpen = False 
    Case 70: IsFileOpen = True 
    Case Else: Error iErr 
    End Select      
End Function 

после работы через несколько других ошибок, которые я мог управлять, ошибка object variable or with block variable not set происходит Set xlwksht = xlwkbk.Sheets(1) (строка 46). Переменные, по-видимому, назначены правильно, и электронная таблица определенно существует, с правильным именем, на рабочем столе.

1
задан JaredT
26.12.2022 16:03 Количество просмотров материала 3051
Распечатать страницу

1 ответ

xlwkbk не гарантируется: вы устанавливаете объект только в том случае, если файл не открыт (не открыт). Вам нужен пункт "else".

вместо отмены FileIsOpen() тест, как раз использует результат сразу. Такие как:

If FileIsOpen() then
   'Do stuff for when file is open, such as test for the proper worksheet being active
   set worksheet to active sheet
else
   'Open the worksheet like you have in example
   set worksheet by opening worksheet
endif
1
отвечен Yorik 2022-12-27 23:51

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх