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

Вход

Регистрация

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

 

= Мир MS Excel/Обработка данных таблицы при количестве строк более 300 000 - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Обработка данных таблицы при количестве строк более 300 000 (Макросы/Sub)
Обработка данных таблицы при количестве строк более 300 000
HiHiMAX Дата: Среда, 09.09.2015, 09:00 | Сообщение № 21
Группа: Пользователи
Ранг: Новичок
Сообщений: 24
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
если в вашем рабочем файле структура такая же, как в файле-примере

к сожалению нет, столбцы разделены другими данными.
на скрепке данные с исходной структурой
поясните, пожалуйста, как задать нужные диапазоны данных в исходной структуре

как я уже писал, вчера пробовал первый вариант макроса от KSV на 47К строк:
MS office 2013 x64 работал около 40мин, обработав 93% строк
затем офис повис...
тем не менее можно обрабатывать порции данных по 1К-3К строк

макрос макросу рознь

вечером смогу проверить Ваш код, по результату отпишу
К сообщению приложен файл: 1234_1.xls (17.0 Kb)


Сообщение отредактировал HiHiMAX - Среда, 09.09.2015, 12:35
 
Ответить
Сообщение
если в вашем рабочем файле структура такая же, как в файле-примере

к сожалению нет, столбцы разделены другими данными.
на скрепке данные с исходной структурой
поясните, пожалуйста, как задать нужные диапазоны данных в исходной структуре

как я уже писал, вчера пробовал первый вариант макроса от KSV на 47К строк:
MS office 2013 x64 работал около 40мин, обработав 93% строк
затем офис повис...
тем не менее можно обрабатывать порции данных по 1К-3К строк

макрос макросу рознь

вечером смогу проверить Ваш код, по результату отпишу

Автор - HiHiMAX
Дата добавления - 09.09.2015 в 09:00
AndreTM Дата: Среда, 09.09.2015, 17:10 | Сообщение № 22
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
макрос макросу рознь
Действительно...

А если попробовать вот так? :D
[vba]
Код
Sub generateMark()
     ' столбцы данных: 01 date, 14 name, 15 place, 26 vol, 32 mark
     ' строка начала данных: 46 + 1
     startRow = 47
     Set dict = CreateObject("Scripting.Dictionary")
     dict.CompareMode = 1
     Application.ScreenUpdating = False
     With ActiveSheet
         Set lastCell = .Cells.SpecialCells(xlLastCell)
         Range(.Cells(startRow, 32), .Cells(lastCell.Row, 32)).Clear
         For r = startRow To lastCell.Row
             currName = .Cells(r, 14).Value
             If Len(Trim(currName)) > 0 Then
                 currPlace = .Cells(r, 15).Value
                 currVol = .Cells(r, 26).Value
                 If dict.exists(currName) Then .Cells(r, 32).Value = "b"
                 If currPlace <> 1 And currVol = "m" Then dict(currName) = r
             End If
             If r Mod 10000 = 0 Then Application.StatusBar = "Выполняется..." & Round(100 * (r - startRow - 1) / (lastCell.Row - startRow - 1), 1) & "%"
         Next
         Application.StatusBar = "Готово"
     End With
     Application.ScreenUpdating = True
End Sub
[/vba]
К сообщению приложен файл: 10-19130-2.xlsm (17.8 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
Сообщение
макрос макросу рознь
Действительно...

А если попробовать вот так? :D
[vba]
Код
Sub generateMark()
     ' столбцы данных: 01 date, 14 name, 15 place, 26 vol, 32 mark
     ' строка начала данных: 46 + 1
     startRow = 47
     Set dict = CreateObject("Scripting.Dictionary")
     dict.CompareMode = 1
     Application.ScreenUpdating = False
     With ActiveSheet
         Set lastCell = .Cells.SpecialCells(xlLastCell)
         Range(.Cells(startRow, 32), .Cells(lastCell.Row, 32)).Clear
         For r = startRow To lastCell.Row
             currName = .Cells(r, 14).Value
             If Len(Trim(currName)) > 0 Then
                 currPlace = .Cells(r, 15).Value
                 currVol = .Cells(r, 26).Value
                 If dict.exists(currName) Then .Cells(r, 32).Value = "b"
                 If currPlace <> 1 And currVol = "m" Then dict(currName) = r
             End If
             If r Mod 10000 = 0 Then Application.StatusBar = "Выполняется..." & Round(100 * (r - startRow - 1) / (lastCell.Row - startRow - 1), 1) & "%"
         Next
         Application.StatusBar = "Готово"
     End With
     Application.ScreenUpdating = True
End Sub
[/vba]

Автор - AndreTM
Дата добавления - 09.09.2015 в 17:10
KSV Дата: Среда, 09.09.2015, 17:55 | Сообщение № 23
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
к сожалению нет

Вот, я не понимаю, для чего давать некий "абстрактный" пример, если потом все равно сам не сможешь адаптировать полученное решение к своему рабочему файлу?
Вы, конечно, здесь не один такой, но может хоть Вы мне объясните?...
[p.s.]Прокомментировал для Вас каждую строчку кода[/p.s.]
К сообщению приложен файл: 0633936.xls (39.5 Kb)


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333
 
Ответить
Сообщение
к сожалению нет

Вот, я не понимаю, для чего давать некий "абстрактный" пример, если потом все равно сам не сможешь адаптировать полученное решение к своему рабочему файлу?
Вы, конечно, здесь не один такой, но может хоть Вы мне объясните?...
[p.s.]Прокомментировал для Вас каждую строчку кода[/p.s.]

Автор - KSV
Дата добавления - 09.09.2015 в 17:55
HiHiMAX Дата: Среда, 09.09.2015, 18:54 | Сообщение № 24
Группа: Пользователи
Ранг: Новичок
Сообщений: 24
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
Вот, я не понимаю, для чего давать некий "абстрактный" пример,

На момент обращения на форум этого примера казалось вполне достаточно, что-то вроде: "ну, пару-то столбцов я смогу переназначить в макросе, палюбому!"
Просто Ваше знание VBA и манера написания кода на порядок лучше моего и многих пользователей офиса. Так что не стоит сердиться.

Второй макрос сработал гораздо лучше: excel задумался на 4мин, затем расставил маркеры где положено)
За помощь большое спасибо


Сообщение отредактировал HiHiMAX - Среда, 09.09.2015, 18:55
 
Ответить
Сообщение
Вот, я не понимаю, для чего давать некий "абстрактный" пример,

На момент обращения на форум этого примера казалось вполне достаточно, что-то вроде: "ну, пару-то столбцов я смогу переназначить в макросе, палюбому!"
Просто Ваше знание VBA и манера написания кода на порядок лучше моего и многих пользователей офиса. Так что не стоит сердиться.

Второй макрос сработал гораздо лучше: excel задумался на 4мин, затем расставил маркеры где положено)
За помощь большое спасибо

Автор - HiHiMAX
Дата добавления - 09.09.2015 в 18:54
AndreTM Дата: Среда, 09.09.2015, 20:50 | Сообщение № 25
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
excel задумался на 4мин
Это много. У меня, на слабом компе, на тестовом примере в 300 тыс. - код отработал за пару десятков секунд. Могу предположить, что у вас какие-то ещё формулы/эвенты завязаны на столбец с маркером, а автоперерасчет вы на время работы макроса - не отключили...


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
Сообщение
excel задумался на 4мин
Это много. У меня, на слабом компе, на тестовом примере в 300 тыс. - код отработал за пару десятков секунд. Могу предположить, что у вас какие-то ещё формулы/эвенты завязаны на столбец с маркером, а автоперерасчет вы на время работы макроса - не отключили...

Автор - AndreTM
Дата добавления - 09.09.2015 в 20:50
KSV Дата: Среда, 09.09.2015, 23:36 | Сообщение № 26
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
Ну, да, 4 мин. – это многовато...
Попробуйте вариант со словарем (должно быть гораздо быстрее) [vba]
Код
Option Base 1

Sub Проставить_Маркеры()
     Dim i&, s$, p(), v(), dic As Object
     Set dic = CreateObject("Scripting.Dictionary")
     i = [N46].End(xlDown).Row       ' получаем номер последней заполненной строки
     p = Range("N47:O" & i)          ' считываем в массив данные столбцов N и O
     v = Range("Z47:Z" & i)          ' считываем в массив данные столбца Z
     For i = 1 To UBound(v)          ' просматриваем массив, от первой строки до последней
         s = p(i, 1)                 ' сохраняем искомое имя участника в переменную (т.к. доступ к значению переменной чуть быстрее, чем доступ к значению двухмерного массива)
         p(i, 1) = dic(s)            ' получаем результат предыдущего испытания искомого участника
         dic(s) = IIf(p(i, 2) <> 1 And v(i, 1) = "m", "b", Empty) ' запоминаем результат предыдущего испытания искомого участника
     Next
     [AF47].Resize(i - 1) = p        ' выводим маркеры на лист Excel
End Sub
[/vba]
К сообщению приложен файл: 1234_2.xls (44.5 Kb)


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333
 
Ответить
СообщениеНу, да, 4 мин. – это многовато...
Попробуйте вариант со словарем (должно быть гораздо быстрее) [vba]
Код
Option Base 1

Sub Проставить_Маркеры()
     Dim i&, s$, p(), v(), dic As Object
     Set dic = CreateObject("Scripting.Dictionary")
     i = [N46].End(xlDown).Row       ' получаем номер последней заполненной строки
     p = Range("N47:O" & i)          ' считываем в массив данные столбцов N и O
     v = Range("Z47:Z" & i)          ' считываем в массив данные столбца Z
     For i = 1 To UBound(v)          ' просматриваем массив, от первой строки до последней
         s = p(i, 1)                 ' сохраняем искомое имя участника в переменную (т.к. доступ к значению переменной чуть быстрее, чем доступ к значению двухмерного массива)
         p(i, 1) = dic(s)            ' получаем результат предыдущего испытания искомого участника
         dic(s) = IIf(p(i, 2) <> 1 And v(i, 1) = "m", "b", Empty) ' запоминаем результат предыдущего испытания искомого участника
     Next
     [AF47].Resize(i - 1) = p        ' выводим маркеры на лист Excel
End Sub
[/vba]

Автор - KSV
Дата добавления - 09.09.2015 в 23:36
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Обработка данных таблицы при количестве строк более 300 000 (Макросы/Sub)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

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