Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Нормализация данных через массив - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Нормализация данных через массив (Макросы/Sub)
Нормализация данных через массив
user0 Дата: Суббота, 28.10.2017, 10:07 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 128
Репутация: 8 ±
Замечаний: 0% ±

Excel 2013, 2016
Доброго времени суток,

Подскажите, пожалуйста, как нормализовать данные с несколькх листов через массив и на каком этапе лучше производить очистку данных.
Сейчас работает, но сделано через запись нормализованый данных поклеточно, что сказывается на производительности. Очистка данных производится уже после получения всех нормализованных данных.
На картинке: желтым - необходимые данные, красным - те, которые сейчас также нормализуются, но в конце удаляются.

К сообщению приложен файл: NormalizeData.xlsm(43Kb)
 
Ответить
СообщениеДоброго времени суток,

Подскажите, пожалуйста, как нормализовать данные с несколькх листов через массив и на каком этапе лучше производить очистку данных.
Сейчас работает, но сделано через запись нормализованый данных поклеточно, что сказывается на производительности. Очистка данных производится уже после получения всех нормализованных данных.
На картинке: желтым - необходимые данные, красным - те, которые сейчас также нормализуются, но в конце удаляются.


Автор - user0
Дата добавления - 28.10.2017 в 10:07
SLAVICK Дата: Суббота, 28.10.2017, 11:31 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2011
Репутация: 675 ±
Замечаний: 0% ±

2007,2010,2013,2016
запись нормализованый данных поклеточно,

Ну так записывайте не на лист а в массив, а потом оттуда - выгружайте на лист.
Для этого замените блок записи на лист
[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]
а еще можно применить готовое решение, например отсюда
К сообщению приложен файл: 6000613.xlsm(44Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
запись нормализованый данных поклеточно,

Ну так записывайте не на лист а в массив, а потом оттуда - выгружайте на лист.
Для этого замените блок записи на лист
[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
Дата добавления - 28.10.2017 в 11:31
user0 Дата: Суббота, 28.10.2017, 12:21 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 128
Репутация: 8 ±
Замечаний: 0% ±

Excel 2013, 2016
Спасибо большое!
>а еще можно применить готовое решение
Не видел, посмотрю и его, спасибо!
 
Ответить
СообщениеСпасибо большое!
>а еще можно применить готовое решение
Не видел, посмотрю и его, спасибо!

Автор - user0
Дата добавления - 28.10.2017 в 12:21
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Нормализация данных через массив (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2017 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!