将电子邮件中的行复制到Excel中的特定数组中

将电子邮件中的行复制到Excel中的特定数组中,excel,vba,outlook,outlook-2010,Excel,Vba,Outlook,Outlook 2010,我需要使用VBA将电子邮件中的一些数据复制到电子表格中,以下是电子邮件中数据的格式: 项目/费用: 项目说明1:38.88美元 数量:1 项目说明2:$39.99 数量:1 项目描述总是不同的。以下是我希望复制到Excel时输出的格式: 这是我目前尝试的代码: Sub CopyToExcel() Dim xlApp As Object Dim xlWB As Object Dim xlSheet As Object Dim xl Dim olItem As Outlook.MailItem D

我需要使用VBA将电子邮件中的一些数据复制到电子表格中,以下是电子邮件中数据的格式:

项目/费用:

项目说明1:38.88美元

数量:1

项目说明2:$39.99

数量:1

项目描述总是不同的。以下是我希望复制到Excel时输出的格式:

这是我目前尝试的代码:

Sub CopyToExcel()
Dim xlApp As Object
Dim xlWB As Object
Dim xlSheet As Object
Dim xl
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
Dim rTime As Date
Const strPath As String = "C:\Tracking.xlsx" 'the path of the workbook

If Application.ActiveExplorer.Selection.Count = 0 Then
    MsgBox "No Items selected!", vbCritical, "Error"
    Exit Sub
EndIf
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")
xlWB.Sheets(1).Cells.Delete

'Process each selected record
 rCount = xlSheet.UsedRange.Rows.Count
 'cCount = xlSheet.UsedRange.Columns.Count
  For Each olItem In Application.ActiveExplorer.Selection
    sText = olItem.Body
    rTime = Format(olItem.ReceivedTime, "mmmm d, yyyy")
    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(vText(i), "Items/Cost:") Then
            'ParseText = vText(i + 1) & vbCrLf
            xlSheet.Range("A" & rCount) = Trim(vText(2))
            vItem = Split(vText(4), Chr(58))
            xlSheet.Range("B" & rCount) = Trim(vItem(1))
            xlSheet.Range("A" & rCount + 1) = Trim(vText(6))
            vItem = Split(vText(8), Chr(58))
            xlSheet.Range("B" & rCount + 1) = Trim(vItem(1))
            xlSheet.Range("A" & rCount + 2) = Trim(vText(10))
            vItem = Split(vText(12), Chr(58))
            xlSheet.Range("B" & rCount + 2) = Trim(vItem(1))
            xlSheet.Range("A" & rCount + 3) = Trim(vText(14))
            vItem = Split(vText(16), Chr(58))
            xlSheet.Range("B" & rCount + 3) = Trim(vItem(1))
            xlSheet.Range("A" & rCount + 4) = Trim(vText(18))
            vItem = Split(vText(20), Chr(58))
            xlSheet.Range("B" & rCount + 4) = Trim(vItem(1))
            
        End If
                
    Next i
    xlWB.Save
Next olItem


Set xlApp = Nothing
Set xlWB = Nothing
Set xlSheet = Nothing
Set olItem = Nothing


End Sub
子CopyToExcel()
将xlApp作为对象
作为对象的Dim xlWB
将图纸作为对象
Dim xl
将我设置为Outlook.MailItem
变暗vText作为变量
作为字符串的Dim sText
作为变体的暗维它
我想我会坚持多久
暗计数等于长
Dim bx以布尔形式开始
将时间指定为日期
Const strPath As String=“C:\Tracking.xlsx”'工作簿的路径
如果Application.ActiveExplorer.Selection.Count=0,则
MsgBox“未选择任何项目!”,vbCritical,“错误”
出口接头
恩迪夫
出错时继续下一步
Set xlApp=GetObject(,“Excel.Application”)
如果错误为0,则
Application.StatusBar=“正在打开Excel源,请稍候…”
设置xlApp=CreateObject(“Excel.Application”)
bXStarted=True
如果结束
错误转到0
'打开工作簿以输入数据
设置xlWB=xlApp.Workbooks.Open(strPath)
设置xlSheet=xlWB.Sheets(“Sheet1”)
xlWB.Sheets(1).Cells.Delete
'处理每个选定记录
rCount=xlSheet.UsedRange.Rows.Count
'cCount=xlSheet.UsedRange.Columns.Count
对于Application.ActiveExplorer.Selection中的每个olItem
sText=分子筛体
rTime=格式(olItem.ReceivedTime,“mmmm d,yyyy”)
vText=拆分(sText,Chr(13))
'查找工作表的下一个空行
rCount=rCount+1
'检查邮件正文中的每行文本
对于i=UBound(vText)到0,步骤-1
如果仪表(vText(i),“项目/成本:”),则
'ParseText=vText(i+1)&vbCrLf
xlSheet.范围(“A”&rCount)=修剪(vText(2))
vItem=拆分(vText(4),Chr(58))
xlSheet.范围(“B”和rCount)=微调(vItem(1))
xlSheet.范围(“A”&R计数+1)=微调(vText(6))
vItem=拆分(vText(8),Chr(58))
xlSheet.范围(“B”&R计数+1)=微调(vItem(1))
xlSheet.范围(“A”&rCount+2)=微调(vText(10))
vItem=拆分(vText(12),Chr(58))
xlSheet.范围(“B”&rCount+2)=微调(vItem(1))
xlSheet.范围(“A”&rCount+3)=微调(vText(14))
vItem=拆分(vText(16),Chr(58))
xlSheet.范围(“B”&rCount+3)=微调(vItem(1))
xlSheet.范围(“A”&rCount+4)=微调(vText(18))
vItem=拆分(vText(20),Chr(58))
xlSheet.范围(“B”和rCount+4)=微调(vItem(1))
如果结束
接下来我
xlWB.Save
下一代
设置xlApp=Nothing
设置xlWB=Nothing
Set xlSheet=无
设置m=无
端接头
另外,我不是VB专家,所以非常感谢您的帮助

更新: 我找到了如何以我想要的方式提取它,但它是草率的,不是动态的。有时有2个项目,有时有5个,所以我需要它的适应性。有人能帮我清理一下吗?

试试下面的方法

Option Explicit
Sub EmailToCsv()
    Dim olItem As Outlook.MailItem
    Dim xlApp As Excel.Application
    Dim xlWB As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Dim vText As Variant
    Dim sText As String
    Dim vItem As Variant
    Dim i As Long
    Dim RowCount As Long
    Dim xlStarted As Boolean
    Dim FilePath As String

    '// Update File location
    FilePath = "C:\Temp\Tracking.xlsx"

    '// Process Selections
    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")
        xlStarted = True
    End If

    On Error GoTo 0
    '// Open the workbook to input the data
    Set xlWB = xlApp.Workbooks.Open(FilePath)
    Set xlSheet = xlWB.Sheets("Sheet1")

    '// Process each selected record
    For Each olItem In Application.ActiveExplorer.Selection
        sText = olItem.Body
        vText = Split(sText, Chr(13)) ' Chr(13)) carriage return

        '// Find the next empty line of the worksheet
        RowCount = xlSheet.Range("A" & xlSheet.Rows.Count).End(xlUp).Row
        RowCount = RowCount + 1

        '// Check each line of text in the message body
        For i = UBound(vText) To 0 Step -1

            '// Item Description 1
            If InStr(1, vText(i), "Item Description 1:") > 0 Then
                vItem = Split(vText(i), Chr(58)) ' Chr(58) ":"
                xlSheet.Range("A" & RowCount) = "Item Description 1: " & Trim(vItem(1))
            End If

            '// Quantity
            If InStr(1, vText(i), "Quantity:") > 0 Then
                vItem = Split(vText(i), Chr(58))
                xlSheet.Range("B" & RowCount) = Trim(vItem(1))
            End If

            '// Item Description 2
            If InStr(1, vText(i), "Item Description 2:") > 0 Then
                vItem = Split(vText(i), Chr(58))
                xlSheet.Range("A" & RowCount + 1) = "Item Description 2: " & Trim(vItem(1))
            End If

            '// Quantity
            If InStr(1, vText(i), "Quantity:") > 0 Then
                vItem = Split(vText(i), Chr(58))
                xlSheet.Range("B" & RowCount + 1) = Trim(vItem(1))
            End If

        Next i
    Next olItem

    '// SaveChanges & Close
    xlWB.Close SaveChanges:=True
    If xlStarted Then
        xlApp.Quit
    End If

    Set xlApp = Nothing
    Set xlWB = Nothing
    Set xlSheet = Nothing
    Set olItem = Nothing
 End Sub
选项显式
Sub-tocsv()
将我设置为Outlook.MailItem
Dim xlApp作为Excel.Application
将xlWB设置为Excel.工作簿
将工作表设置为Excel.工作表
变暗vText作为变量
作为字符串的Dim sText
作为变体的暗维它
我想我会坚持多久
暗行数与长行数相同
它以布尔形式开始
将文件路径设置为字符串
'//更新文件位置
FilePath=“C:\Temp\Tracking.xlsx”
'//进程选择
如果Application.ActiveExplorer.Selection.Count=0,则
MsgBox“未选择任何项目!”,vbCritical,“错误”
出口接头
如果结束
出错时继续下一步
Set xlApp=GetObject(,“Excel.Application”)
如果错误为0,则
Application.StatusBar=“正在打开Excel源,请稍候…”
设置xlApp=CreateObject(“Excel.Application”)
xlStarted=True
如果结束
错误转到0
“//打开工作簿以输入数据
设置xlWB=xlApp.Workbooks.Open(文件路径)
设置xlSheet=xlWB.Sheets(“Sheet1”)
“//处理每个选定的记录
对于Application.ActiveExplorer.Selection中的每个olItem
sText=分子筛体
vText=分割(sText,Chr(13))‘Chr(13))回车
“//查找工作表的下一个空行
RowCount=xlSheet.Range(“A”&xlSheet.Rows.Count)。End(xlUp)。Row
RowCount=RowCount+1
“//检查邮件正文中的每行文本
对于i=UBound(vText)到0,步骤-1
'//项目说明1
如果仪表(1,vText(i),“项目说明1:”)>0,则
vItem=Split(vText(i),Chr(58))‘Chr(58)’:
xlSheet.Range(“A”&行数)=“项目说明1:”&修剪(vItem(1))
如果结束
'//数量
如果指令(1,vText(i),“数量:”)>0,则
vItem=拆分(vText(i),Chr(58))
xlSheet.Range(“B”和行数)=修剪(vItem(1))
如果结束
'//项目说明2
如果仪表(1,vText(i),“项目说明2:”)>0,则
vItem=拆分(vText(i),Chr(58))
xlSheet.Range(“A”&行数+1)=“项目说明2:”&修剪(vItem(1))
如果结束
'//数量
如果指令(1,vText(i),“数量:”)>0,则
vItem=拆分(vText(i),Chr(58))
xlSheet.Range(“B”和行数+1)=修剪(vItem(1))
如果结束
接下来我
下一代
“//保存更改并关闭(&S)
xlWB.Close SaveChanges:=True
如果我们开始的话
xlApp.退出
如果结束
设置xlApp=Nothing
设置xlWB=Nothing
Set xlSheet=无
设置m=无
端接头
问题是每封电子邮件的“项目说明”总是不同的,因此我无法让它查找stri