从电子邮件正文中提取网址

时间:2017-07-07 01:45:53

标签: vba excel-vba outlook-vba excel

我是VBA代码的初学者,也是使用Outlook的最开始。我有大量的数据要添加到Excel。搜索谷歌后,我发现我们可以通过Outlook VBA实现这一目标。内容采用以下格式:

标题:本科生

性别:男性

国家:阿尔巴尼亚

关键字:

1.Environment

  1. 人口
  2. 名字:约翰

    电话号码:0532432444

    用户名:test@dda.com

    文件上传:http://all-free-download.com/free-photos/download/autumns-evening-sun_513398.html

    我已经阅读了一篇旧文章并创建了此代码:

    Sub CopyToExcel()
        Dim xlApp As Object
        Dim xlWB As Object
        Dim xlSheet As Object
    
        Dim olItem As Outlook.MailItem
        Dim vText As Variant
        Dim sText As String
        Dim vItem As Variant
    
        Dim i As Long
        Dim rCount As Long
        Dim bXStarted As Boolean
    
        Const strPath As String = "E:\Project\Test oulook.xlsx"   ' the path of the workbook
    
        If Application.ActiveExplorer.Selection.Count = 0 Then
            MsgBox "No Items selected!", vbCritical, "Error"
            Exit Sub
        End If
    
        On Error Resume Next
    
        Set xlApp = GetObject(, "Excel.Application")
        If Err <> 0 Then
            Application.StatusBar = "Please wait while Excel source is opened ... "
            Set xlApp = CreateObject("Excel.Application")
            bXStarted = True
        End If
    
        On Error GoTo 0
    
        ' Open the workbook to input the data
        Set xlWB = xlApp.Workbooks.Open(strPath)
        Set xlSheet = xlWB.Sheets("Sheet1")
    
        ' Process each selected record
        rCount = xlSheet.UsedRange.Rows.Count
        For Each olItem In Application.ActiveExplorer.Selection
            sText = olItem.Body
            vText = Split(sText, Chr(13))
    
            ' Find the next empty line of the worksheet
            rCount = rCount + 1
    
            ' Check each line of text in the message body
            For i = UBound(vText) To 0 Step -1
    
                If InStr(1, vText(i), "title: ") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("A" & rCount) = Trim(vItem(1))
                End If
    
                If InStr(1, vText(i), "gender: ") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("B" & rCount) = Trim(vItem(1))
                End If
    
                If InStr(1, vText(i), "country: ") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("C" & rCount) = Trim(vItem(1))
                End If
    
                If InStr(1, vText(i), "keyword: ") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("E" & rCount) = Trim(vItem(1))
                End If
    
                If InStr(1, vText(i), "first_name: ") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("G" & rCount) = Trim(vItem(1))
                End If
    
                If InStr(1, vText(i), "phone_number: ") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("I" & rCount) = Trim(vItem(1))
                End If
    
                If InStr(1, vText(i), "username: ") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("F" & rCount) = Trim(vItem(1))
                End If
    
                If InStr(1, vText(i), "upload: ") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("O" & rCount) = Trim(vItem(1))
                End If
    
            Next i
            xlWB.Save
    
        Next olItem
        xlWB.Close SaveChanges:=True
    
        If bXStarted Then
            xlApp.Quit
        End If
    
        Set olItem = Nothing
        Set xlSheet = Nothing
        Set xlWB = Nothing
        Set xlApp = Nothing
    End Sub
    

    有效。但上传字段显示&#34; http&#34;不是&#34; http://all-free-download.com/free-photos/download/autumns-evening-sun_513398.html&#34;。

3 个答案:

答案 0 :(得分:1)

Chr(58)是结肠

通过执行Split(vText(i), Chr(58)),您将获取原始字符串并通过分隔符冒号将其拆分

例如:文件上传:http://all-free-download.com/free-photos/download/autumns-evening-sun_513398.html

vItem(0)=文件上传

vItem(1)= http

vItem(2)= //all-free-download.com/free-photos/download/autumns-evening-sun_513398.html

因此,为了获得您想要的完整链接,您必须连接vItem。

例如。 vItem(1) & ":" & vItem(2)

答案 1 :(得分:0)

我尝试了你的代码。当工作表为空时找到下一个可用单元格存在问题(公式 xlSheet.UsedRange.Rows.Count 两者都返回1,没有使用行,并且使用了一行)

这是一个似乎正常工作的重写

if-then例程已被case语句替换

Sub CopyToExcel()
    Dim xlApp As Object
    Dim xlWB As Object
    Dim xlSheet As Object

    Dim olItem As Outlook.mailItem
    Dim vText As Variant
    Dim rCount As Long

    Dim vItem As Variant
    Dim i As Long
    Dim bXStarted As Boolean
    Const strPath As String = "E:\Project\Test outlook.xlsx"      ' the path of the workbook


    If Application.ActiveExplorer.Selection.Count = 0 Then
         MsgBox "No Items selected!", vbCritical, "Error"
         Exit Sub
    End If

    On Error Resume Next

    Set xlApp = GetObject(, "Excel.Application")

    If Err <> 0 Then
        Application.StatusBar = "Please wait while Excel source is opened ... "
        Set xlApp = CreateObject("Excel.Application")
        bXStarted = True
    End If

'   xlApp.Visible = True                                          ' show worksheet (for debugging)

    On Error GoTo 0

    Set xlWB = xlApp.Workbooks.Open(strPath)                      ' Open the workbook to input the data
    Set xlSheet = xlWB.Sheets("Sheet1")

'   rCount = xlSheet.UsedRange.Rows.Count                         ' does not work (returns 1 when no data on worksheet)

    Dim formula As String                                         '
    formula = "MATCH(TRUE, INDEX(ISBLANK(A:A), 0, 0), 0)"         ' cell formula: =MATCH(TRUE, INDEX(ISBLANK(A:A), 0, 0), 0)

    rCount = xlApp.Evaluate(formula)                              ' find next empty line on worksheet using a cell formula

    For Each olItem In Application.ActiveExplorer.Selection       ' Process each selected email

        vText = Split(olItem.body, vbCrLf)                        ' convert email body to an array of text lines
        For i = 0 To UBound(vText)                                ' Check each line of text in the message body

            vItem = Split(":" & vText(i), ":", 3)                 ' split line into max 3 parts (leading ":" added to prevent fail on blank lines)

            Select Case LCase(vItem(1))                           ' LCase for case insensitive comparison
                Case "title"
                    xlSheet.Range("A" & rCount) = Trim(vItem(2))
                Case "gender"
                    xlSheet.Range("B" & rCount) = Trim(vItem(2))
                Case "country"
                    xlSheet.Range("C" & rCount) = Trim(vItem(2))
                Case "keyword"
                    xlSheet.Range("E" & rCount) = Trim(vItem(2))
                Case "first name"
                    xlSheet.Range("G" & rCount) = Trim(vItem(2))
                Case "phone number"
                    xlSheet.Range("I" & rCount) = Trim(vItem(2))
                Case "username"
                    xlSheet.Range("F" & rCount) = Trim(vItem(2))
                Case "file upload"
                    xlSheet.Range("O" & rCount) = Trim(vItem(2))
'               Case Else
'                   do something else here
            End Select

        Next i
        xlWB.Save

        rCount = rCount + 1                                       ' point to next empty line of the worksheet

    Next olItem
    Set olItem = Nothing

    xlWB.Close SaveChanges:=True

    If bXStarted Then
        xlApp.Quit
    End If

    Set xlSheet = Nothing
    Set xlWB = Nothing
    Set xlApp = Nothing
End Sub

答案 2 :(得分:-1)

If InStr(1, vText(i), "upload: ") > 0 Then
    vItem = Split(vText(i), Chr(58), 2) '<< optional parameter controls how many splits...
    xlSheet.Range("O" & rCount) = Trim(vItem(1))
End If