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

Вход

Регистрация

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

 

= Мир MS Excel/Загрузить данные в массив 300 000 строк - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Загрузить данные в массив 300 000 строк (Макросы/Sub)
Загрузить данные в массив 300 000 строк
SvetaS Дата: Понедельник, 14.09.2015, 09:48 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
[moder]Перенесено из Готовых решений[/moder]
nerv, Добрый День!
Решение ADO класса действительно очень гениальное hands :hands: hands , однако есть одна трудность
он не выгружает все данные с листа.
А именно на листе 156 000 строк , а он в массив грузит лишь 65536 методом ADO.ToArray() girl_sad :girl_sad:
т.е.
[vba]
Код
    
Dim ADO As New ADO
Dim Arr As Variant
      ADO.DataSource = "d:\ÀÒÁ àâãóñò 2015_ðûáà_649.xlsm"     
      ADO.Query ("SELECT * FROM [лист1$A:AC]")

Arr = ADO.ToArray()
[/vba]
т.е. в окне отладчика "Locals"
Arr(65536) - максимальное число
А нужно чтобы обрабатывались данные размером хотя бы до 200 000 - 350 000 строк.
ПОМОГИТЕ ПОЖАЛУЙСТА

girl_sad :girl_sad: girl_sad :girl_sad:


Сообщение отредактировал Pelena - Понедельник, 14.09.2015, 19:32
 
Ответить
Сообщение[moder]Перенесено из Готовых решений[/moder]
nerv, Добрый День!
Решение ADO класса действительно очень гениальное hands :hands: hands , однако есть одна трудность
он не выгружает все данные с листа.
А именно на листе 156 000 строк , а он в массив грузит лишь 65536 методом ADO.ToArray() girl_sad :girl_sad:
т.е.
[vba]
Код
    
Dim ADO As New ADO
Dim Arr As Variant
      ADO.DataSource = "d:\ÀÒÁ àâãóñò 2015_ðûáà_649.xlsm"     
      ADO.Query ("SELECT * FROM [лист1$A:AC]")

Arr = ADO.ToArray()
[/vba]
т.е. в окне отладчика "Locals"
Arr(65536) - максимальное число
А нужно чтобы обрабатывались данные размером хотя бы до 200 000 - 350 000 строк.
ПОМОГИТЕ ПОЖАЛУЙСТА

girl_sad :girl_sad: girl_sad :girl_sad:

Автор - SvetaS
Дата добавления - 14.09.2015 в 09:48
SvetaS Дата: Понедельник, 14.09.2015, 09:57 | Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
nerv, ПОДСКАЖИТЕ, пожалуйста, может быть есть ещё вариант уменьшить как-то занимаемую память в целях последующей обработки получаемого массива, а то только загрузла данные в массив , а уже 4,5 Гб оперативки занято. Всего на компе 8 Гб. Но массив ещё нужно будет обработать........Помогите, пожалуйста girl_sad girl_sad girl_sad
 
Ответить
Сообщениеnerv, ПОДСКАЖИТЕ, пожалуйста, может быть есть ещё вариант уменьшить как-то занимаемую память в целях последующей обработки получаемого массива, а то только загрузла данные в массив , а уже 4,5 Гб оперативки занято. Всего на компе 8 Гб. Но массив ещё нужно будет обработать........Помогите, пожалуйста girl_sad girl_sad girl_sad

Автор - SvetaS
Дата добавления - 14.09.2015 в 09:57
SvetaS Дата: Понедельник, 14.09.2015, 14:19 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
Michael_S, Добрый День! Подскажите, пожалуйста, как вы обрабатываете 300 000 строк?

У меня Excel 2016, памяти 8 ГБ. А все не могу найти способ обработки.
1.вариант:

Был алгоритм- обрабатывала с помощью [vba]
Код
Dim Rng_find As Range
[/vba] т.е. [vba]
Код
Dim text_word2() As Variant
  ReDim text_word2(0 To kki, 0 To x)- место ошибки
  'Если ошибку отлавливать  
" On Error Resume Next
  If Err.Number <> 0 Then
  Err.Clear
  End If"
[/vba]

висло при использовании строки [vba]
Код
On Error Resume Next
[/vba] без неё была ошибка "RunTime Error 7 - Out of Memory" (описанна проблемма детальнее http://www.planetaexcel.ru/forum....EN_1=2)

[/i]2 вариант

попыталась использовать ADO
[vba]
Код
Dim ADO As New ADO
Dim Arr As Variant
     ADO.DataSource = "d:\ÀÒÁ àâãóñò 2015_ðûáà_649.xlsm"     
     ADO.Query ("SELECT * FROM [лист1$A:AC]")

Arr = ADO.ToArray()
[/vba]

т.е. в окне отладчика "Locals"
Arr(65536) - максимальное число
А нужно чтобы обрабатывались данные размером хотя бы до 200 000 - 350 000 строк.

3 вариант :

[vba]
Код
Dim Arr As Variant
Set objConnection = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & "G:\0_ÂÎÄÍÛÉ_ÌÈÐ\ÀÒÁ\Àâãóñò\" & "\" & "ÀÒÁ àâãóñò 2015_ðûáà_649.xlsm" & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes"";"
sqlStr1 = "SELECT * FROM [áàçà$B:AC]"
rs.Open sqlStr1, objConnection, 3, 3
[/vba]

так не получается выгрузить в массив. Вернее нужно так выгрузить в массив, чтобы ещё осталось памяти на его обработку и на создание динамического массива, куда даные поедут после обработки

Короче, нужно чтобы заработал:

[vba]
Код

Dim text_word2() As Variant
  ReDim text_word2(0 To kki, 0 To x)- место ошибки
  'Если ошибку отлавливать  
" On Error Resume Next
  If Err.Number <> 0 Then
  Err.Clear
  End If"
[/vba]

Заработал........

Помогите, пожалуйста...........

girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad
 
Ответить
СообщениеMichael_S, Добрый День! Подскажите, пожалуйста, как вы обрабатываете 300 000 строк?

У меня Excel 2016, памяти 8 ГБ. А все не могу найти способ обработки.
1.вариант:

Был алгоритм- обрабатывала с помощью [vba]
Код
Dim Rng_find As Range
[/vba] т.е. [vba]
Код
Dim text_word2() As Variant
  ReDim text_word2(0 To kki, 0 To x)- место ошибки
  'Если ошибку отлавливать  
" On Error Resume Next
  If Err.Number <> 0 Then
  Err.Clear
  End If"
[/vba]

висло при использовании строки [vba]
Код
On Error Resume Next
[/vba] без неё была ошибка "RunTime Error 7 - Out of Memory" (описанна проблемма детальнее http://www.planetaexcel.ru/forum....EN_1=2)

[/i]2 вариант

попыталась использовать ADO
[vba]
Код
Dim ADO As New ADO
Dim Arr As Variant
     ADO.DataSource = "d:\ÀÒÁ àâãóñò 2015_ðûáà_649.xlsm"     
     ADO.Query ("SELECT * FROM [лист1$A:AC]")

Arr = ADO.ToArray()
[/vba]

т.е. в окне отладчика "Locals"
Arr(65536) - максимальное число
А нужно чтобы обрабатывались данные размером хотя бы до 200 000 - 350 000 строк.

3 вариант :

[vba]
Код
Dim Arr As Variant
Set objConnection = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & "G:\0_ÂÎÄÍÛÉ_ÌÈÐ\ÀÒÁ\Àâãóñò\" & "\" & "ÀÒÁ àâãóñò 2015_ðûáà_649.xlsm" & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes"";"
sqlStr1 = "SELECT * FROM [áàçà$B:AC]"
rs.Open sqlStr1, objConnection, 3, 3
[/vba]

так не получается выгрузить в массив. Вернее нужно так выгрузить в массив, чтобы ещё осталось памяти на его обработку и на создание динамического массива, куда даные поедут после обработки

Короче, нужно чтобы заработал:

[vba]
Код

Dim text_word2() As Variant
  ReDim text_word2(0 To kki, 0 To x)- место ошибки
  'Если ошибку отлавливать  
" On Error Resume Next
  If Err.Number <> 0 Then
  Err.Clear
  End If"
[/vba]

Заработал........

Помогите, пожалуйста...........

girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad

Автор - SvetaS
Дата добавления - 14.09.2015 в 14:19
PowerBoy Дата: Понедельник, 14.09.2015, 14:24 | Сообщение № 4
Группа: Проверенные
Ранг: Участник
Сообщений: 100
Репутация: 31 ±
Замечаний: 0% ±

2003
так не получается выгрузить в массив.

Выгружайте данные на лист и работайте с ними. Зачем Вам массив?


Excel + SQL = ActiveTables (http://vk.com/ExcelSQL)
 
Ответить
Сообщение
так не получается выгрузить в массив.

Выгружайте данные на лист и работайте с ними. Зачем Вам массив?

Автор - PowerBoy
Дата добавления - 14.09.2015 в 14:24
SvetaS Дата: Понедельник, 14.09.2015, 14:27 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
anvg, Добрый День! А как Вы обрабатываете 300 000 строк? Как Вы тестировали
Цитата
Тестировал на файле формата xlsb в Excel 2010 32bit, Win7 64bit. Файл содержал один лист на 300000 строк, 40 столбцов
? У меня операционка Win 7 64-х, Excel 2016 64-х , памяти 8 ГБ. проблемма описана подробнее http:http://www.planetaexcel.ru/forum....EN_1=2) сейчас вот 3-и варианта пробывала. А что Вы делаете? А как Вы обрабатываете 300 000 строк?[i]
 
Ответить
Сообщениеanvg, Добрый День! А как Вы обрабатываете 300 000 строк? Как Вы тестировали
Цитата
Тестировал на файле формата xlsb в Excel 2010 32bit, Win7 64bit. Файл содержал один лист на 300000 строк, 40 столбцов
? У меня операционка Win 7 64-х, Excel 2016 64-х , памяти 8 ГБ. проблемма описана подробнее http:http://www.planetaexcel.ru/forum....EN_1=2) сейчас вот 3-и варианта пробывала. А что Вы делаете? А как Вы обрабатываете 300 000 строк?[i]

Автор - SvetaS
Дата добавления - 14.09.2015 в 14:27
SvetaS Дата: Понедельник, 14.09.2015, 14:29 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
PowerBoy, Как на лист? с листа считывать обратно придётся - у меня алгоритм разбора не структурированной строки - с поиском слов в 1 ячейке
 
Ответить
СообщениеPowerBoy, Как на лист? с листа считывать обратно придётся - у меня алгоритм разбора не структурированной строки - с поиском слов в 1 ячейке

Автор - SvetaS
Дата добавления - 14.09.2015 в 14:29
SvetaS Дата: Понедельник, 14.09.2015, 14:31 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
PowerBoy, мой алгоритм полностью описан в http://www.planetaexcel.ru/forum....GEN_1=2
Я не понимаю--- о чём Вы говорите?
 
Ответить
СообщениеPowerBoy, мой алгоритм полностью описан в http://www.planetaexcel.ru/forum....GEN_1=2
Я не понимаю--- о чём Вы говорите?

Автор - SvetaS
Дата добавления - 14.09.2015 в 14:31
SvetaS Дата: Понедельник, 14.09.2015, 14:36 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
АУ! КТО-ТО МОЖЕТ ПОМОЧЬ, КАК ЗАГРУЗИТЬ ДАННЫЕ В МАССИВ -300 000 СТРОК, С ЦЕЛЬЮ ИХ ПОСЛЕДУЮЩЕЙ ОБРАБОТКИ В АЛГОРИТМЕ, ТАК ЧТОБЫ ЕЩЁ ОСТАЛОСЬ ПАМЯТИ НА ОБРАБОТКУ МАССИВА И НА СОЗДАНИЕ ДИНАМИЧЕСКОГО МАССИВА.
АУ! КТО-ТО МОЖЕТ ПОМОЧЬ?
ПОМОГИТЕ ПОЖАЛУЙСТА
girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad
 
Ответить
СообщениеАУ! КТО-ТО МОЖЕТ ПОМОЧЬ, КАК ЗАГРУЗИТЬ ДАННЫЕ В МАССИВ -300 000 СТРОК, С ЦЕЛЬЮ ИХ ПОСЛЕДУЮЩЕЙ ОБРАБОТКИ В АЛГОРИТМЕ, ТАК ЧТОБЫ ЕЩЁ ОСТАЛОСЬ ПАМЯТИ НА ОБРАБОТКУ МАССИВА И НА СОЗДАНИЕ ДИНАМИЧЕСКОГО МАССИВА.
АУ! КТО-ТО МОЖЕТ ПОМОЧЬ?
ПОМОГИТЕ ПОЖАЛУЙСТА
girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad girl_sad

Автор - SvetaS
Дата добавления - 14.09.2015 в 14:36
anvg Дата: Понедельник, 14.09.2015, 15:32 | Сообщение № 9
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток
SvetaS вам уже тему на Планете закрыли. И здесь могу за "крик" наказать.
Вы лучше создайте в разделе VBA тему, приложите файл с исходными данными (небольшое количество, если нужно брать их с нескольких листов, то на двух листах), опишите что вы хотите с ними сделать, и по данным файла создайте лист результат.
Тогда и можно будет думать, можно ли решить задачу через ADO SQL. Пока на вскидку все ваши сообщения посвящены теме о нехватке памяти для массивов, а не тому, что и как вы хотите сделать.
 
Ответить
СообщениеДоброе время суток
SvetaS вам уже тему на Планете закрыли. И здесь могу за "крик" наказать.
Вы лучше создайте в разделе VBA тему, приложите файл с исходными данными (небольшое количество, если нужно брать их с нескольких листов, то на двух листах), опишите что вы хотите с ними сделать, и по данным файла создайте лист результат.
Тогда и можно будет думать, можно ли решить задачу через ADO SQL. Пока на вскидку все ваши сообщения посвящены теме о нехватке памяти для массивов, а не тому, что и как вы хотите сделать.

Автор - anvg
Дата добавления - 14.09.2015 в 15:32
SvetaS Дата: Понедельник, 14.09.2015, 17:14 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
ОПИСАНИЕ ЗАДАЧИ
Есть файл - пример привожу в файле "Дано " на 5 стоках, так как размер данных большой. Всего строк в файле от 150 000 до 300 000 строк.
В файле, в колонке "описание товара" приводится описание различного товара через ";".
необходимо: 1) строки содержащие символ ";" разложить "по строкам" вниз (по строкам, а не по столбцам, т.е. увеличив число строк в файле )
2) количество написанное напротив описания товара в строках с ";" внести в колонку "Кол-во товара"
3) вес написанный напротив упаковки продукции в описании товара внести в отдельную колонку - например 100 гр, или 1,5 кг
4) если указано количество продаж, сделать перевод строки в кг
5) каждой строке, после разложения строк содержащих ";" , по ключевому слову присвоить группу с названием товара в отдельной колонке
- чтобы можно было понять что за товар находится в описании строки
группы строк выделяются по информации находящейся в описании товара:
- Марки компании
- Марки бренда Например, Снежный Краб, Крабыч, Своя Линия, Розумна цена, и т.д.
- типа продукции например, Икра мойвы,
- группы продукции 1, например Икра, Краб Палочки, и т.д.
- группы продукции 2, например Морепродукты, Продукты из сурими, и т.д.
- состояния продукции (кулинарной обработки) например: в масле, по корейски, по мексикански, охлаждённая, замороженная и т.д.
- упаковки продукции (пластик, вакумная упаковка, пресервы, железная банка и т.д.)
- количества граммов продукции - вес выделить в кг отдельно, если продукция в штуках

6) после присвоения группы - создать сводную по группам.

Всего строк до 300 000 в таблице. Время на обработку до 30 минут. Памяти 8 ГБ, win 7, Excel 2016 .Ручной вариант обработки не пройдёт.....Наименования продуктов постоянно меняются. Ассортимент меняется ежедневно.
Для Любителей Баз данных - да загрузка в базы данных есть, но только после сортировки строк по группам, так как ни в Access, ни в Oracle, ни в 1С - нет такого мощного инструмента по работе со строками.

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

В ЧЁМ ПРОБЛЕММА

ошибку даёт Redim на 111 533 строках
на объёме маленьком ошибку не даёт (до 100 строк и до 100 столбцов) - работает нормально......

ОШИБКУ ВЫДАЁТ, когда объявляем новый массив с количество строк увеличенным на необходимое, для разложения строк содержащих ";"
место ошибки:
[vba]
Код
im text_word2() As Variant
  ReDim text_word2(0 To kki, 0 To x)- место ошибки
  'Если ошибку отлавливать  
" On Error Resume Next
  If Err.Number <> 0 Then
  Err.Clear
  End If"
[/vba]
- то Excel виснит и уходит в бесконечный цикл, постоянно увеличивая занимаемую память.
К сообщению приложен файл: 7050606.xlsx (14.6 Kb)
 
Ответить
СообщениеОПИСАНИЕ ЗАДАЧИ
Есть файл - пример привожу в файле "Дано " на 5 стоках, так как размер данных большой. Всего строк в файле от 150 000 до 300 000 строк.
В файле, в колонке "описание товара" приводится описание различного товара через ";".
необходимо: 1) строки содержащие символ ";" разложить "по строкам" вниз (по строкам, а не по столбцам, т.е. увеличив число строк в файле )
2) количество написанное напротив описания товара в строках с ";" внести в колонку "Кол-во товара"
3) вес написанный напротив упаковки продукции в описании товара внести в отдельную колонку - например 100 гр, или 1,5 кг
4) если указано количество продаж, сделать перевод строки в кг
5) каждой строке, после разложения строк содержащих ";" , по ключевому слову присвоить группу с названием товара в отдельной колонке
- чтобы можно было понять что за товар находится в описании строки
группы строк выделяются по информации находящейся в описании товара:
- Марки компании
- Марки бренда Например, Снежный Краб, Крабыч, Своя Линия, Розумна цена, и т.д.
- типа продукции например, Икра мойвы,
- группы продукции 1, например Икра, Краб Палочки, и т.д.
- группы продукции 2, например Морепродукты, Продукты из сурими, и т.д.
- состояния продукции (кулинарной обработки) например: в масле, по корейски, по мексикански, охлаждённая, замороженная и т.д.
- упаковки продукции (пластик, вакумная упаковка, пресервы, железная банка и т.д.)
- количества граммов продукции - вес выделить в кг отдельно, если продукция в штуках

6) после присвоения группы - создать сводную по группам.

Всего строк до 300 000 в таблице. Время на обработку до 30 минут. Памяти 8 ГБ, win 7, Excel 2016 .Ручной вариант обработки не пройдёт.....Наименования продуктов постоянно меняются. Ассортимент меняется ежедневно.
Для Любителей Баз данных - да загрузка в базы данных есть, но только после сортировки строк по группам, так как ни в Access, ни в Oracle, ни в 1С - нет такого мощного инструмента по работе со строками.

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

В ЧЁМ ПРОБЛЕММА

ошибку даёт Redim на 111 533 строках
на объёме маленьком ошибку не даёт (до 100 строк и до 100 столбцов) - работает нормально......

ОШИБКУ ВЫДАЁТ, когда объявляем новый массив с количество строк увеличенным на необходимое, для разложения строк содержащих ";"
место ошибки:
[vba]
Код
im text_word2() As Variant
  ReDim text_word2(0 To kki, 0 To x)- место ошибки
  'Если ошибку отлавливать  
" On Error Resume Next
  If Err.Number <> 0 Then
  Err.Clear
  End If"
[/vba]
- то Excel виснит и уходит в бесконечный цикл, постоянно увеличивая занимаемую память.

Автор - SvetaS
Дата добавления - 14.09.2015 в 17:14
SvetaS Дата: Понедельник, 14.09.2015, 17:15 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
обновлённый код

[vba]
Код
Dim n As Long
Dim nn As Long
Dim il As Long
Dim find As String
Dim k, kk, ii, i, j, jj, l, ll, jjj, i1, i2, kkk, j1, j2, j3, i3, jj3, eqmax As Long
Dim ii_find As Long
Dim jj_find As Long
Dim ii_text As Long
Dim jj_text As Long
Dim ii_text_ost As Long
Dim jj_text_ost As Long
Dim txt As String
Dim txt2 As String
Dim txt_p As String
Dim txt_col As String
Dim txt_row As String
Dim txt_out As String

      Dim Rng_find As Range
      Dim Rng_find1 As Range
      Dim Rng_text As Range
      Dim Rng_substitution As Range
      Dim Rng_out As Range
      Dim theRange_out As Range
      Dim Delimiter As String
Dim s_percent As Double

Dim Find_word() As String
Dim Find_word2() As String
Dim text_word1() As String
Dim text_word2() As Variant
Dim text_word3() As String

     On Error Resume Next
     Set Rng_find = Range(RefEdit1.Value)

     Set Rng_text = Range(RefEdit2.Value)
     Set Rng_substitution = Range(RefEdit3.Value)
     Set Rng_out = Range(RefEdit4.Value)
     Delimiter = Me.TextBox1
     s_percent = CDbl((Me.TextBox4.Value))
      
     On Error GoTo 0
     If Rng_find Is Nothing Then
         MsgBox "вы не выбрали диапазон какие данные ищем"
         Err.Clear
     Else
     If Rng_text Is Nothing Then
         MsgBox "вы не выбрали диапазон в котором ищем данные "
         Err.Clear
     Else
      
       If Rng_out Is Nothing Then
          MsgBox "вы не выбрали диапазон куда выводить данные"
          Err.Clear
       Else
      
     Application.ScreenUpdating = False
      On Error Resume Next: Err.Clear
      
         
    'раскладываем по словам искомый диапазон
     ii_find = myWord(Rng_find).imyRows
     jj_find = myWord(Rng_find).imyColumns
      
      
     ReDim Find_word(1 To ii_find, 0 To jj_find) ' 0-вой столбец фраза целиком
     Find_word = myWord(Rng_find).iFindword
      
      ' переводим в массив 2-ух строк
      ' 0 строка фраза целиком
      ' 1 строка разложение по словам
     ReDim Find_word2(0 To 2, 0 To (jj_find * ii_find))  '
     jjj = 1

    For i = 1 To ii_find
      For j = 1 To jj_find
        If ((Find_word(i, j) <> "") And (Find_word(i, j) <> " ") And (Find_word(i, j) <> Empty)) Then
           Find_word2(0, jjj) = Find_word(i, 0)
           Find_word2(1, jjj) = Find_word(i, j)
           jjj = jjj + 1
        End If
      Next j
    Next i
    
     'раскладываем по словам  диапазон в котором ищем
     ii_text = myWord(Rng_text).imyRows
     jj_text = myWord(Rng_text).imyColumns
     ReDim text_word1(1 To ii_text, 0 To jj_text) ' 0-вой столбец фраза целиком
     text_word1 = myWord(Rng_text).iFindword
'______________

      'перед тем как сравнивать 2-ва массива и класть их в третий    разбиваем их
       
    Dim coll_text_word As Collection_: Set coll_text_word = SplitArrayAll(text_word1, ii_find, jj_find, CLng(TextBox3.Text))
      
    Dim coll_Find_word As Collection_: Set coll_Find_word = SplitArrayAll(Find_word, ii_find, jj_find, CLng(TextBox2.Text))
    Dim arr_Find_word() As Variant
    Dim arr_text_word1() As Variant
    Dim my_row As Long
     
  txt_p = Substring(RefEdit4.Text, "!", 1)
  txt_col = Substring(Substring(RefEdit4.Text, "!", 2), "$", 2)
  txt2 = Substring(Substring(RefEdit4.Text, "!", 2), "$", 3)
  txt_row = Substring(txt2, ":", 1)
   
  ii_text_ost = 0
  my_row = 0
  ' выводим результаты массива поиска по частям
    For i = 1 To coll_text_word.Count
      For j = 1 To coll_Find_word.Count
         arr_Find_word = coll_Find_word.Item(j)
         arr_text_word1 = coll_text_word.Item(i)
         ii_text_ost = myWordfind3(arr_text_word1, UBound(arr_text_word1), jj_find, arr_Find_word, UBound(arr_Find_word), jj_text, s_percent).imyRows
         jj_text_ost = myWordfind3(arr_text_word1, UBound(arr_text_word1), jj_find, arr_Find_word, UBound(arr_Find_word), jj_text, s_percent).imyColumns
         ReDim text_word3(1 To ii_text_ost, 1 To jj_text_ost + 1) 'место ошибки
         On Error Resume Next: Err.Clear
         text_word3 = myWordfind3(arr_text_word1, UBound(arr_text_word1), jj_find, arr_Find_word, UBound(arr_Find_word), jj_text, s_percent).iFindword
         txt_row = txt_row + my_row
          
         'вставка итогового массива
         il = jj_text_ost + Int(Columns(txt_col).Column)
         txt_out = txt_col & txt_row & ":" & Trim(Substring(Cells(1, il).Address, "$", 2)) & Trim(Str(((ii_text_ost) + txt_row - 1)))
          
         ActiveWorkbook.Sheets(txt_p).Range(txt_out).Clear
         Set theRange_out = ActiveWorkbook.Sheets(txt_p).Range(txt_out)
         theRange_out = text_word3
         my_row = ii_text_ost 'шаг вывода ( считаем коородинаты выведения каждой части )
       Next j
    Next i

     
   'динамический расчёт вставляемого массива от заданной ячейки полбзователем
   
   
      End If
     End If
   End If
    
   Application.ScreenUpdating = True
[/vba]
 
Ответить
Сообщениеобновлённый код

[vba]
Код
Dim n As Long
Dim nn As Long
Dim il As Long
Dim find As String
Dim k, kk, ii, i, j, jj, l, ll, jjj, i1, i2, kkk, j1, j2, j3, i3, jj3, eqmax As Long
Dim ii_find As Long
Dim jj_find As Long
Dim ii_text As Long
Dim jj_text As Long
Dim ii_text_ost As Long
Dim jj_text_ost As Long
Dim txt As String
Dim txt2 As String
Dim txt_p As String
Dim txt_col As String
Dim txt_row As String
Dim txt_out As String

      Dim Rng_find As Range
      Dim Rng_find1 As Range
      Dim Rng_text As Range
      Dim Rng_substitution As Range
      Dim Rng_out As Range
      Dim theRange_out As Range
      Dim Delimiter As String
Dim s_percent As Double

Dim Find_word() As String
Dim Find_word2() As String
Dim text_word1() As String
Dim text_word2() As Variant
Dim text_word3() As String

     On Error Resume Next
     Set Rng_find = Range(RefEdit1.Value)

     Set Rng_text = Range(RefEdit2.Value)
     Set Rng_substitution = Range(RefEdit3.Value)
     Set Rng_out = Range(RefEdit4.Value)
     Delimiter = Me.TextBox1
     s_percent = CDbl((Me.TextBox4.Value))
      
     On Error GoTo 0
     If Rng_find Is Nothing Then
         MsgBox "вы не выбрали диапазон какие данные ищем"
         Err.Clear
     Else
     If Rng_text Is Nothing Then
         MsgBox "вы не выбрали диапазон в котором ищем данные "
         Err.Clear
     Else
      
       If Rng_out Is Nothing Then
          MsgBox "вы не выбрали диапазон куда выводить данные"
          Err.Clear
       Else
      
     Application.ScreenUpdating = False
      On Error Resume Next: Err.Clear
      
         
    'раскладываем по словам искомый диапазон
     ii_find = myWord(Rng_find).imyRows
     jj_find = myWord(Rng_find).imyColumns
      
      
     ReDim Find_word(1 To ii_find, 0 To jj_find) ' 0-вой столбец фраза целиком
     Find_word = myWord(Rng_find).iFindword
      
      ' переводим в массив 2-ух строк
      ' 0 строка фраза целиком
      ' 1 строка разложение по словам
     ReDim Find_word2(0 To 2, 0 To (jj_find * ii_find))  '
     jjj = 1

    For i = 1 To ii_find
      For j = 1 To jj_find
        If ((Find_word(i, j) <> "") And (Find_word(i, j) <> " ") And (Find_word(i, j) <> Empty)) Then
           Find_word2(0, jjj) = Find_word(i, 0)
           Find_word2(1, jjj) = Find_word(i, j)
           jjj = jjj + 1
        End If
      Next j
    Next i
    
     'раскладываем по словам  диапазон в котором ищем
     ii_text = myWord(Rng_text).imyRows
     jj_text = myWord(Rng_text).imyColumns
     ReDim text_word1(1 To ii_text, 0 To jj_text) ' 0-вой столбец фраза целиком
     text_word1 = myWord(Rng_text).iFindword
'______________

      'перед тем как сравнивать 2-ва массива и класть их в третий    разбиваем их
       
    Dim coll_text_word As Collection_: Set coll_text_word = SplitArrayAll(text_word1, ii_find, jj_find, CLng(TextBox3.Text))
      
    Dim coll_Find_word As Collection_: Set coll_Find_word = SplitArrayAll(Find_word, ii_find, jj_find, CLng(TextBox2.Text))
    Dim arr_Find_word() As Variant
    Dim arr_text_word1() As Variant
    Dim my_row As Long
     
  txt_p = Substring(RefEdit4.Text, "!", 1)
  txt_col = Substring(Substring(RefEdit4.Text, "!", 2), "$", 2)
  txt2 = Substring(Substring(RefEdit4.Text, "!", 2), "$", 3)
  txt_row = Substring(txt2, ":", 1)
   
  ii_text_ost = 0
  my_row = 0
  ' выводим результаты массива поиска по частям
    For i = 1 To coll_text_word.Count
      For j = 1 To coll_Find_word.Count
         arr_Find_word = coll_Find_word.Item(j)
         arr_text_word1 = coll_text_word.Item(i)
         ii_text_ost = myWordfind3(arr_text_word1, UBound(arr_text_word1), jj_find, arr_Find_word, UBound(arr_Find_word), jj_text, s_percent).imyRows
         jj_text_ost = myWordfind3(arr_text_word1, UBound(arr_text_word1), jj_find, arr_Find_word, UBound(arr_Find_word), jj_text, s_percent).imyColumns
         ReDim text_word3(1 To ii_text_ost, 1 To jj_text_ost + 1) 'место ошибки
         On Error Resume Next: Err.Clear
         text_word3 = myWordfind3(arr_text_word1, UBound(arr_text_word1), jj_find, arr_Find_word, UBound(arr_Find_word), jj_text, s_percent).iFindword
         txt_row = txt_row + my_row
          
         'вставка итогового массива
         il = jj_text_ost + Int(Columns(txt_col).Column)
         txt_out = txt_col & txt_row & ":" & Trim(Substring(Cells(1, il).Address, "$", 2)) & Trim(Str(((ii_text_ost) + txt_row - 1)))
          
         ActiveWorkbook.Sheets(txt_p).Range(txt_out).Clear
         Set theRange_out = ActiveWorkbook.Sheets(txt_p).Range(txt_out)
         theRange_out = text_word3
         my_row = ii_text_ost 'шаг вывода ( считаем коородинаты выведения каждой части )
       Next j
    Next i

     
   'динамический расчёт вставляемого массива от заданной ячейки полбзователем
   
   
      End If
     End If
   End If
    
   Application.ScreenUpdating = True
[/vba]

Автор - SvetaS
Дата добавления - 14.09.2015 в 17:15
SvetaS Дата: Понедельник, 14.09.2015, 17:21 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
функции SplitArrayAll,SplitArray взята на сайте EducatedFool , для разбивки по коллекциям для отработки массива частями, согласно рекомендациям The_Prist
 
Ответить
Сообщениефункции SplitArrayAll,SplitArray взята на сайте EducatedFool , для разбивки по коллекциям для отработки массива частями, согласно рекомендациям The_Prist

Автор - SvetaS
Дата добавления - 14.09.2015 в 17:21
SvetaS Дата: Понедельник, 14.09.2015, 17:30 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
Если вы имеете в виду брать файлы меньшего размера и делить сами файлы- то это исключенно изначально, так как иначе сводная не получится........
 
Ответить
СообщениеЕсли вы имеете в виду брать файлы меньшего размера и делить сами файлы- то это исключенно изначально, так как иначе сводная не получится........

Автор - SvetaS
Дата добавления - 14.09.2015 в 17:30
Pelena Дата: Понедельник, 14.09.2015, 19:26 | Сообщение № 14
Группа: Админы
Ранг: Местный житель
Сообщений: 19182
Репутация: 4420 ±
Замечаний: ±

Excel 365 & Mac Excel
Так как вопрос вышел за рамки Готового решения по теме "ADO - класс для работы с данными Excel при помощи SQL", переношу его в отдельную тему в раздел ВОПРОСЫ ПО VBA


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеТак как вопрос вышел за рамки Готового решения по теме "ADO - класс для работы с данными Excel при помощи SQL", переношу его в отдельную тему в раздел ВОПРОСЫ ПО VBA

Автор - Pelena
Дата добавления - 14.09.2015 в 19:26
nilem Дата: Понедельник, 14.09.2015, 20:04 | Сообщение № 15
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
[vba]
Код
s_percent = CDbl((Me.TextBox4.Value))
[/vba]
видимо, форма должна быть
в файле ее нет


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение[vba]
Код
s_percent = CDbl((Me.TextBox4.Value))
[/vba]
видимо, форма должна быть
в файле ее нет

Автор - nilem
Дата добавления - 14.09.2015 в 20:04
wild_pig Дата: Понедельник, 14.09.2015, 21:29 | Сообщение № 16
Группа: Проверенные
Ранг: Обитатель
Сообщений: 517
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
У меня виснет excel, когда доходит до 1,6г памяти, хотя её стоит 8.
А вот и мсдн
Цитата
Для 64-разрядной версии Excel 2010 не действует ограничение в 2 ГБ ОЗУ, которое распространяется на 32-разрядные приложения. Таким образом, пользователи 64-разрядной версии Excel 2010 могут создавать книги большего размера. 64-разрядная версия Windows поддерживает больший объем адресуемой памяти, что в полной мере используется 64-разрядной версией Excel. Например, пользователи могут заполнять сетку большим объемом данных по сравнению с предыдущими версиями Excel. При увеличении объемов ОЗУ компьютера приложение Excel может использовать эту дополнительную память для работы со значительно более крупными книгами и масштабирования доступного объема ОЗУ.


Сообщение отредактировал wild_pig - Понедельник, 14.09.2015, 21:53
 
Ответить
СообщениеУ меня виснет excel, когда доходит до 1,6г памяти, хотя её стоит 8.
А вот и мсдн
Цитата
Для 64-разрядной версии Excel 2010 не действует ограничение в 2 ГБ ОЗУ, которое распространяется на 32-разрядные приложения. Таким образом, пользователи 64-разрядной версии Excel 2010 могут создавать книги большего размера. 64-разрядная версия Windows поддерживает больший объем адресуемой памяти, что в полной мере используется 64-разрядной версией Excel. Например, пользователи могут заполнять сетку большим объемом данных по сравнению с предыдущими версиями Excel. При увеличении объемов ОЗУ компьютера приложение Excel может использовать эту дополнительную память для работы со значительно более крупными книгами и масштабирования доступного объема ОЗУ.

Автор - wild_pig
Дата добавления - 14.09.2015 в 21:29
doober Дата: Понедельник, 14.09.2015, 22:55 | Сообщение № 17
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Для Любителей Баз данных
Предложения об использовании баз данных принимаются только вместе с описанием

Как бы делал я.
Используем MSSQL,созданм в нем пару процедур.
В файле Excel макросом производим предварительную пакетную обработку,инсертим в базу пакетами-увеличивает скорость обработки.
Запускаем процедуры,они делают свою работу,последняя из них возвращает сводную таблицу.
Были 3 таблицы по 2-4 млн записей,делал выборку в сводную из них за 13 минут.
Сервер кушал 500 метров оперативки.




Сообщение отредактировал doober - Понедельник, 14.09.2015, 22:55
 
Ответить
Сообщение
Для Любителей Баз данных
Предложения об использовании баз данных принимаются только вместе с описанием

Как бы делал я.
Используем MSSQL,созданм в нем пару процедур.
В файле Excel макросом производим предварительную пакетную обработку,инсертим в базу пакетами-увеличивает скорость обработки.
Запускаем процедуры,они делают свою работу,последняя из них возвращает сводную таблицу.
Были 3 таблицы по 2-4 млн записей,делал выборку в сводную из них за 13 минут.
Сервер кушал 500 метров оперативки.

Автор - doober
Дата добавления - 14.09.2015 в 22:55
SvetaS Дата: Вторник, 15.09.2015, 07:00 | Сообщение № 18
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
doober, ВЫГЛЯДИТ КЛАССНО hands , только непонятно. Какую
Цитата
В файле Excel макросом производим предварительную пакетную обработку
? КАК
Цитата
инсертим в базу пакетами
? Здесь весь вопрос какую обработку может тянуть Excel? И какую обработку делаем в базе (какие текстовые функции может использовать язык базы......)? girl_sad girl_sad
 
Ответить
Сообщениеdoober, ВЫГЛЯДИТ КЛАССНО hands , только непонятно. Какую
Цитата
В файле Excel макросом производим предварительную пакетную обработку
? КАК
Цитата
инсертим в базу пакетами
? Здесь весь вопрос какую обработку может тянуть Excel? И какую обработку делаем в базе (какие текстовые функции может использовать язык базы......)? girl_sad girl_sad

Автор - SvetaS
Дата добавления - 15.09.2015 в 07:00
SvetaS Дата: Вторник, 15.09.2015, 07:04 | Сообщение № 19
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
wild_pig, ставь Excel 64 разрядный, он ест все 8 ГБ. У меня стоит
Цитата
Win 7 64-х, Excel 2016 64-х , памяти 8 ГБ.
 
Ответить
Сообщениеwild_pig, ставь Excel 64 разрядный, он ест все 8 ГБ. У меня стоит
Цитата
Win 7 64-х, Excel 2016 64-х , памяти 8 ГБ.

Автор - SvetaS
Дата добавления - 15.09.2015 в 07:04
SLAVICK Дата: Четверг, 17.09.2015, 00:59 | Сообщение № 20
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Вот решение по 1-му пункту:
сделано так:
Повторение всех столбцов на количество ; в 16-м столбце, и запись результата в CSV
Быстрый просчет к-ва строк в итоговом CSV- отсюда
Загрузка данных в массив
Выгрузка массива на лист


Проверьте на реальных данных.
У меня 100 000 отработало за пару минут. :D
Последние два пункта - при большом количестве строк могут быть недоступны - у меня из 100 000 стало 1,2млн, поэтому я бы делал подключение к CSV, поскольку у Вас 2013-й офис - Вам это трудности не составит.

По поводу добавления информации из др. пунктов
Предлагаю использовать возможности PowerPivot - будет удобнее, и практичнее. :)

Если вы имеете в виду брать файлы меньшего размера и делить сами файлы- то это исключенно изначально, так как иначе сводная не получится........

здесь не согласен у меня в примере идет дозапись данных в CSV файл - в конец файла, т.е. если обработать например 30 файлов отдельно с такой дозаписью - потом не составит труда составить сводную на основе такого CSV файла ;)
К сообщению приложен файл: 7050606-1-2015-.xlsm (24.6 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Четверг, 17.09.2015, 10:10
 
Ответить
СообщениеВот решение по 1-му пункту:
сделано так:
Повторение всех столбцов на количество ; в 16-м столбце, и запись результата в CSV
Быстрый просчет к-ва строк в итоговом CSV- отсюда
Загрузка данных в массив
Выгрузка массива на лист


Проверьте на реальных данных.
У меня 100 000 отработало за пару минут. :D
Последние два пункта - при большом количестве строк могут быть недоступны - у меня из 100 000 стало 1,2млн, поэтому я бы делал подключение к CSV, поскольку у Вас 2013-й офис - Вам это трудности не составит.

По поводу добавления информации из др. пунктов
Предлагаю использовать возможности PowerPivot - будет удобнее, и практичнее. :)

Если вы имеете в виду брать файлы меньшего размера и делить сами файлы- то это исключенно изначально, так как иначе сводная не получится........

здесь не согласен у меня в примере идет дозапись данных в CSV файл - в конец файла, т.е. если обработать например 30 файлов отдельно с такой дозаписью - потом не составит труда составить сводную на основе такого CSV файла ;)

Автор - SLAVICK
Дата добавления - 17.09.2015 в 00:59
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Загрузить данные в массив 300 000 строк (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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