Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
ошибка при копировании диапазона в массив
 
Доброго времени суток!
Подскажите быстрый способ копирования диапазона в массив. Я всегда использовала:
Dim ar As Variant
ar = Range(Cells(1,1), Cells(1000, 10))
Но сегодня столкнулась с проблемой, большой диапазон (строк 560к, столбцов 90к) нельзя скопировать таким образок, выдает ошибку - приложила. При ограничении размера массива, всё работает хорошо...
Заранее спасибо

PS: файл макроса не могу забрать с работы
пп.jpg (20.66 КБ)
Изменено: kate14 - 2 Мар 2015 22:42:01
 
Нехватка памяти. Копируйте по частям.
 
Код
ar = Range(Cells(1,1), Cells(1000, 10)).value
 
Исправил)) Так сначала движок сделал.
 
vikttur, я уже тоже думала.. Но из-за того, что мне нужно обрабатывать весь массив по определенным условиям и выводить только "отсортированные" данные, я передумала.  
 
Да не такой уж и большой объем - памяти должно хватать. А как Вы объявляете массив (ar)?
 
Юрий М,
Код
Dim ar As Variant
 
Код
Sub Test()
Dim ar()
    ar = Range(Cells(1, 1), Cells(1000, 10)).Value
End Sub

 
Юрий М, та же ошибка.. На тестовом массиве попробовала
 
У меня при 4ГБ ОЗУ ошибки нет.
 
vikttur, я вот думаю, если копировать частями, как потом объединять и работать с этими массивами?
Юрий М, у меня и дома и на работе по 2..
 
Ну в коде у Вас 30 столбцов вместо 10, про которые писали, как пример. А чему равна переменная последней строки?
 
Юрий М, в коде я тестировала, вручную число столбцов вносила. Он без ошибки скопировал только 10 (а в массиве их 90), ILastrowOrg = 556000

Я так поняла надо сделать так:
Код
ar = Range(Cells(1, 1), Cells(ILastrowOrg, 10)).Value    
ar2 = Range(Cells(1, 10), Cells(5ILastrowOrg, 20)).Value
ar2 = Range(Cells(1, 20), Cells(5ILastrowOrg, 30)).Value
Но потом работать будет жутко неудобно.. Но попробую
 
556000 строк и 90 столбцов - конечно многовато))
 
Цитата
kate14 написал: Но потом работать будет жутко неудобно
Так действительно будет неудобно. Оставьте число столбцов неизменным (90), а разбивайте только по строкам.
 
А так работает?
Код
Sub Test()
Dim arr(1 To 556000, 1 To 90)
End Sub
 
Так и у меня не работает ))
 
Юрий М, может при копировании как-то скопировать только те столбцы которые участвуют в расчете. Что-то типа:
Код
ar = Range(Cells(1, 1), Cells(1, ILastColOrg)).Value 'копируем шапку с названием строк
'находим первый нужный столбец
For i to ILastColOrg
   if ar(1,i)="Название нужного столбца"
      n1=i 'запомнили номер
   End IF
Next
For i to ILastColOrg
   if ar(1,i)="Название нужного столбца2"
      n21=i 'запомнили номер
   End IF
Next
'и потом раз 15 скопировать нужные данные
ar = Range(Cells(1, 1), Cells(n1, ILastColOrg)).Value
ar = Range(Cells(1, 1), Cells(n2, ILastColOrg)).Value
Больше в голову ничего не приходит.. Будет страшненько, но без ошибок
 
Юрий М, завтра попробую по строкам разбить.. Спасибо :)
 
kate14, 556000 строк X 90 столбцов = 50'040'000 элементов типа Variant = 800'640'000 байт. Если в ячейках текстовые значения (строки), то еще добавляются сами строки.
Сколько доступной оперативной памяти на машине до запуска макроса показывает диспетчер задач?
Какие данные в ячейках?
Если, например, там целые числа, и при работе не появится дробных, то можно объявить массив
Код
Dim arr(1 To 556000, 1 To 90) As Long 
и заполнить его по частям. Он займет в 4 раза меньше памяти, и вычисления будут существенно быстрее.
 
Казанский, там не только числа, там текст и числа (в основном текст). Я не смотрела сколько памяти доступно, но я все другие программы закрываю..
 
Юрий М, я имел ввиду ошибку :)
Если в столбцах данные одного типа, можно объявить несколько массивов (нужного типа) и заполнить их в цикле
 
Кстати сталкивался с таким - в ячейке с форматом даты было забито что-то непотребное (что именно не помню, но не дата) - в итоге массив не создавался, но какая именно была ошибка сейчас не помню.
 
Игорь, ошибка совместимости типов должна была быть.
Недавно в очередной раз столкнулся с той же проблемой. При этом, т.к. был не один массив - прям такой ошибки не было, однако выползали иные ошибки(например невозможно было на каком-то этапе создать новый объект словаря), но причина была именно в нехватке памяти. Пришлось для верности разбить на части по 2000 строк и 20 столбцов(там предел был 20 столбцов). Цикл был с шагом в 2000 и каждый раз потом обрабатывался массив в памяти из 2000х20 элементов.
Т.к. задача была создать массив уникальных - это имело смысл, т.к. в результате получался куда меньший массив данных.
Еще одна фишка: в 2007 Excel массив может быть создан в памяти, но не выгрузится полностью на лист. В 2010 такого не встречал, а вот 2007 подколол.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Читают тему (гостей: 1)