Remkomplekty.ru

IT Новости из мира ПК
9 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba excel отключить обновление экрана

Принудительное обновление экрана в Excel VBA

мой инструмент Excel выполняет длинную задачу, и я пытаюсь быть добрым к пользователю, предоставляя отчет о ходе работы в строке состояния или в некоторой ячейке на листе, как показано ниже. Но экран не обновляется или перестает обновляться в какой-то момент (например, 33%). Задача в конечном итоге завершается, но индикатор выполнения бесполезен.

что я могу сделать, чтобы принудительно обновить экран?

Я использую Excel 2003.

6 ответов

добавить функция doevents функция внутри цикла, см. ниже.

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

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

поскольку в Excel нет команды для обновления листа таким образом, пользовательская форма может быть обновлена, это необходимо чтобы использовать трюк, чтобы заставить Excel обновить экран.

следующие команды, кажется, сделать трюк:

вызовите DoEvents в петле.

это повлияет на производительность, поэтому вы можете вызвать его только на каждой, скажем, 10-й итерации.
Однако, если у вас есть только 30, это не проблема.

это не прямой ответ на ваш вопрос вообще, а просто предоставление альтернативы. Я нашел во многих длинных вычислениях Excel большую часть времени ожидания имеет значения обновления Excel на экране. Если это так, вы можете вставить следующий код в передней части вашего субпартнера:

и положить этому конец

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

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

пользовательская форма не будет обновляться в некоторых случаях, потому что функция doevents будет стрелять события; однако,перекрашивать обновит пользовательскую форму, и пользователь увидит изменения на экране, даже если другое событие сразу же следует за предыдущим событием.

в коде UserForm это так же просто, как:

написать DoEvents непосредственно перед строкой, в которой вы обновляете пользовательский интерфейс, он должен работать.

Как ускорить и оптимизировать код VBA

  1. Если в коде есть много всяких Activate и Select , тем более в циклах — следует немедленно от них избавиться. Как это сделать я писал в статье: Select и Activate — зачем нужны и нужны ли?
  2. Обязательно на время выполнения кода отключить:
    • автоматический пересчет формул . Чтобы формулы не пересчитывались при каждой манипуляции на листе во время выполнения кода — это может дико тормозить код, если формул много:

если печать производится внутри кода, то эту строку желательно вставить сразу после строки, выводящей лист на печать(при условии, что печать не происходит в цикле. В этом случае — по завершению цикла печати).
Я советую всегда отключать разбиение на страницы, т.к. это может тормозить весьма значительно, т.к. заставляет при любом изменении на листах обращаться к принтеру и переопределять кол-во и размер печатных страниц. А это порой очень не быстро.
На всякий случай можно отключить отображение информации в строке статуса Excel (в каких случаях там вообще отображается информация и зачем можно узнать в статье: Отобразить процесс выполнения). Хоть это и не сильно поедает ресурсы — иногда может все же ускорить работу кода:

Главное, что следует помнить — все эти свойства необходимо включить обратно после работы кода . Иначе могут быть проблемы с работой внутри 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

Разрывы печатных страниц можно не возвращать — они тормозят работу в любом случае.
Следует избегать циклов, вроде Do While для поиска последней ячейки . Часто такую ошибку совершают начинающие. Куда эффективнее и быстрее вычислять последнюю ячейку на всем листе или в конкретном столбце без этого тормозного цикла Do While. Я обычно использую

другие варианты определения последней ячейки я детально описывал в статье: Как определить последнюю ячейку на листе через VBA?

Для более опытных пользователей 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

Но здесь следует учитывать и тот момент, что большие массивы могут просто вызвать переполнение памяти. Наиболее актуально это для 32-битных систем, где на VBA и Excel выделяется памяти меньше, чем в 64-битных системах

  • Если используете быстрый ЕСЛИ — IIF , то замените его на IF . Then . Else
  • Так же лучше вместо Switch() и Choose() применить тот же IF . Then . Else
  • В большинстве случаев проверять строку на «не пусто» лучше через Len() , чем прямое сравнение с пустотой: Len(s)=0 вместо s = «» . Связано с тем, что работа со строками значительно медленнее, чем с числовыми данными и Len по сути не подсчитывает длину переменной, а берет это число непосредственно уже готовое из памяти. При сравнении же текста с пустой строкой(«»), VBA сначала создает в памяти переменную нулевой длинны, а уже потом сравнивает с ней наш текст. Поэтому в некоторых случаях так же ускоряет сравнение и в таком виде: s = vbNullString
  • Не применять объединение строк без необходимости. Например, s = «АВ» , будет быстрее, чем: s =»А» & «В»
  • Не применять сравнение текстовых величин напрямую. Лучше применить встроенную функцию StrComp:
    If s <> s1 Then будет медленнее, чем
    If StrComp(s, s1, vbBinaryCompare) = 0
    и тем более, если при сравнении необходимо не учитывать регистр:
    If LCase(s) <> LCase(s1) Then будет медленнее, чем
    If StrComp(s, s1, vbTextCompare) = 0
  • Циклы For … Next в большинстве случаев работает быстрее, чем цикл Do . Lоор
  • Избегать присвоения переменным типа Variant . Хоть соблазн и велик — этот тип забирает много памяти и в дальнейшем замедляет работу кода. Так же для объектных переменных следует избегать по возможности безликого глобального типа Object и применять конкретный тип:

    ScreenUpdating — обновление экрана

    Позволяет включать (присвоением свойству True) и отключать (присвоением False) обновление экрана. Имеет смысл отключить обновление экрана перед теми частями программы, которые интенсивно пользуются данными на листе. Благодаря тому, что системные ресурсы не будут тратиться на обновление экрана, программа будет работать быстрее. Этот метод весьма актуален, так как MS Excel часто используют для проведения ресурсоемких расчетов.

    Практика показывает, что если программа интенсивно использует вывод на экран в процессе работы, если она изменяет данные, которые участвуют в расчете формул, расположенных на листе, то отключение вывода может ускорить работу в 3-10 раз.

    Например, ниже приведен код, который два раза повторяет процедуру 100-кратного вывода на экран 400 целых случайных чисел и выводит время, требующееся для выполнения этих действий с обновлением экрана и без него.

    ‘Массив для значений времени

    ‘Время начала теста

    ‘Время окончания теста

    ‘Во втором проходе цикла

    ‘Запишем текущее время

    ‘Перейдем на лист для теста

    ‘Выведем 100 раз целые случайные

    ‘числа в область 20х20

    For y = 1 To 100

    ActiveSheet.Cells(p, j) = _

    ‘Запишем время окончания

    ‘Для корректного представления

    (StopTime — StartTime) * 24 * 60 * 60

    MsgBox «Время выполнения программы.» & Chr(13) + _

    «При включенном обновлении: » & _

    WorkTime(1) & » сек.» & Chr(13) & _

    «При выключенном обновлении: » & _

    Selection — ссылка на выделенный объект

    Это очень важное свойство возвращает ссылку на выделенный объект. Чаще всего это — ячейка или группа ячеек. Например, это свойство удобно использовать при работе с выделенным диапазоном ячеек (или отдельной выделенной ячейкой). Ниже мы коснемся его подробнее.

    WorksheetFunction — формулы Excel в коде VBA

    Возвращает объект WorksheetFunction, методы которого представляют собой формулы Excel, которые можно использовать в коде VBA. Использование этого свойства позволяет облегчить выполнение сложных расчетов.

    События Application

    Объект Excel.Application поддерживает множество событий. Работа с ними аналогична работе с событиями Word.Application, которыми мы занимались в соответствующем разделе предыдущей главы.

    Рассмотрим основные шаги, которые необходимо произвести, чтобы работать с событиями приложения, перечислим события и приведем пример.

    Создайте новый модуль класса. Добавьте в него объявление объекта типа Excel.Application с событиями

    Public WithEvents obj_ExApp As Excel.Application

    После этого в списке объектов редактора кода модуля появится объект obj_ExApp, а в списке событий — соответствующие ему события. Выберите нужное вам событие — автоматически будет создан обработчик для него. В частности, Excel.Application поддерживает следующие события:

    • NewWorkbook — происходит при создании новой книги
    • SheetActivate — при активации любого листа
    • SheetBeforeDoubleClick — происходит при двойном щелчке по листу, то есть позволяет перехватить щелчок и выполнить собственную процедуру до того, как будет выполнено стандартное действие.
    • SheetBeforeRightClick — позволяет перехватить нажатие правой кнопки мыши по листу.
    • SheetCalculate — после пересчета листа или после изменения данных, которые отображаются на диаграмме.
    • SheetChange — при изменении содержимого ячеек на любом листе.
    • SheetFollowHyperlink — происходит при переходе по гиперссылке, которая может быть включена в лист Microsoft Excel.
    • SheetSelectionChange — при изменении выделения на листе
    • WindowActivate — при активации окна книги.
    • WindowDeactivate — при деактивации окна книги.
    • WindowResize — при изменении размера окна книги.
    • WorkbookActivate — при активации книги.
    • WorkbookBeforeClose — перед закрытием книги.
    • WorkbookBeforePrint — перед печатью книги.
    • WorkbookBeforeSave — перед сохранением книги.
    • WorkbookDeactivate — при деактивации книги.
    • WorkbookNewSheet — при добавлении нового листа в любую из открытых книг.
    • WorkbookOpen — при открытии книги.

    После того, как создан обработчик, написан его код, работа еще не окончена. Следующий шаг — это связывание объекта obj_ExApp с реально работающим приложением. Ниже приведен полный код модуля с одним обработчиком события, а также — процедура, служащая для связывания объекта obj_ExApp с работающим приложением. Эта процедура может существовать в виде отдельного макроса или в виде кода обработчика нажатия на кнопку. Ее выполнение можно назначить событию открывающейся книги, которая содержит данный модуль класса и т.д.

    Итак, вот код процедуры, который связывает объект созданного нами класса AppEvents с приложением:

    Dim obj_ExcelAppEv As New AppEvents

    Set obj_ExcelAppEv.obj_ExApp = Excel.Application

    А вот полный код модуля класса AppEvents с объявлением объектной переменной и обработчиком события.

    Public WithEvents obj_ExApp As Excel.Application

    Private Sub obj_ExApp_NewWorkbook(ByVal Wb As Workbook)

    How to dou

    Простые хитрости 1 Формат числа

    Table of Contents:

    VBA для Excel 2016 работает быстро, но это не всегда достаточно быстро. (Компьютерные программы никогда не бывают достаточно быстрыми.) Продолжайте читать, чтобы открыть некоторые примеры программирования, которые вы можете использовать для ускорения макросов.

    Отключение обновления экрана

    При выполнении макроса вы можете сидеть сложа руки и смотреть все экранные действия, которые происходят в макросе. Хотя делать это можно поучительно, после того, как макрос работает правильно, он часто раздражает и может значительно замедлить работу вашего макроса. К счастью, вы можете отключить обновление экрана, которое обычно происходит при выполнении макроса. Чтобы отключить обновление экрана, используйте следующий оператор:

    Если вы хотите, чтобы пользователь увидел, что происходит в любой момент макроса, используйте следующий оператор, чтобы включить обновление экрана:

    Чтобы продемонстрировать разницу в скорости, выполните этот простой макрос, который заполняет диапазон цифрами:

    Вы видите каждую выбранную ячейку и значение, вводимое в ячейки. Теперь вставьте следующую инструкцию в начале процедуры и выполните ее снова:

    Диапазон заполняется намного быстрее, и вы не видите результат до тех пор, пока макрос не будет завершен, и обновление экрана (автоматически) будет установлено на True.

    Когда вы отлаживаете код, выполнение программы иногда заканчивается где-то посередине, если вы не включили обновление экрана. Это иногда приводит к тому, что окно приложения Excel становится полностью невосприимчивым. Выход из этого замороженного состояния прост: вернитесь к VBE и выполните следующее заявление в окне Immediate:

    Отключение автоматического вычисления

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

    Следующий оператор устанавливает режим вычисления Excel в руководство:

    Выполните следующий оператор, чтобы настроить режим расчета на автоматический:

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

    Устранение этих надвидных сообщений оповещения

    Как вы знаете, макрос может автоматически выполнять ряд действий. Во многих случаях вы можете запустить макрос, а затем потусоваться в комнате перерыва, в то время как Excel делает свое дело. Однако в некоторых операциях Excel отображаются сообщения, требующие ответа человека. Эти типы сообщений означают, что вы не можете оставить Excel без присмотра, пока он выполняет ваш макрос, — если вы не знаете секретный трюк.

    Вы можете указать Excel не отображать эти типы предупреждений при запуске макроса.

    Секретный трюк, чтобы избежать этих предупреждающих сообщений, вставляет в ваш макрос следующий оператор VBA:

    Excel выполняет операцию по умолчанию для этих типов сообщений. В случае удаления листа по умолчанию используется «Удалить». Если вы не знаете, что такое операция по умолчанию, выполните тест, чтобы узнать, что произойдет.

    Когда процедура завершится, Excel автоматически сбрасывает свойство DisplayAlerts в значение True. Если вам нужно снова включить предупреждения, прежде чем процедура закончится, используйте это заявление:

    Упрощение ссылок на объекты

    Как вы, наверное, уже знаете, ссылки на объекты могут стать очень длинными. Например, полная ссылка на объект Range может выглядеть следующим образом:

    Если ваш макрос часто использует этот диапазон, вам может понадобиться создать объектную переменную с помощью команды Set. Например, следующий оператор присваивает этому объекту Range объектной переменной Rate:

    После определения этой объектной переменной вы можете использовать переменную Rate, а не длинную ссылку. Например, вы можете изменить значение ячейки с именем InterestRate:

    Это гораздо проще ввести, чем следующее выражение:

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

    Объявление типов переменных

    Обычно вам не нужно беспокоиться о типе данных, которые вы назначаете переменной. Excel обрабатывает все детали за кулисами. Например, если у вас есть переменная с именем MyVar, вы можете присвоить ей любую переменную типа. Вы даже можете назначить ему текстовую строку позже в процедуре.

    Если вы хотите, чтобы ваши процедуры выполнялись как можно быстрее, сообщите Excel, какой тип данных будет присвоен каждой из ваших переменных. Это называется объявление типа переменной.

    В общем, вы должны использовать тип данных, который требует наименьшее количество байтов, но все же может обрабатывать все данные, назначенные ему. Когда VBA работает с данными, скорость выполнения зависит от количества байтов, которыми располагает VBA. Другими словами, чем меньше используется байт данных, тем быстрее VBA может получить доступ и манипулировать данными.Исключением является тип данных Integer. Если скорость критическая, используйте вместо этого длинный тип данных.

    Если вы используете объектную переменную, вы можете объявить эту переменную как конкретный тип объекта. Вот пример:

    Использование With-End со структурой

    Вам нужно установить ряд свойств для объекта? Ваш код работает быстрее, если вы используете структуру With-End With. Дополнительным преимуществом является то, что ваш код может быть легче читать.

    Следующий код не использует With-End With:

    Вот тот же код, переписанный для использования With-End With:

    Когда вы используете With-End With, убедитесь, что каждое утверждение начинается с точки.

    Удаление (скрытие) строк по условию

    макрос удалит на листе все строки, в которых содержится искомый текст:

    Чтобы вместо удаления просто скрыть такие строки, замените строку

    Расширенная версия этого макроса — с использованием UserForm для ввода искомого значения

    Ещё один вариант кода, позволяющего выполнять поиск (с последующим удалением или скрытием строк) сразу по нескольким условиям:

    • 197711 просмотров

    Комментарии

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

    В комментариях к статье есть очень много вариантов переделки этого макроса, — полистайте комменты, может найдете подходящий вариант кода.
    Если же хотите получить готовое решение, — оформляйте заказ на сайте, сделаю (платно. минимальная стоимость заказа 1500 рублей)

    Добавление комментариев к данной статье на этом отключаю.

    Подскажите пожалуйста. Мучаюсь уже неделю. Не могу переделать существующие макросы для скрытия строк. Имеется таблица с цифрами. Нужно что бы скрывались строки если одновременно в столбце А и В и С и D значение меньше чем 0. Было бы не плохо это значение вводить в user form и там были кнопочки скрыть и показать все. Помогите пожалуйста. Да и ещё количество строк может бить разное. А цифровые значения начинаются с второй строки.

    Здравствуйте, у меня такая ситуация. Есть таблица, с 3000 строками, и примерно 25 столбиками
    Первые 10 столбиков заполнены текстом, с 11 по 25 столбик бывают цифры. Как мне удалить полностью строку, если в столбики с 11 по 25 все пустые ячейки ? а если хоть одна ячейка заполнена, то строку не трогать? но на первые десять столбиков не надо обращать внимание

    А как сделать такое же условие для объеденных ячеек только по нескольким значениям?

    Я должен был догадаться, какие листы надо обрабатывать, а какие нет?
    Чтобы обработать ВСЕ листы, — напишите

    Большое спасибо, но у меня следующие листы «3», «3А», «3Б», «4».

    Подскажите, как сделать этот макрос для листов «2», «2А», «2Б» и т. д.

    Sub УдалениеСтрокПоУсловию()
    Dim ra As Range, delra As Range, ТекстДляПоиска As String
    Application.ScreenUpdating = False ‘ отключаем обновление экрана

    ТекстДляПоиска = «Наименование ценности» ‘ удаляем строки с таким текстом

    ‘ перебираем все строки в используемом диапазоне листа
    For Each ra In ActiveSheet.UsedRange.Rows
    ‘ если в строке найден искомый текст
    If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then
    ‘ добавляем строку в диапазон для удаления
    If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
    End If
    Next
    ‘ если подходящие строки найдены — удаляем их
    If Not delra Is Nothing Then delra.EntireRow.Delete
    End Sub

    Если необходимо наоборот отобразить строки «EntireRow.Hidden = False»
    То как осуществить поиск текста в скрытых строках/столбцах?

    Здравствуйте. Подскажите, пожалуйста, как прописать макрос так, чтоб он:
    1. удалял все строки с заливкой цветом, или
    2. удалял все строки, содержащие какую либо ячейку с заливкой цветом.
    Спасибо.

    Игорь,благодарю за макрос — облегчает жизнь! Вы не посоветуете как работать с этим макросом при защите листа?

    Добрый день! Подскажите пожалуйста, Как сделать макрос скрывающий строки при условии что в двух подряд столбцах 0 или пусто? и чтоб он запускался не при открытии файла, а кнопкой?
    у меня вариант с условием одного столбца, как его исправить

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim d As Integer
    d = UsedRange.Rows.Count + 1
    For rwIndex = 1 To 31
    colIndex = 3
    If Cells(rwIndex, colIndex).Value = 0 Then
    Rows(rwIndex).Hidden = True
    End If
    Next
    End Sub

    Буду очень признательна)

    Добрый день! У меня проблема с большими таблицами и с их колличеством) В одной книге у меня 25 листов на каждом большие таблицы, для удбства печати я создала макрос скрывающий ненужные строки, столбцы и ячейки во всей книге сразу, поочередно на каждом листе. Теперь хочу чтоб можно было сразу во всей книге развернуть скрытые ячейки. И не могу) Подскажите как исправить этот макрос чтоб он работал в модуле «Эта книга» для всех листов сразу

    Sub Show()
    Columns.Hidden = False
    Rows.Hidden = False

    Во — то что доктор прописал — спасибо! И извините за не корректность:)

    Сандер, я написал код так, как вы просили, — если в ячейке присутствует цифра, то строка удаляется.
    А вам надо было удалять только ячейки с ЧИСЛОМ (а не содержащие цифры)
    Замените

    Увы. работает аналогично с «Удаление (скрытие) строк по условию», т.е. если в тексте присутствует допустим «Адаптер АТ-2000 14 В22» — что там, что в вашем примере удаляет строку. Просто думал — есть что-нить персональное с цифрами.

    Сандер, так попробуйте:

    Здравствуйте! Пролистал, прочитал — таки не нашел ответ к своей задаче, а она такова: в столбце чередуются и текст и цифры — надо удалить строки которые содержат цифры(они естно — разные). Спасибо!

    Евгений, при работе макросов, отмена действий в Excel не работает
    (что сделано макросом, никак не отменить, — так устроен Excel)

    Подскажите. после удаления строк с помощью макроса, нельзя почему то вернуть назад назад изменения.Что нужно сделать чтоб вернуть изменения назад.

    Здравствуйте, Нурьяна.
    Моя программа нормально работает, — если ей правильно настроить
    (настройка под каждый конкретный сайт, — от 1500 руб, + сама программа 2500 стоит)

    PS: на будущее, размещайте коммент не в первой попавшейся статье, а в статье с описанием программы-парсера
    http://excelvba.ru/programmes/Parser
    можете сразу оформить заказ на парсер, в таком виде:
    http://excelvba.ru/programmes/Parser/order

    Здравствуй Админ! Долго Вас искала. подрабатываю на СП закупках, и уже замучилась с заполнением каталогов, сил больше нет. Как-то покупала граббер у одного программиста, ну вообще не довольна , на одну закупку граббер стоит 2800, и работает через раз. Скажите как работает Ваша программа и сколько стоит, и можно ее настроить под сайт на котором я работаю и пользоваться ею постоянно один раз заплатив?

    Можем сделать под заказ, — всё будет работать как надо.

    Хоть убейте — не работает. Идея в том, что макрос срабатывает при нажатии на ячейку. Берет значение из текущей активной строки и 2 столбца, ищет на другом листе и должен его просто выделить. Вся идея.
    В коде грешу на
    «ВзятьДанные = Cells(ActiveCell.Row, 2).Value»
    Он не берет значение -> не может найти его на другом листе. Как заставить его видеть значение. ( Кавычки ставил — не помогает.

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Dim ra As Range, finra As Range

    If Target.Cells.Value = «» Then Exit Sub
    If Not Intersect(Target, Range(«AF3:AF5000»)) Is Nothing Then

    ВзятьДанные = Cells(ActiveCell.Row, 2).Value
    Sheets(«Результат»).Select
    For Each cell In Range(«A3:A2000»).Cells
    If cell = ВзятьДанные Then
    If finra Is Nothing Then Set finra = cell Else Set finra = Union(finra, cell)
    End If
    Next

    If Not finra Is Nothing Then finra.EntireRow.Select
    Application.ScreenUpdating = True
    End If
    End Sub

    Андрей, так попробуйте

    Со скрытием строчек все отлично. но что делать, если в дальнейшем мне нужно некоторые скрытые строки вновь раскрыть (т.к. признак для скрытия для них может в будущем быть нерелевантен)?
    Сделал такую билеберду, но скрытые строки он не раскрывает 🙁 Видимо не видит скрытые строки. Помогите советом пожалуйста!

    Sub Макрос()
    Dim ra As Range, delra As Range, ТекстДляПоиска As String
    Application.ScreenUpdating = False

    For Each ra In ActiveSheet.UsedRange.Rows

    If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then

    If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
    End If
    Next

    If Not delra Is Nothing Then delra.EntireRow.Hidden = False
    End Sub

    Кирилл, так попробуйте:
    УдалятьСтрокиСТекстом = Worksheets(«ИмяВторогоЛиста»).range(«a2:a10»)
    или так
    УдалятьСтрокиСТекстом = Worksheets(2).range(«a2:a10»)

    Добрый день! Ваш макрос очень выручает, Подскажите, как сделать, чтобы слова для поиска брались не из строки = Array(«Наименование *», «Количество», «текст?», «цен*сти», «*78*»),а с другого листа

    Спасибо, заработало.
    Ну я и тупой.

    Sub погрузка()
    Dim ra As Range, delra As Range
    Application.ScreenUpdating = False ‘ отключаем обновление экрана

    ‘ ищем и удаляем строки, содержащие заданный текст
    ‘ (можно указать сколько угодно значений и использовать подстановочные знаки)
    УдалятьСтрокиСТекстом = Array(«ИД пункта:», «ИД маршрута:», _
    «Название модели:», «Склад отгрузки:»)

    ‘ перебираем все строки в используемом диапозоне листа
    For Each ra In ActiveSheet.UsedRange.Rows
    ‘ перебираем все фразы в массиве
    If ra.Row >= 17 Then
    For Each word In УдалятьСтрокиСТекстом
    Next word
    End If
    ‘ если в очередной строке листа найден искомый текст
    If Not ra.Find(word, , xlValues, xlPart) Is Nothing Then
    ‘ добовляем строку в диапазон для удаления
    If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
    End If
    Next

    ‘ если подходящие строки найдены, то (оставте одну из следующих строк)
    If Not delra Is Nothing Then delra.EntireRow.Hidden = True ‘ скрываем их
    If Not delra Is Nothing Then delra.EntireRow.Delete ‘ удаляем их
    End Sub

    Пожалуйста, подскажите что не так, в таком исполнении не хочет удалять с 17 строки.
    Gjlcrf;bnt xnj yt nfr

    If ra.row >= 17 then
    For Each word In УдалятьСтрокиСТекстом
    .
    Next word
    end if

    Похоже я не совсем правильно выразил свою мысль, в макросе УдалениеСтрокПоНесколькимУсловиям нужно удалять строки с определенным текстом только с 17 строки и до конца листа.

    Вместо
    If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
    пишете
    ra.Replace («Что заменить», «»)

    нет, мне в этом макросе нужно что бы текст удалялся с определенной сторки.

    Судя по описанию задачи, Вам нужна штатная функция Эксель — заменить. Ctrl+H. Найти — пишете нужный Вам текст, поле «Заменить на» оставляете пустым.

    а можете подсказать, как можно найти и удалить текст с определенной строки.

    Читать еще:  Vba excel размер шрифта
  • Ссылка на основную публикацию
    ВсеИнструменты
    Adblock
    detector
    ×
    ×