Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2015, 13:36   #11
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
В примере Казанского думаю будет ошибка, если код будет в модуле листа одной версии, а Worksheets("Выгрузка") будет другой версии
Согласен. Если Worksheets("Выгрузка") будет в книге .xls, в то время как сам код со строкой
Код:
lLastRow = .Cells(Rows.Count, 1).End(xlUp).Row
будет в модуле листа/книги файла .xlsm или иного файла старшего формата - ошибка.
Т.к. Rows является диапазоном, а диапазон без явного указания родительского объекта будет сопоставлен и отнесен к тому объекту, в котором код, то будет следующее:
Rows.Count = 1048576
И .Cells листа .xls просто не пример значение 1048576 и выдаст ошибку.
Но в данном случае, полагаю, этого не будет. Но я лично по привычке часто ставлю точку перед Rows(если использую ссылку With). Не ставлю только если 100% уверен в невозможности описанной выше ситуации.

Кстати, ситуация обратная(код в модуле листа .xls, а активен лист .xlsm) - это еще более критичная ошибка. Т.к. ошибку VBE не получим, но если строк больше 65536 - то последняя строка будет определена неверно...Что повлечет ошибки внутри логики кода - данные будут обработаны не все.
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 16.03.2015, 13:51   #12
27102014
Форумчанин
 
Регистрация: 27.10.2014
Сообщений: 248
По умолчанию

Код от Казанского отработал на отлично! Огромное спасибо!!!
В моем случае объем исходной таблицы никогда не будет более 5000 строк.
Макрос запускается из .xlsb и формирует два документа .xls., которые по окончании работы макроса вкладываются в письмо Outlook
Подумал, что формат исходной таблицы слишком много весит и добавил код на преобразования текста в число
Время на работу макроса сократилось до 1 минуты
В итоге получилось следующее

[Sheets("Выгрузка").Select
'преобразование текста в число
For u = 1 To 12
Columns(u).Select
Selection.TextToColumns Destination:=Cells(1, u), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True
Next



' очистка листов
For i = 3 To ThisWorkbook.Sheets.Count
Sheets(i).Select
Rows("1:1").AutoFilter 'снятие фильтра
Cells.Clear 'очищение
Next


' Копирование данных
With Worksheets("Выгрузка")
lLastRow = .Cells(Rows.Count, 1).End(xlUp).Row '
Set r = .Range(.Cells(1, 1), .Cells(lLastRow, 25))
End With
' вставка на листы
For i = 3 To ThisWorkbook.Sheets.Count
r.Copy ThisWorkbook.Sheets(i).Range("A1")
Next][/CODE]
27102014 вне форума Ответить с цитированием
Старый 16.03.2015, 14:05   #13
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Hugo121, The_Prist,
да, упустил точку, уже исправил.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 16.03.2015, 14:56   #14
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Цитата:
Сообщение от 27102014 Посмотреть сообщение
' очистка листов
Наверно, быстрее будет удалить листы и создать снова, с теми же именами:
Код:
Dim n
n = ThisWorkbook.Sheets.Count
ReDim shNames(3 To n)
For n = 3 To UBound(shNames)
  shNames(n) = ThisWorkbook.Sheets(n).Name
Next
Application.DisplayAlerts = False
Sheets(shNames).Delete
Application.DisplayAlerts = True
Sheets.Add after:=Sheets(2), Count:=n - 3
For n = 3 To UBound(shNames)
  Sheets(n).Name = shNames(n)
Next
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 16.03.2015, 15:15   #15
27102014
Форумчанин
 
Регистрация: 27.10.2014
Сообщений: 248
По умолчанию

Уважаемый Казанский, еще раз огромное Вам спасибо за код по копированию данных, реально выручили!

По поводу очистки листов - быстрее работает с моим кодом - 34 с, если удалять листы, как предложили Вы, то 1 мин 6 с.
27102014 вне форума Ответить с цитированием
Старый 25.03.2015, 19:54   #16
timpust
Новичок
Джуниор
 
Регистрация: 25.03.2015
Сообщений: 1
По умолчанию Использование памяти Excel

Прочитайте про причины переполнения оперативной памяти в Excel

http://www.timpust.ru/vba/memory/

Excel имеет следующие ограничения по оперативной памяти:
Для 64-разрядной версии Excel 2010 не действует ограничение в 2 Gb
Microsoft Excel 2007 2Gb
Microsoft Excel 2003 1Gb
Microsoft Excel 2002 128Mb
Microsoft Excel 2000 64Mb

Лекарство:
в конце кода чистим переменные из памяти
tmpDim = Empty 'Опустошаем переменную
Erase tmpArr 'Стираем массив
Set tmpObject = Nothing 'Стираем объект
timpust вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку ну или недостаток в программе Литвачок Visual C++ 0 07.11.2013 20:51
Видюха 6600gt и недостаток ее питания BlackOff_Max Компьютерное железо 11 27.02.2012 12:25
Недостаток в "Расчет средней оценки" roxy7 Microsoft Office Excel 3 12.12.2011 13:21
Кольцевая очередь на массиве в статической памяти с элементами в динамической памяти ]tach[ Общие вопросы C/C++ 1 19.01.2011 13:16
Недостаток информации Квэнди Свободное общение 1 03.04.2007 16:23