2017-07-07 120 views
1

我是VBA代码的初学者,也是使用Outlook的最初阶段。我有大量的数据添加到Excel中。搜索Google后,我发现我们可以通过Outlook VBA来实现。内容来自于以下格式:从电子邮件正文提取URL

标题:本科生

性别:男

国家:阿尔巴尼亚

关键字:

1.Environment

  • 人口
  • 名字:约翰

    电话号码:0532432444

    用户名:[email protected]

    文件上传: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 
    

    它工作。但是上传字段显示“http”而不是“http://all-free-download.com/free-photos/download/autumns-evening-sun_513398.html”。

    回答

    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/aut umns-evening-sun_513398.html

    所以为了获得你想要的完整链接,你必须连接vItem。

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

    +0

    感谢Keenlearner, 它的工作原理正确

    工作。 :) –

    -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 
    
    +0

    谢谢蒂姆,Awsome代码。 –

    +1

    请将解释添加到您的答案。回答没有解释是没用的。 –

    +0

    有关附加参数的评论涵盖了它:OP自己编写了其余代码,所以它们应该遵循正在发生的事情... –

    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 
    
    相关问题