Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Макрос на скрытие строк по условию - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос на скрытие строк по условию (Макросы/Sub)
Макрос на скрытие строк по условию
Irokezx Дата: Воскресенье, 30.07.2017, 15:40 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Добрый день, уважаемые форумчане!

Выкладываю пример макроса для решения следующей задачи (см. файл-пример): автоматически скрывать/показывать строки при проверке условия в ячейках 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) Есть ли возможность написания аналогичного макроса, при условии проверки несмежных диапазонов листа? Полагаю, это можно осуществить в одном коде путём обозначения нескольких переменных и перечисления для каждой условия проверки. На этот вопрос участников форума прошу на текущий момент не выкладывать готовое решение. Хочется увидеть ответ в формате Есть/Нет и Правильный/Неправильный ход мысли.
К сообщению приложен файл: Example_1.xlsm(17Kb)
 
Ответить
СообщениеДобрый день, уважаемые форумчане!

Выкладываю пример макроса для решения следующей задачи (см. файл-пример): автоматически скрывать/показывать строки при проверке условия в ячейках 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
Дата добавления - 30.07.2017 в 15:40
_Boroda_ Дата: Воскресенье, 30.07.2017, 16:16 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 11852
Репутация: 4911 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
1. Если не сильно придираться к определениям, то да

2. Для небольших объемов все нормально. Для больших - Вы независимо от того, скрыта ячейка или нет, все равно с ней что-то делаете. Зачем, если Вам нужно скрыть, а она уже скрыта? Или наоборот - открыть, а она уже открыта (кстати, как у Вас может быть заполнена ячейка, если перед этим она скрыта была? Её ж для этого открыть нужно). По возможности к листу нужно как можно меньше обращаться - сильно влияет на скорость. Поэтому я бы написал что-то типа:
Сначала всё открываем[vba]
Код
Rows("8:19").EntireRow.Hidden = False
[/vba]потом пробегаемся по ячейкам и собираем их адреса в одну кучу. А потом что-то типа
[vba]
Код
Range("B6:B7,B9,B11,B14,B16,B18:B20,B22").RowHeight = 0
[/vba]
Можно и не пробегаться циклом. Если ячеек не очень много (могу ошибаться, вроде до 2^13 = 8192) и там действительно реально пусто, а не результат формулы "", то прокатит вот так
[vba]
Код
Range("B8:B19").SpecialCells(xlCellTypeBlanks).RowHeight = 0
[/vba]
И Application.ScreenUpdating нужно возвращать в True. Теоретически он возвращается сам, но здесь на форуме с год назад была тема про тормоза макроса (сейчас искать не буду - долго), где лечение заключалось как раз в этом.

3. В общих чертах, не придираясь к конкретным словам, да, все верно. Sub по умолчанию означает Public Sub. В этом отличие от переменных, которые по умолчанию Private

4. См. п.2

Файл не смотрел


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение1. Если не сильно придираться к определениям, то да

2. Для небольших объемов все нормально. Для больших - Вы независимо от того, скрыта ячейка или нет, все равно с ней что-то делаете. Зачем, если Вам нужно скрыть, а она уже скрыта? Или наоборот - открыть, а она уже открыта (кстати, как у Вас может быть заполнена ячейка, если перед этим она скрыта была? Её ж для этого открыть нужно). По возможности к листу нужно как можно меньше обращаться - сильно влияет на скорость. Поэтому я бы написал что-то типа:
Сначала всё открываем[vba]
Код
Rows("8:19").EntireRow.Hidden = False
[/vba]потом пробегаемся по ячейкам и собираем их адреса в одну кучу. А потом что-то типа
[vba]
Код
Range("B6:B7,B9,B11,B14,B16,B18:B20,B22").RowHeight = 0
[/vba]
Можно и не пробегаться циклом. Если ячеек не очень много (могу ошибаться, вроде до 2^13 = 8192) и там действительно реально пусто, а не результат формулы "", то прокатит вот так
[vba]
Код
Range("B8:B19").SpecialCells(xlCellTypeBlanks).RowHeight = 0
[/vba]
И Application.ScreenUpdating нужно возвращать в True. Теоретически он возвращается сам, но здесь на форуме с год назад была тема про тормоза макроса (сейчас искать не буду - долго), где лечение заключалось как раз в этом.

3. В общих чертах, не придираясь к конкретным словам, да, все верно. Sub по умолчанию означает Public Sub. В этом отличие от переменных, которые по умолчанию Private

4. См. п.2

Файл не смотрел

Автор - _Boroda_
Дата добавления - 30.07.2017 в 16:16
Irokezx Дата: Вторник, 01.08.2017, 02:05 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

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

Автор - Irokezx
Дата добавления - 01.08.2017 в 02:05
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос на скрытие строк по условию (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2017 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!