Добрый день. Задачка такая - в папке находится несколько файлов rtf, в них, соответственно - таблицы. Есть желание данные из этих таблиц считать в массивы (чтоб в дальнейшем - вставлять на листы excel).
Вобщем, родилась у меня такая функция.. Входной параметр - одномерный строчный массив, первый элемент - путь к папке, последующие - имена файлов rtf. Вроде все работает, но - при больших объемах данных - медленно. 4 файла, в каждом по 5-6 таблиц, количество строк 500...1000, столбцов от 2 до 8 - читает минут 6. Есть ли методы ускорения процесса и оптимизации данной процедурки?
Код |
---|
Function CheckRtfFilesForTables1(q1) Dim arr As Variant Dim tmp(1 To 4) As Variant Dim data() As Variant Dim i As Long, j As Long, k As Long Dim filePath As String Dim currentFile As String Dim wordApp As Object Dim doc As Object Dim tbl As Object Dim strpath As String Dim isFileOpen As Boolean Dim rData As Variant Dim cellData As String On Error Resume Next arr = q1 ReDim data(1 To 1) strpath = arr(1) If Right(Replace(strpath, " ", ""), 1) <> "\" Then strpath = strpath & "\" Set wordApp = CreateObject("Word.Application") For i = 2 To UBound(arr) currentFile = arr(i) filePath = strpath & currentFile isFileOpen = False For j = 1 To wordApp.Documents.Count If wordApp.Documents(j).FullName = filePath Then Set doc = wordApp.Documents(j) isFileOpen = True Exit For End If Next j If Not isFileOpen Then Set doc = wordApp.Documents.Open(filePath, ReadOnly:=True) Else doc.Activate End If For j = 1 To doc.Tables.Count Set tbl = doc.Tables(j) If Not tbl Is Nothing Then tmp(1) = tbl.cell(1, 1).Range.Text tmp(1) = Left(tmp(1), Len(tmp(1)) - 2) tmp(2) = tbl.Columns.Count tmp(3) = tbl.Rows.Count ReDim rData(1 To tmp(3), 1 To tmp(2)) For k = 1 To tbl.Rows.Count For m = 1 To tbl.Columns.Count rData(k, m) = tbl.cell(k, m).Range.Text rData(k, m) = Left(rData(k, m), Len(rData(k, m)) - 2) If Val(Replace(rData(k, m), ",", ".")) = rData(k, m) and rData(k, m)<>"" Then rData(k, m) = Val(Replace(rData(k, m), ",", ".")) Next m Next k tmp(4) = rData data(UBound(data)) = tmp ReDim Preserve data(1 To UBound(data) + 1) End If Next j ReDim Preserve data(1 To UBound(data) - 1) If Not isFileOpen Then doc.Close False End If Next i CheckRtfFilesForTables1 = data wordApp.Quit Set wordApp = Nothing End Function |