将数据从outlook导出到特定文件中的特定工作表

时间:2014-08-10 19:24:13

标签: excel vba excel-vba outlook

经过一天的游戏并得到了 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的新手,如果没有帮助,我还是会摸不着头脑。 提前谢谢。

1 个答案:

答案 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) 时,它将使用您按预期打开的工作簿。之前,您的代码正在打开您想要的工作簿,但它没有对它执行任何操作,因为您没有为其分配“句柄”以便访问它。