在outlook中使用VB将数据从邮件复制到excel工作表
我收到数百封同样格式的电子邮件 我需要复制文件名,状态日期,文件大小,上传md5和md5的接收器到一个excel表 我有一个复制文件名、状态日期和文件大小的代码。但我需要上传md5和md5的接收器值以及 请检查我的代码并提出修改建议,以便上传接收器值上的md5和md5 代码:在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 作为变体的暗维它 将行项
子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