2017-08-24 113 views
0

我想寫一個宏,通過30k + .msg文件在桌面文件夾和子文件夾中。如果文件名包含「簽證流程 - 」或「簽署文件 - 」,目標是獲得發送日期和作者。另外,這隻能在最早的文件中完成。假設我們在一個子文件夾中,並且有三個與「簽證流程」有關的文件,那麼只有最早的文件纔會被考慮。VBA作者和發送日期的.msg文件在桌面文件夾

獲取發送日期是我到目前爲止所管理的,但我不知道如何實現獲取作者。我激活了Outlook加載項,但我是VBA新手,來自互聯網的示例代碼並不能幫助我掌握有限的知識。

任何幫助,非常感謝!

不幸的是,我不知道如何在這裏爲您提供一個示例文件,但我很樂意通過電子郵件發送它。

這裏我(工作代碼)兩種類型的電子郵件的發送日期:

'Optimize Macro Speed 
Application.ScreenUpdating = False 
Application.EnableEvents = False 
Application.Calculation = xlCalculationManual 

Dim wb As Workbook 
Dim ws As Worksheet 
Dim FSO As Object, fld As Object, Fil As Object 
Dim fsoFile As Object 
Dim fsoFol As Object 
Dim fsoSubFol As Object 
Dim folderPath As String, subfolderPath As String, folderName As String, FilePath As String 
Dim StepOne As String, StepTwo As String, FileName As String, CompareDate As String 
Dim NextRow As Long 
Dim FindExistingEntry As Range 

Set wb = ActiveWorkbook 
Set ws = wb.Worksheets("Feuil2") 


With ws 
    .UsedRange.Clear 
    .Cells(1, 1).Value = "Main Folder:" 
    .Cells(1, 2).Value = "File Name:" 
    .Cells(1, 3).Value = "MSG Date:" 
    .Cells(1, 4).Value = "File Name:" 
    .Cells(1, 5).Value = "Approved Date:" 
    .Range("A1:E1").Font.Bold = True 
End With 

Application.DisplayAlerts = False 
With Application.FileDialog(msoFileDialogFolderPicker) 
    .AllowMultiSelect = False 
    If .Show <> -1 Then MsgBox "No folder selected! Exiting script.": Exit Sub 
    folderPath = .SelectedItems(1) 
End With 

If Right(folderPath, 1) <> "\" Then folderPath = folderPath + "\" 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set fld = FSO.GetFolder(folderPath) 
If FSO.FolderExists(fld) Then 
    For Each fsoFol In FSO.GetFolder(folderPath).SubFolders 

On Error Resume Next 
      subfolderPath = fsoFol & "\Mails" 

      For Each fsoSubFol In FSO.GetFolder(subfolderPath).Files 


       FilePath = fsoSubFol 
       FileName = Split(FilePath, "\")(4)  'Get only "Visa Process--2017-06-07 15h24m00s.MSG" of target file 4 
       folderName = Split(FilePath, "\")(2) 
       If Mid(FileName, InStrRev(FileName, ".") + 1) = "MSG" Then 

        'Example: Visa Process--2017-06-07 15h24m00s.MSG 
        If InStr(1, FileName, "Visa Process--", vbTextCompare) <> 0 And Left(FileName, 1) = "V" Then 

         NextRow = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row 

         'Example: Visa Process--2017-06-07 15h24m00s.MSG 
         StepOne = Split(FileName, "--")(1) 'No "Visa Process--" 
         StepTwo = Mid(StepOne, 1, 10)  'No Time-Stamp 

         'Make sure to only include the earliest date for each Main Folder "MPCV....." 
         Set FindExistingEntry = ws.Range("A2:A4000").Find(folderName) 

         'If there is already an entry... 
         If Not FindExistingEntry Is Nothing Then 
          CompareDate = ws.Cells(FindExistingEntry.Row, 3).Value 

          'Replace old date for that Main Folder if new date is earlier than previous 
          If DateValue(CompareDate) > DateValue(StepTwo) Then 

           ws.Cells(FindExistingEntry.Row, 2).Value = FileName 
           ws.Cells(FindExistingEntry.Row, 3).Value = DateValue(CompareDate) 

          'Do nothing if Main Folder date is later 
          ElseIf DateValue(CompareDate) < DateValue(StepTwo) Then 

          End If 
         'If there is no entry for the same Main Folder, simply add a new line 
         ElseIf FindExistingEntry Is Nothing Then 

          ws.Cells(NextRow + 1, 1).Value = folderName 
          ws.Cells(NextRow + 1, 2).Value = FileName 
          ws.Cells(NextRow + 1, 3).Value = DateValue(StepTwo) 

         End If 

        End If 

        'Do the same for the second document 
        If InStr(1, FileName, "Document signed--", vbTextCompare) <> 0 And Left(FileName, 1) = "D" Then 

         NextRow = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row 

         'Example: Document signed--2017-06-07 15h24m00s.MSG 
         StepOne = Split(FileName, "--")(1) 'No "Document signed--" 
         StepTwo = Mid(StepOne, 1, 10)  'No Time-Stamp 

         'Make sure to only include the earliest date for each Main Folder "MPCV....." 
         Set FindExistingEntry = ws.Range("A2:A4000").Find(folderName) 

         'If there is already an entry... 
         If Not FindExistingEntry Is Nothing Then 
          CompareDate = ws.Cells(FindExistingEntry.Row, 3).Value 

          'Replace old date for that Main Folder if new date is earlier than previous 
          If DateValue(CompareDate) > DateValue(StepTwo) Then 

           ws.Cells(FindExistingEntry.Row, 4).Value = FileName 
           ws.Cells(FindExistingEntry.Row, 5).Value = DateValue(CompareDate) 

          'Do nothing if Main Folder date is later 
          ElseIf DateValue(CompareDate) < DateValue(StepTwo) Then 

          End If 
         'If there is no entry for the same Main Folder, simply add a new line 
         ElseIf FindExistingEntry Is Nothing Then 

          'ws.Cells(NextRow + 1, 1).Value = folderName 
          'ws.Cells(NextRow, 4).Value = Filename 
          'ws.Cells(NextRow, 5).Value = DateValue(StepTwo) 

         End If 

        End If 
       End If 
      Next 
    Next 
End If 

'Message Box when tasks are completed 
MsgBox "Scan Complete!" 

'Reset Macro Optimization Settings 
Application.EnableEvents = True 
Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True 
ActiveWorkbook.Saved = True 

回答

0

創建Outlook.Application對象的實例(進入循環前),從Application.GetNamespace("MAPI")檢索Namespace對象,並使用Namespace.OpenSharedItem傳遞MSG文件的文件na。檢索到的MailItem對象將包含如Subject,SenderName,SenderEmailAddress,SentOn等屬性。

+0

您好德米特里,非常感謝您的回覆。我會盡力實施你的建議!讓我在幾分鐘內回覆您 – VBAbeginner

+0

非常感謝您抽出時間。它經過一些調整後才起作用。你有什麼想法可以讓它變得更快嗎?隨意編輯上面的代碼。 – VBAbeginner

相關問題