Подскажите, пожалуйста, как нормализовать данные с несколькх листов через массив и на каком этапе лучше производить очистку данных. Сейчас работает, но сделано через запись нормализованый данных поклеточно, что сказывается на производительности. Очистка данных производится уже после получения всех нормализованных данных. На картинке: желтым - необходимые данные, красным - те, которые сейчас также нормализуются, но в конце удаляются.
Доброго времени суток,
Подскажите, пожалуйста, как нормализовать данные с несколькх листов через массив и на каком этапе лучше производить очистку данных. Сейчас работает, но сделано через запись нормализованый данных поклеточно, что сказывается на производительности. Очистка данных производится уже после получения всех нормализованных данных. На картинке: желтым - необходимые данные, красным - те, которые сейчас также нормализуются, но в конце удаляются.
Ну так записывайте не на лист а в массив, а потом оттуда - выгружайте на лист. Для этого замените блок записи на лист [vba]
Код
For r = 1 To rnIn.Rows.Count For c = 5 To rnIn.Columns.Count rnOut.Cells(rowOut, 1) = Trim(Application.Clean(rnIn.Cells(r, 1))) 'rnIn.Cells(r, 1) rnOut.Cells(rowOut, 2) = Mid(ws.Name, 5, 2) rnOut.Cells(rowOut, 3) = Right(ws.Name, 1) rnOut.Cells(rowOut, 4) = rnIn.Cells(1, c) rnOut.Cells(rowOut, 5) = Trim(Application.Clean(rnIn.Cells(r, c))) rowOut = rowOut + 1 Next c Next r
[/vba] блоком работы с массивами [vba]
Код
rowOut = 1 Dim arr, arr1, tr% arr = rnIn.Value 'данные в массив ReDim arr1(1 To UBound(arr) * (UBound(arr, 2) - 4), 1 To 5) For r = 1 To UBound(arr) For c = 5 To UBound(arr, 2) arr1(rowOut, 1) = Trim(Application.Clean(arr(r, 1))) 'rnIn.Cells(r, 1) arr1(rowOut, 2) = Mid(ws.Name, 5, 2) arr1(rowOut, 3) = Right(ws.Name, 1) arr1(rowOut, 4) = rnIn.Cells(1, c) arr1(rowOut, 5) = Trim(Application.Clean(rnIn.Cells(r, c))) rowOut = rowOut + 1 Next c Next r rnOut.Offset(tr).Resize(UBound(arr1), UBound(arr1, 2)).Value = arr1 'данные из массива tr = tr + UBound(arr1) + 1
[/vba] а еще можно применить готовое решение, например отсюда
Ну так записывайте не на лист а в массив, а потом оттуда - выгружайте на лист. Для этого замените блок записи на лист [vba]
Код
For r = 1 To rnIn.Rows.Count For c = 5 To rnIn.Columns.Count rnOut.Cells(rowOut, 1) = Trim(Application.Clean(rnIn.Cells(r, 1))) 'rnIn.Cells(r, 1) rnOut.Cells(rowOut, 2) = Mid(ws.Name, 5, 2) rnOut.Cells(rowOut, 3) = Right(ws.Name, 1) rnOut.Cells(rowOut, 4) = rnIn.Cells(1, c) rnOut.Cells(rowOut, 5) = Trim(Application.Clean(rnIn.Cells(r, c))) rowOut = rowOut + 1 Next c Next r
[/vba] блоком работы с массивами [vba]
Код
rowOut = 1 Dim arr, arr1, tr% arr = rnIn.Value 'данные в массив ReDim arr1(1 To UBound(arr) * (UBound(arr, 2) - 4), 1 To 5) For r = 1 To UBound(arr) For c = 5 To UBound(arr, 2) arr1(rowOut, 1) = Trim(Application.Clean(arr(r, 1))) 'rnIn.Cells(r, 1) arr1(rowOut, 2) = Mid(ws.Name, 5, 2) arr1(rowOut, 3) = Right(ws.Name, 1) arr1(rowOut, 4) = rnIn.Cells(1, c) arr1(rowOut, 5) = Trim(Application.Clean(rnIn.Cells(r, c))) rowOut = rowOut + 1 Next c Next r rnOut.Offset(tr).Resize(UBound(arr1), UBound(arr1, 2)).Value = arr1 'данные из массива tr = tr + UBound(arr1) + 1
[/vba] а еще можно применить готовое решение, например отсюда SLAVICK