经过一天的游戏并得到了 David Zemens 的大量帮助后,我终于让这段代码在Outlook VBA中运行了。问题:它导出我想要导出的数据,但总是导出到新的工作簿。它会打开正确的文件(C:\ Users \ George \ Desktop \ gs.xlsx),但数据将转到新文件。我会问大卫,但他帮助了我(并教会了我),以至于我不想过去做。 所以,这是代码:
Sub Application_NewMailEx(ByVal EntryIDCollection As String)
'Excel objects
Dim xlApp As Excel.Application
Dim xlWB As Excel.Workbook
Dim xlSheet As Excel.Worksheet
MsgBox "Mail received!"
Dim id As Variant 'used to iterate the EntryIDCollection
Dim email As Outlook.MailItem 'represents each email item
Dim msgText As Variant 'Array used to iterate the "lines" in the email:
'Create an instance of Excel that we can use:
Set xlApp = CreateObject("Excel.Application")
xlApp.Workbooks.Open FileName:="C:\Users\George\Desktop\gs.xlsx", AddTOMRU:=False, UpdateLinks:=False
For Each id In Split(EntryIDCollection, ",")
'Assign a mailItem variable to this email:
Set email = Application.Session.GetItemFromID(id)
'Add some logic to ensure you only process the right emails.
' you could use a defined subject and/or sender name, etc.
' MODIFY AS NEEDED
If email.Subject = "Report of Property" Then
Dim line As Variant
从这里开始,我认为我犯了一个错误:
Set xlWB = xlApp.Workbooks.Add
Set xlSheet = xlWB.Worksheets(1)
line = xlSheet.Range("A" & xlSheet.Rows.Count).End(-4162).Offset(1).Row '//
For Each line In Split(email.Body, vbCrLf)
If Left(line, 5) = "Name:" Then
xlSheet.Range("B6").Value = Trim(Mid(line, 6))
ElseIf Left(line, 13) = "Time started:" Then
xlSheet.Range("A6").Value = Trim(Mid(line, 22))
ElseIf Left(line, 4) = "Sage" Then
xlSheet.Range("D6").Value = Trim(Mid(line, 9))
ElseIf Left(line, 8) = "Complete" Then
xlSheet.Range("F6").Value = Trim(Mid(line, 20))
ElseIf Left(line, 4) = "Job1" Then
xlSheet.Range("G6").Value = Trim(Mid(line, 6))
MsgBox "All Values have been added! Now get to work!"
End If
Next
Else
MsgBox "Not Written"
End If
xlApp.Visible = True
Next
End Sub
此代码打开gs.xlsx文件,但将数据放在另一个新的excel文件中,而不是gs.xlsx文件中的gs表。我不知道自己哪里出错了。我是VBA的新手,如果没有帮助,我还是会摸不着头脑。 提前谢谢。
答案 0 :(得分:1)
代码中的这一行:
Set xlWB = xlApp.Workbooks.Add
创建一个新工作簿并将其添加到现有工作簿集合中。然后你的代码用它来做它的东西,这就是为什么你总是操纵新添加的工作簿而不是之前打开的工作簿。
您需要做的是删除该行并将xlWB
分配给您打开的工作簿,如下所示(注意在{围绕{强>括号> {1}}函数的参数!):
Open
然后,当您的代码使用Set xlWB = xlApp.Workbooks.Open(Filename:="C:\Users\George\Desktop\gs.xlsx", AddTOMRU:=False, UpdateLinks:=False)
时,它将使用您按预期打开的工作簿。之前,您的代码正在打开您想要的工作簿,但它没有对它执行任何操作,因为您没有为其分配“句柄”以便访问它。