Отключить мерцание vba excel
Форумы CADUser → Программирование → VBA → Как избавиться от мерцания экрана при считывание информации из Excel-файла?
Тема: Как избавиться от мерцания экрана при считывание информации из Excel-файла?
Помогите решить проблему:
-есть много .XLS файлов с которых надо взять информацию
При открытии-взятие информации -закрытии происходит мерцание экрана
как сделать, чтобы инф-ия бралась для VBA без активизации книги из которой, она берется
В экселе есть свойство ScreenUpdating (true или false) Как запускать из автокада - не знаю, никогда не занимался. Посмотрите в этом направлении.
> km2005
для чего же тогда окно екселя отображать, если смотреть на него не надо ?
Sidor, ogromennoe spasibo nastavil na put' istinnyi
> km2005
Воспользуйся ADODB.Connection
Через Microsoft.Jet.OLEDB.4.0
Все будет нормально читаться, а эксель вообще не будет загружаться.
Если интересно, могу выложить код на лиспе.
Хочу добавить, что этот способ работает, даже если на компьютере вообще не установлен эксель!
> Евгений Елпанов
Ну заинтриговал, конечно всем интересно!
~'J'~
этот способ работает, даже если на компьютере вообще не установлен эксель!
Это, видимо, будет работать, только если из Excel считывается информация представленная в табличном (типа таблиц Access) виде. А иногда приходится считывать и не собранные в упорядоченную таблицу данные. Например, из объединеных ячеек.
Кроме этого, на компьютере должны присутствовать файлы для работы с базами данных. Эти файлы, по моему, как раз и устанавливаются при установке Офиса (в общем случае).
Все это сказано не в противовес, а только лишь для полноты картины.
> brigval
Эти файлы устанавливаются вместе с виндой.
Придется вам подождать окончания праздников.
Посмотрел дома - нет этой программы, только аналог для Акссеса, но я его уже выкладывал на этом форуме. Придется подождать до десятого мая.
Если кто-то разрабатывал программы доступа к базам данных через ADODB.Connection - то можно их адаптировать для чтения из экселя, единственно, советую выбрать драйвер
Microsoft.Jet.OLEDB.4.0
Т.к. он позволяет считывать первую строку таблицы как данные, а другие драйверы ее считают строкой заголовков столбцов.
По поводу представления данных и в правду есть некоторые проблемы, например, по умолчанию при запросе к базе данных (SQL) считается, что во всей колонке данные одинаковых типов, т.е. все цифры или строки. Есть возможность отображать эти колонки целиком как текст. Я поступаю по другому - создаю отдельный запрос для каждой строки, тогда в каждой ячейке могут быть разные типы данных.
Эти файлы устанавливаются вместе с виндой.
Почему-то не всегда :(
В интернете есть обновление от Microsoft для работы с базами данных. Файл Mdac_typ.exe (ок. 5 МБ). Если его установить, то снимаются все проблемы доступа к БД. Проверено на NT4, W98 и т.д.
Один недостаток записанных макросов в Excel заключается в том, что созданный код зачастую является очень неэффективным. Это значит, что макрос, который должен выполняться за секунды, часто работает слишком долго и выглядит непривлекательно. Кроме того, когда вы создаете макрос в режиме записи, записываются все нажатые клавиши, нужны они были или нет. Это означает, что, если вы сделаете ошибку, а потом исправите ее, нажатые для этого клавиши также будут записаны в коде макроса. Подобными функциями обладает специальное программное обеспечение для создания веб-проектов. Достаточно купить битрикс и заказать услуги специалистов по настройке и вы получите все перечисленные функции. В битрикс существует также импорт файлов Excel.
Если вы уже работали с макросами и интересовались кодом VBA, то, вероятно, слышали о свойстве Application.ScreenUpdating. Присвоив ему значение Ложь (False) в начале выполнения макроса, вы не только прекратите постоянное мерцание экрана монитора, происходящее из-за того, что макрос был записан, а не запрограммирован в VBE, но и ускорите выполнение макроса. Причина, почему этот способ ускоряет работу макроса, заключается в том, что Excel более не нужно перерисовывать экран при выполнении таких команд, как Select, Activate, LargeScroll, SmallScroll и многих других.
Чтобы включить строку Application.ScreenUpdating = False в начало существующего макроса, выберите команду Разработчикс → Макросы (Developer → Macros), выберите макрос, щелкните кнопку Изменить (Edit) и введите следующий код, показанный в листинге 7.1.
// Листинг 7.1 Application.ScreenUpdating = False //Ваш код Application.ScreenUpdating = True End Sub
Обратите внимание, что в конце кода вы заново включили обновление, присвоив свойству Application.ScreenUpdating значение Истина (True). Хотя Excel сделает это, когда фокус управления будет передан обратно Excel (другими словами, когда работа макроса завершится), лучше все же позаботиться о безопасности программы и включить этот код в конце макроса.
Иногда можно обнаружить, что свойству Application.ScreenUpdating присваивается значение Истина (True) еще до завершения записанного макроса. Это может произойти с записанными макросами, в которых часто используется команда Select. Если это произошло, нужно просто повторить строку Application.ScreenUpdating = False в других фрагментах кода вашего макроса.
- Если в коде есть много всяких Activate и Select , тем более в циклах - следует немедленно от них избавиться. Как это сделать я писал в статье: Select и Activate - зачем нужны и нужны ли?
- Обязательно на время выполнения кода отключить:
- автоматический пересчет формул . Чтобы формулы не пересчитывались при каждой манипуляции на листе во время выполнения кода - это может дико тормозить код, если формул много:
Если во время кода все же нужно пересчитывать какие-то диапазоны, то можно пересчитывать только их:
Главное, что следует помнить - все эти свойства необходимо включить обратно после работы кода . Иначе могут быть проблемы с работой внутри Excel. Например, если забыть включить автопересчет формул - большинство формул будут пересчитывать исключительно принудительным методом - после нажатия сочетания клавиш Shift + F9 . А если забыть отключить обновление экрана - то есть шанс заблокировать себе возможность работы на листах и книгах. Хотя по умолчанию свойство ScreenUpdating и должно возвращаться в True, если было отключено внутри процедуры - лучше не надеяться на это и привыкать возвращать все свойства на свои места принудительно. По сути все это сведется к нескольким строкам:
'Возвращаем обновление экрана Application.ScreenUpdating = True 'Возвращаем автопересчет формул Application.Calculation = xlCalculationAutomatic 'Включаем отслеживание событий Application.EnableEvents = True
Как такой код выглядит на практике. Предположим, надо записать в цикле в 10 000 строк значения:
Sub TestOptimize() 'отключаем обновление экрана Application.ScreenUpdating = False 'Отключаем автопересчет формул Application.Calculation = xlCalculationManual 'Отключаем отслеживание событий Application.EnableEvents = False 'Отключаем разбиение на печатные страницы ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False 'Непосредственно код заполнения ячеек Dim lr As Long For lr = 1 To 10000 Cells(lr, 1).Value = lr 'для примера просто пронумеруем строки Next 'Возвращаем обновление экрана Application.ScreenUpdating = True 'Возвращаем автопересчет формул Application.Calculation = xlCalculationAutomatic 'Включаем отслеживание событий Application.EnableEvents = True End Sub
Для более опытных пользователей VBA я приведу несколько решений по оптимизации кодов в различных ситуациях:
-
Самая хорошая оптимизация кода, если приходится работать с ячейками листа напрямую, обрабатывать их и, возможно, изменять значения, то быстрее все обработки делать в массиве и разом выгружать на листе. Например, код выше по заполнению ячеек номерами будет в этом случае выглядеть так:
Sub TestOptimize_Array() 'Непосредственно код заполнения ячеек Dim arr, lr As Long 'запоминаем в массив одним махом все значения 10000 строк первого столбца arr = Cells(1, 1).Resize(10000).Value 'если нужно заполнение для двух и более столбцов 'arr = Cells(1, 1).Resize(10000, 2).Value 'или 'arr = Range(Cells(1, 1),Cells(10000, 2)).Value 'или автоматически вычисляем последнюю ячейку и заносим в массив данные, начиная с ячейки А3 'llastr = Cells(Rows.Count, 1).End(xlUp).Row 'последняя ячейка столбца А 'arr = Range(Cells(3, 1),Cells(llastr, 2)).Value For lr = 1 To 10000 arr(lr,1) = lr 'заполняем массив порядковыми номерами Next 'Выгружаем обработанный массив обратно на лист в те же ячейки Cells(1, 1).Resize(10000).Value = arr End Sub
Я сделал макрос для копирования определенных данных из книги отчетов и вставки их в итоговую книгу. Функционально макрос работает отлично, но я вижу эффект «мерцания», когда данные перемещаются между книгами. Я пробовал несколько уловок для его устранения (см. Код), но он все равно мерцает! Есть предложения о том, как его устранить или что может быть причиной?
Я сослался на этот похожий вопрос, но в моем случае это не сработало.
Вот немного сокращенная версия моего кода. Думаю, я включил все разделы, которые могут быть связаны с этой проблемой, но дайте мне знать, если что-то не имеет смысла.
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Ответы 1
Операторы With с двойной вложенностью не нужны. Вы можете использовать только 1 оператор With. End With за раз (ну, на самом деле вы можете квалифицировать для нового оператора With , используя предыдущий оператор with, но в данном случае вы этого не делаете). В любом случае, это не твоя проблема.
Попробуйте посмотреть, сработает ли отказ от копирования / вставки для того, что вам нужно.
с этой единственной строкой кода:
По крайней мере, я уверен, что ваш код будет работать намного быстрее.
Также не уверен, используете ли вы .Activate или .Select . Если да, то не надо.
Отлично, спасибо! Устранение копирования и вставки действительно устранило мерцание в этом фрагменте кода. Однако теперь мне нужно будет найти способ обойтись без копирования объектов диаграмм из отчетов и вставки их в виде изображений в итоговую книгу. Но я думаю, что открою новый вопрос по этому поводу. Спасибо еще раз.
Форумы CADUser → Программирование → VBA → Как избавиться от мерцания экрана при считывание информации из Excel-файла?
Тема: Как избавиться от мерцания экрана при считывание информации из Excel-файла?
Помогите решить проблему:
-есть много .XLS файлов с которых надо взять информацию
При открытии-взятие информации -закрытии происходит мерцание экрана
как сделать, чтобы инф-ия бралась для VBA без активизации книги из которой, она берется
В экселе есть свойство ScreenUpdating (true или false) Как запускать из автокада - не знаю, никогда не занимался. Посмотрите в этом направлении.
> km2005
для чего же тогда окно екселя отображать, если смотреть на него не надо ?
Sidor, ogromennoe spasibo nastavil na put' istinnyi
> km2005
Воспользуйся ADODB.Connection
Через Microsoft.Jet.OLEDB.4.0
Все будет нормально читаться, а эксель вообще не будет загружаться.
Если интересно, могу выложить код на лиспе.
Хочу добавить, что этот способ работает, даже если на компьютере вообще не установлен эксель!
> Евгений Елпанов
Ну заинтриговал, конечно всем интересно!
~'J'~
этот способ работает, даже если на компьютере вообще не установлен эксель!
Это, видимо, будет работать, только если из Excel считывается информация представленная в табличном (типа таблиц Access) виде. А иногда приходится считывать и не собранные в упорядоченную таблицу данные. Например, из объединеных ячеек.
Кроме этого, на компьютере должны присутствовать файлы для работы с базами данных. Эти файлы, по моему, как раз и устанавливаются при установке Офиса (в общем случае).
Все это сказано не в противовес, а только лишь для полноты картины.
> brigval
Эти файлы устанавливаются вместе с виндой.
Придется вам подождать окончания праздников.
Посмотрел дома - нет этой программы, только аналог для Акссеса, но я его уже выкладывал на этом форуме. Придется подождать до десятого мая.
Если кто-то разрабатывал программы доступа к базам данных через ADODB.Connection - то можно их адаптировать для чтения из экселя, единственно, советую выбрать драйвер
Microsoft.Jet.OLEDB.4.0
Т.к. он позволяет считывать первую строку таблицы как данные, а другие драйверы ее считают строкой заголовков столбцов.
По поводу представления данных и в правду есть некоторые проблемы, например, по умолчанию при запросе к базе данных (SQL) считается, что во всей колонке данные одинаковых типов, т.е. все цифры или строки. Есть возможность отображать эти колонки целиком как текст. Я поступаю по другому - создаю отдельный запрос для каждой строки, тогда в каждой ячейке могут быть разные типы данных.
Эти файлы устанавливаются вместе с виндой.
Почему-то не всегда :(
В интернете есть обновление от Microsoft для работы с базами данных. Файл Mdac_typ.exe (ок. 5 МБ). Если его установить, то снимаются все проблемы доступа к БД. Проверено на NT4, W98 и т.д.
Читайте также: