在outlook中使用VB将数据从邮件复制到excel工作表

在outlook中使用VB将数据从邮件复制到excel工作表,excel,vba,outlook,Excel,Vba,Outlook,我收到数百封同样格式的电子邮件 我需要复制文件名,状态日期,文件大小,上传md5和md5的接收器到一个excel表 我有一个复制文件名、状态日期和文件大小的代码。但我需要上传md5和md5的接收器值以及 请检查我的代码并提出修改建议,以便上传接收器值上的md5和md5 代码: 子CopyToExcel() 将xlApp作为对象 作为对象的Dim xlWB 将图纸作为对象 将我设置为Outlook.MailItem 变暗vText作为变量 作为字符串的Dim sText 作为变体的暗维它 将行项

我收到数百封同样格式的电子邮件

我需要复制文件名,状态日期,文件大小,上传md5和md5的接收器到一个excel表

我有一个复制文件名、状态日期和文件大小的代码。但我需要上传md5和md5的接收器值以及

请检查我的代码并提出修改建议,以便上传接收器值上的md5和md5

代码:

子CopyToExcel()
将xlApp作为对象
作为对象的Dim xlWB
将图纸作为对象
将我设置为Outlook.MailItem
变暗vText作为变量
作为字符串的Dim sText
作为变体的暗维它
将行项目变暗为变量
尺寸c与长度相同
我想我会坚持多久
暗计数等于长
Dim bx以布尔形式开始
Const strPath As String=“C:\Users\nhussain\Desktop\test.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”)
'处理每个选定记录
rCount=xlSheet.UsedRange.Rows.Count
对于Application.ActiveExplorer.Selection中的每个olItem
sText=分子筛体
vText=拆分(sText,Chr(13))
'查找工作表的下一个空行
rCount=rCount+1
'检查邮件正文中的每行文本
对于i=UBound(vText)到0,步骤-1
如果InStr(1,vText(i),“文件名:”)>0,则
vItem=拆分(vText(i),Chr(58))
xlSheet.范围(“A”&R计数)=微调(vItem(1))
如果结束
如果指令(1,vText(i),“状态日期:”)>0,则
vItem=拆分(vText(i),Chr(58))
xlSheet.范围(“B”和rCount)=微调(vItem(1))
如果结束
'无法处理下面的0-1(0减1),因此需要确保我们的i>0
如果i>0,那么
'如果前一行包含“文件大小”,则此行为
'文件大小、md5和md5接收行
如果InStr(1,vText(i-1),“文件大小”)>0,则
'将行按空格分割
lineItems=拆分(修剪(vText(i)),“”)
'使用大小为的第一项填充工作表
xlSheet.Range(“C”&rCount)=修剪(行项目(0))和修剪(行项目(1))
lineItems=拆分(修剪(vText(i)),Chr(9))
'循环遍历数组中的每个项以获取rd5值
对于c=1到UBound(行项目,1)
“我不想要空白
如果行项目(c)“,则
如果xlSheet.Range(“D”&rCount.Value2=”“,则
xlSheet.Range(“D”和rCount)=行项目(c)
其他的
xlSheet.Range(“E”和rCount)=行项目(c)
如果结束
如果结束
下一个c
如果结束
如果结束
接下来我
xlWB.Save
下一代
xlWB.Close SaveChanges:=True
如果BX启动,那么
xlApp.退出
如果结束
设置xlApp=Nothing
设置xlWB=Nothing
Set xlSheet=无
设置m=无
端接头

根据“字节”而不是“文件大小”进行搜索可能更简单,因此行位置已经知道

Option Explicit ' Consider this mandatory
' Tools | Options | Editor tab
' Require Variable Declaration
' If desperate declare as Variant

Private Sub CopyToExcel()

Dim xlApp As Object
Dim xlWB As Object
Dim xlSheet As Object

Dim xlDataArray() As String
ReDim xlDataArray(2)    ' zero based => 3 elements
Dim xlIndex As Long

Dim olItem As Object    ' Not all items are mailitems

Dim vText As Variant
Dim sText As String
Dim vItem As Variant
Dim lineItems As Variant

Dim i As Long
Dim j As Long

Dim rCount As Long
Dim bXStarted As Boolean

Const strPath As String = "C:\Users\nhussain\Desktop\test.xlsx" 'the path of the workbook

If 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
    ' .StatusBar is not available in Outlook
    ' Error bypassed due to On Error Resume Next
    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")
'xlApp.Visible = True

'Process each selected record
rCount = xlSheet.UsedRange.Rows.Count

For Each olItem In ActiveExplorer.Selection

    If olItem.Class = olMail Then
    
        sText = olItem.Body
        'vText = Split(sText, Chr(13))
        vText = Split(sText, Chr(13) & Chr(10)) ' vbCrLf
        
        'Find the next empty line of the worksheet
        rCount = rCount + 1
        Debug.Print rCount
        
        'Check each line of text in the message body
        For i = LBound(vText) To UBound(vText)
                
            If Len(Trim(vText(i))) > 0 Then
            
                'Debug.Print i; vText(i)
                
                If InStr(1, vText(i), "File Name :") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("A" & rCount) = Trim(vItem(1))
                End If
    
                If InStr(1, vText(i), "Status Date :") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("B" & rCount) = Trim(vItem(1))
                    
                    Exit For
                    
                End If
            End If
        Next
            
        For i = UBound(vText) To LBound(vText) Step -1
                   
            If InStr(1, vText(i), "bytes") > 0 Then
 
                Debug.Print Trim(vText(i))
                lineItems = Split(Trim(vText(i)), " ")
                    
                xlIndex = 0
                    
                For j = LBound(lineItems) To UBound(lineItems)
                    If Len(lineItems(j)) > 0 Then
                        Debug.Print xlIndex; lineItems(j)
                        If lineItems(j) <> "bytes" Then
                            xlDataArray(xlIndex) = lineItems(j)
                            Debug.Print xlIndex; xlDataArray(xlIndex)
                            xlIndex = xlIndex + 1
                        End If
                    End If
                Next
                
                Exit For
                    
            End If
        Next i
                   
        ' Populate the worksheet
        xlSheet.Range("C" & rCount) = xlDataArray(0)
        xlSheet.Range("D" & rCount) = xlDataArray(1)
        xlSheet.Range("E" & rCount) = xlDataArray(2)
    
        xlWB.Save
        
    End If
    
Next olItem

xlSheet.Columns.AutoFit

xlWB.Close SaveChanges:=True
If bXStarted Then
    xlApp.Quit
End If

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

End Sub
“代码>选项显式”考虑此强制 “工具|选项|编辑器”选项卡 '需要变量声明 “如果是,请声明为变体 私有子CopyToExcel() 将xlApp作为对象 作为对象的Dim xlWB 将图纸作为对象 Dim xlDataArray()作为字符串 ReDim xlDataArray(2)“零基=>3个元素 与索引一样长 “将邮件作为对象”并非所有项目都是邮件项目 变暗vText作为变量 作为字符串的Dim sText 作为变体的暗维它 将行项目变暗为变量 我想我会坚持多久 Dim j尽可能长 暗计数等于长 Dim bx以布尔形式开始 Const strPath As String=“C:\Users\nhussain\Desktop\test.xlsx”工作簿的路径 如果ActiveExplorer.Selection.Count=0,则 MsgBox“未选择任何项目!”,vbCritical,“错误” 出口接头 如果结束 出错时继续下一步 Set xlApp=GetObject(,“Excel.Application”) 如果错误为0,则 “。状态栏在Outlook中不可用 '由于下一步恢复时出错而绕过错误 Application.StatusBar=“正在打开Excel源,请稍候…” 设置xlApp=CreateObject(“Excel.Application”) bXStarted=True 如果结束 错误转到0 '打开工作簿以输入数据 设置xlWB=xlApp.Workbooks.Open(strPath) 设置xlSheet=xlWB.Sheets(“Sheet1”) 'xlApp.Visible=True '处理每个选定记录 rCount=xlSheet.UsedRange.Rows.Count 对于ActiveExplorer.Selection中的每个olItem 如果olItem.Class=olMail,则 sText=分子筛体 'vText=拆分(sText,Chr(13)) vText=拆分(sText、Chr(13)和Chr(10))'vbCrLf '查找工作表的下一个空行 rCount=rCount+1 调试。打印rCount '检查邮件正文中的每行文本 对于i=LBound(vText)到UBound(vText) 如果Len(Trim(vText(i))大于0,则 'Debug.Print i;vText(一) 如果InStr(1,vText(i),“文件名:”)>0,则 vItem=拆分(vText(i),Chr(58)) xlSheet.范围(“A”&R计数)=微调(vItem(1)) 如果结束 如果指令(1,vText(i),“状态日期:”)>0,则 vItem=拆分(vText(i),Chr(58)) xlSheet.范围(“B”和rCount)=微调(vItem(1)) 退出 如果结束 如果结束 下一个 对于i=UBound(vText)到LBound(vText)步骤-1 如果InStr(1,vText(i),“字节”)>0,则 调试.打印修剪(vText(i)) lineItems=拆分(修剪(vText(i)),“”) xlIndex=0
Option Explicit ' Consider this mandatory
' Tools | Options | Editor tab
' Require Variable Declaration
' If desperate declare as Variant

Private Sub CopyToExcel()

Dim xlApp As Object
Dim xlWB As Object
Dim xlSheet As Object

Dim xlDataArray() As String
ReDim xlDataArray(2)    ' zero based => 3 elements
Dim xlIndex As Long

Dim olItem As Object    ' Not all items are mailitems

Dim vText As Variant
Dim sText As String
Dim vItem As Variant
Dim lineItems As Variant

Dim i As Long
Dim j As Long

Dim rCount As Long
Dim bXStarted As Boolean

Const strPath As String = "C:\Users\nhussain\Desktop\test.xlsx" 'the path of the workbook

If 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
    ' .StatusBar is not available in Outlook
    ' Error bypassed due to On Error Resume Next
    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")
'xlApp.Visible = True

'Process each selected record
rCount = xlSheet.UsedRange.Rows.Count

For Each olItem In ActiveExplorer.Selection

    If olItem.Class = olMail Then
    
        sText = olItem.Body
        'vText = Split(sText, Chr(13))
        vText = Split(sText, Chr(13) & Chr(10)) ' vbCrLf
        
        'Find the next empty line of the worksheet
        rCount = rCount + 1
        Debug.Print rCount
        
        'Check each line of text in the message body
        For i = LBound(vText) To UBound(vText)
                
            If Len(Trim(vText(i))) > 0 Then
            
                'Debug.Print i; vText(i)
                
                If InStr(1, vText(i), "File Name :") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("A" & rCount) = Trim(vItem(1))
                End If
    
                If InStr(1, vText(i), "Status Date :") > 0 Then
                    vItem = Split(vText(i), Chr(58))
                    xlSheet.Range("B" & rCount) = Trim(vItem(1))
                    
                    Exit For
                    
                End If
            End If
        Next
            
        For i = UBound(vText) To LBound(vText) Step -1
                   
            If InStr(1, vText(i), "bytes") > 0 Then
 
                Debug.Print Trim(vText(i))
                lineItems = Split(Trim(vText(i)), " ")
                    
                xlIndex = 0
                    
                For j = LBound(lineItems) To UBound(lineItems)
                    If Len(lineItems(j)) > 0 Then
                        Debug.Print xlIndex; lineItems(j)
                        If lineItems(j) <> "bytes" Then
                            xlDataArray(xlIndex) = lineItems(j)
                            Debug.Print xlIndex; xlDataArray(xlIndex)
                            xlIndex = xlIndex + 1
                        End If
                    End If
                Next
                
                Exit For
                    
            End If
        Next i
                   
        ' Populate the worksheet
        xlSheet.Range("C" & rCount) = xlDataArray(0)
        xlSheet.Range("D" & rCount) = xlDataArray(1)
        xlSheet.Range("E" & rCount) = xlDataArray(2)
    
        xlWB.Save
        
    End If
    
Next olItem

xlSheet.Columns.AutoFit

xlWB.Close SaveChanges:=True
If bXStarted Then
    xlApp.Quit
End If

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

End Sub