Выкладываю пример макроса для решения следующей задачи (см. файл-пример): автоматически скрывать/показывать строки при проверке условия в ячейках B8:B19 (List1).
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'Задаём событие, при котором запускается макрос Application.ScreenUpdating = False 'Отключаем обновление экрана во время выполнения макроса Dim i& 'Объявляем переменную For i = 8 To 19 'Указываем диапазон цикла, в данном случае по номерам строк If Range("B" & i).Value = "" Then 'Проверяем, пустые ли ячейки, соответствующие указанному выше диапазону, в интересующем столбце ("B") Rows(i).EntireRow.Hidden = True 'Скрываем строки, если эти ячейки пустые Else: Rows(i).EntireRow.Hidden = False 'Отображаем строки, если ячейки заполнены End If 'Закрываем конструкцию проверки указанных условий Next 'Запускаем описанную выше процедуру для каждого значения переменной из указанного диапазона цикла End Sub
[/vba]
Собственно макрос работает, но у меня возник ряд вопросов, связанный с теоретической частью VBA (уровень моих знаний около нулевой отметки):
1) Соответствует ли содержимое моих комментариев после знака апострофа (см. тело макроса) правильному описанию выполняемой процедуры? 2) Было бы интересно посмотреть более рациональные (Ваши) варианты решения для этой задачки с использованием VBA-кода, если они существуют. 3) Чем отличаются между собой макросы типов Sub/Private Sub/Public Sub? Если я правильно понял, процедуру Private Sub можно запустить только из модуля, в котором он прописан (т.е. в моём случае это List1), тогда как процедуру Sub возможно выполнить из любой части рабочей книги. Разницу между Sub и Public Sub понять не могу. 4) Есть ли возможность написания аналогичного макроса, при условии проверки несмежных диапазонов листа? Полагаю, это можно осуществить в одном коде путём обозначения нескольких переменных и перечисления для каждой условия проверки. На этот вопрос участников форума прошу на текущий момент не выкладывать готовое решение. Хочется увидеть ответ в формате Есть/Нет и Правильный/Неправильный ход мысли.
Добрый день, уважаемые форумчане!
Выкладываю пример макроса для решения следующей задачи (см. файл-пример): автоматически скрывать/показывать строки при проверке условия в ячейках B8:B19 (List1).
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'Задаём событие, при котором запускается макрос Application.ScreenUpdating = False 'Отключаем обновление экрана во время выполнения макроса Dim i& 'Объявляем переменную For i = 8 To 19 'Указываем диапазон цикла, в данном случае по номерам строк If Range("B" & i).Value = "" Then 'Проверяем, пустые ли ячейки, соответствующие указанному выше диапазону, в интересующем столбце ("B") Rows(i).EntireRow.Hidden = True 'Скрываем строки, если эти ячейки пустые Else: Rows(i).EntireRow.Hidden = False 'Отображаем строки, если ячейки заполнены End If 'Закрываем конструкцию проверки указанных условий Next 'Запускаем описанную выше процедуру для каждого значения переменной из указанного диапазона цикла End Sub
[/vba]
Собственно макрос работает, но у меня возник ряд вопросов, связанный с теоретической частью VBA (уровень моих знаний около нулевой отметки):
1) Соответствует ли содержимое моих комментариев после знака апострофа (см. тело макроса) правильному описанию выполняемой процедуры? 2) Было бы интересно посмотреть более рациональные (Ваши) варианты решения для этой задачки с использованием VBA-кода, если они существуют. 3) Чем отличаются между собой макросы типов Sub/Private Sub/Public Sub? Если я правильно понял, процедуру Private Sub можно запустить только из модуля, в котором он прописан (т.е. в моём случае это List1), тогда как процедуру Sub возможно выполнить из любой части рабочей книги. Разницу между Sub и Public Sub понять не могу. 4) Есть ли возможность написания аналогичного макроса, при условии проверки несмежных диапазонов листа? Полагаю, это можно осуществить в одном коде путём обозначения нескольких переменных и перечисления для каждой условия проверки. На этот вопрос участников форума прошу на текущий момент не выкладывать готовое решение. Хочется увидеть ответ в формате Есть/Нет и Правильный/Неправильный ход мысли.Irokezx
1. Если не сильно придираться к определениям, то да
2. Для небольших объемов все нормально. Для больших - Вы независимо от того, скрыта ячейка или нет, все равно с ней что-то делаете. Зачем, если Вам нужно скрыть, а она уже скрыта? Или наоборот - открыть, а она уже открыта (кстати, как у Вас может быть заполнена ячейка, если перед этим она скрыта была? Её ж для этого открыть нужно). По возможности к листу нужно как можно меньше обращаться - сильно влияет на скорость. Поэтому я бы написал что-то типа: Сначала всё открываем[vba]
Код
Rows("8:19").EntireRow.Hidden = False
[/vba]потом пробегаемся по ячейкам и собираем их адреса в одну кучу. А потом что-то типа [vba]
[/vba] Можно и не пробегаться циклом. Если ячеек не очень много (могу ошибаться, вроде до 2^13 = 8192) и там действительно реально пусто, а не результат формулы "", то прокатит вот так [vba]
[/vba] И Application.ScreenUpdating нужно возвращать в True. Теоретически он возвращается сам, но здесь на форуме с год назад была тема про тормоза макроса (сейчас искать не буду - долго), где лечение заключалось как раз в этом.
3. В общих чертах, не придираясь к конкретным словам, да, все верно. Sub по умолчанию означает Public Sub. В этом отличие от переменных, которые по умолчанию Private
4. См. п.2
Файл не смотрел
1. Если не сильно придираться к определениям, то да
2. Для небольших объемов все нормально. Для больших - Вы независимо от того, скрыта ячейка или нет, все равно с ней что-то делаете. Зачем, если Вам нужно скрыть, а она уже скрыта? Или наоборот - открыть, а она уже открыта (кстати, как у Вас может быть заполнена ячейка, если перед этим она скрыта была? Её ж для этого открыть нужно). По возможности к листу нужно как можно меньше обращаться - сильно влияет на скорость. Поэтому я бы написал что-то типа: Сначала всё открываем[vba]
Код
Rows("8:19").EntireRow.Hidden = False
[/vba]потом пробегаемся по ячейкам и собираем их адреса в одну кучу. А потом что-то типа [vba]
[/vba] Можно и не пробегаться циклом. Если ячеек не очень много (могу ошибаться, вроде до 2^13 = 8192) и там действительно реально пусто, а не результат формулы "", то прокатит вот так [vba]
[/vba] И Application.ScreenUpdating нужно возвращать в True. Теоретически он возвращается сам, но здесь на форуме с год назад была тема про тормоза макроса (сейчас искать не буду - долго), где лечение заключалось как раз в этом.
3. В общих чертах, не придираясь к конкретным словам, да, все верно. Sub по умолчанию означает Public Sub. В этом отличие от переменных, которые по умолчанию Private
_Boroda_, доброго времени суток и спасибо за ответ. Сейчас завал на работе, к сожалению, и нет времени попробовать Ваш метод, поэтому прошу пока данную тему не закрывать, так как есть вопросы, которые я напишу, когда отчётливо пойму, что осталось для меня непонятным. Если у Вас будет возможность ответить на них, буду крайне признательным.
_Boroda_, доброго времени суток и спасибо за ответ. Сейчас завал на работе, к сожалению, и нет времени попробовать Ваш метод, поэтому прошу пока данную тему не закрывать, так как есть вопросы, которые я напишу, когда отчётливо пойму, что осталось для меня непонятным. Если у Вас будет возможность ответить на них, буду крайне признательным.Irokezx
Irokezx, доброй ночи... Не могли бы подсказать как дополнить Ваш код удалением значений в соседнем столбце "С" "D" тех же строк которые скрыли по условию в коде Заранее спасибо огромное
Irokezx, доброй ночи... Не могли бы подсказать как дополнить Ваш код удалением значений в соседнем столбце "С" "D" тех же строк которые скрыли по условию в коде Заранее спасибо огромноеanisimovaleksandr32
Сообщение отредактировал anisimovaleksandr32 - Вторник, 19.09.2023, 20:15