VBA 函数解析电子邮件正文中的电子邮件地址,写入 Excel

VBA 函数解析电子邮件正文中的电子邮件地址,写入 Excel

我有一个需求,我需要一个函数来遍历 Outlook (2010) 文件夹中的所有电子邮件,并从电子邮件正文中获取电子邮件地址。这些电子邮件来自Inbox \ Online Applicants \ TEST CB FOLDER

正文中只有一个电子邮件地址。然后应将此电子邮件写入email_output.xls桌面上的 excel 文件。

此论坛主题我找到并稍微修改了最终的宏以尽可能满足我的需求(仅对 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") & "\Desktop\email_output.xls") Then 
    Set xlwkbk = xlApp.workbooks.Open(Environ("USERPROFILE") & "\Desktop\email_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

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

相关内容