2015-11-19 5 views
2

Я написал код, который находит все файлы, начинающиеся с определенного имени, и считывает данные из них, обычно в папке обычно находится 1k файлов или больше, я написал небольшой тест и понимаю, что мой код читает aprox 1 файл в секунду, и это очень много времени. Я новичок в vba, и мне было интересно, не ошибся ли я на этом? Код функции:Excel vba чтение большого количества файлов быстрее

Function ReadDataFromWorksheet() 
Dim XL As Excel.Application 
Dim WBK As Excel.Workbook 
Dim i As Integer 

i = 1 

Set XL = CreateObject("Excel.Application") 

Do While i < (ArraySize + 1) 
    Set WBK = XL.Workbooks.Open("PATH TO FILE") 
    Array(i).Data1 = WBK.ActiveSheet.Range("F6").Value 
    WBK.Close SaveChanges:=False 
    i = i + 1 
Loop 

Set XL = Nothing 
End Function 

Извините за мой плохой орфографии ... и спасибо заранее за помощь!

ответ

0

Вот как вы должны использовать Dir:

Function ReadDataFromWorksheet() As Variant 

With Application 
    .EnableEvents = False 'stop executing this code until we are done 
    .DisplayAlerts = False 
    .ScreenUpdating = False 
    '.Calculation = xlCalculationManual 
End With 

Dim XL As Excel.Application 
Dim WBK As Excel.Workbook 
Dim FileName As String, _ 
    FolderPath As String, _ 
    Results() 
ReDim Results(0) 

On Error Resume Next 
Set XL = GetObject(, "Excel.Application") 
If Err.Number > 0 Then Set XL = CreateObject("Excel.Application") 
On Error GoTo 0 

FolderPath = "C:/test/" 
FileName = Dir(FolderPath & "*.xlsx") 

Do While FileName <> "" 
    Set WBK = XL.Workbooks.Open(FolderPath & FileName) 
    Results(UBound(Results)) = WBK.ActiveSheet.Range("F6").Value 
    WBK.Close SaveChanges:=False 
    ReDim Preserve Results(UBound(Results) + 1) 
    FileName = Dir 
Loop 
ReDim Preserve Results(UBound(Results) - 1) 

Set WBK = Nothing 
Set XL = Nothing 

With Application 
    .EnableEvents = True 
    .DisplayAlerts = True 
    .ScreenUpdating = True 
    '.Calculation = xlCalculationAutomatic 
End With 

ReadDataFromWorksheet = Results 
End Function 
+0

спасибо за answear! но я думаю, что вы неправильно поняли, мой код работает нормально, моя программа работает, и у меня есть циркуль, чтобы получить все пути к моим файлам, проблема в том, что с кодом, который я читал, файлы медленны, я читаю aprox. 135 файлов в минуту, а в папке есть 1k + файлы ... Мне просто интересно, есть ли лучший/быстрый способ сделать это или это единственный способ? –

+1

@ Файлы открытия/закрытия UrošGrum всегда будут медленными. Вы можете ускорить некоторые действия, установив ScreenUpdating в false и перевернув вычисления в ручном режиме до начала цикла. В противном случае Excel не является лучшей платформой для быстрого открытия/закрытия книг. Вы можете сэкономить некоторое время, открыв их партиями ... но этот код будет немного сложнее. – SpaceSteak

+0

@ UrošGrum: Как сказал SpaceSteak, открывающиеся файлы всегда будут довольно медленными даже для маленьких/легких файлов! Поэтому я добавил код для деактивации большинства бесполезных вещей для освобождения памяти для Excel, но это не будет невероятно эффективным! Просто сохранил режим расчета в качестве комментария, я позволил вам выбрать для этого! ;) – R3uK

Смежные вопросы