У меня есть тысячи файлов Excel в подпапках, из которых мне нужно извлечь данные и скомпилировать их в мастер-лист.Файлы обычно приходят изо дня в день в течение нескольких месяцев.
Я уже создал макрос, который выполняет все это.
У меня возникли проблемы с периодическим повторным запуском макроса для добавления новых файлов.
Мне нужен метод отслеживания того, какие файлы уже были обработаны, а какие нет.До сих пор моим решением было использовать имя файла в качестве уникального ключа и сравнивать каждый файл, в котором выполняется макрос, со списком уникальных ключей, сохраненных на втором листе.Как вы можете себе представить, это невероятно медленно, и мне интересно, есть ли лучшее решение.
Ниже приведен макрос, который я построил:
Option Explicit
Sub PullInspectionData()
Dim fso, oFolder, oSubfolder, oFile, queue As Collection
Dim n, i As Long
Dim wb, mwb As Workbook
Dim wsb, mws, cws As Worksheet
Dim DefectCode, Level, LocationComments As String
Dim PhaseName As String
'Optimize Macro Speed
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.AskToUpdateLinks = False
Application.DisplayAlerts = False
'Creates the collection of files within the subfolder
Set fso = CreateObject("Scripting.FileSystemObject")
Set queue = New Collection
Set mwb = ActiveWorkbook
Set mws = mwb.Worksheets("Inspection Data")
Set cws = mwb.Worksheets("Macro Controls")
RowNumber = Worksheets("Inspection Data").Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count + 1
queue.Add fso.GetFolder("filepath") 'obviously replace
DoEvents
Do While queue.Count > 0
Set oFolder = queue(1)
queue.Remove 1 'dequeue
DoEvents
'...insert any folder processing code here...
For Each oSubfolder In oFolder.subfolders
queue.Add oSubfolder 'enqueue
DoEvents
Next oSubfolder
DoEvents
For Each oFile In oFolder.Files
On Error Resume Next
DoEvents
' Operate on each file
'This keeps track of which files have already been processed
n = Worksheets("MacroControls").Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
For i = 1 To n
If Cells(i, 1).Value = oFile.Name Then
GoTo SkipLoop
DoEvents
End If
Next i
DoEvents
'Actually begins to Copy Information to the Master File
Cells(i, 1).Value = oFile.Name
Set wb = Workbooks.Open(oFile)
Set wsb = wb.Worksheets("PO Data")
DoEvents
'file processing code removed for simplicity
DoEvents
wb.Close SaveChanges:=False
DoEvents
SkipLoop:
Next oFile
DoEvents
Loop
'Reset Macro Optimization Settings
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
Application.AskToUpdateLinks = True
End Sub
Рабочий лист «Данные проверки» - это основной файл, в котором собрана вся информация, а рабочий лист «Элементы управления макросом» содержит списокфайлы, которые уже были обработаны.
Как мне ускорить процесс?