Скрытие/отображение ненужных строк и столбцов

Постановка задачи

Предположим, что у нас имеется вот такая таблица, с которой приходится "танцевать" каждый день:

outline1.gif

 

Кому таблица покажется маленькой - мысленно умножьте ее по площади в двадцать раз, добавив еще пару кварталов и два десятка крупных российских городов. 

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

  • скрывать подробности по месяцам, оставляя только кварталы
  • скрывать итоги по месяцам и по кварталам, оставляя только итог за полугодие
  • скрывать ненужные в данный момент города (я работаю в Москве - зачем мне видеть Питер?) и т.д.

В реальной жизни примеров таких таблиц - море.

Способ 1. Скрытие строк и столбцов

Способ, прямо скажем, примитивный и не очень удобный, но два слова про него сказать можно. Любые выделенные предварительно строки или столбцы на листе можно скрыть, щелкнув по заголовку столбца или строки правой кнопкой мыши и выбрав в контекстном меню команду Скрыть (Hide):

outline2.gif

 

Для обратного отображения нужно выделить соседние строки/столбцы и, щелкнув правой кнопкой мыши, выбрать в меню, соответственно, Отобразить (Unhide).

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

Способ 2. Группировка

Если выделить несколько строк или столбцов, а затем выбрать в меню Данные - Группа и структура - Группировать (Data - Group and Outline - Group), то они будут охвачены прямоугольной скобкой (сгруппированы). Причем группы можно делать вложенными одна в другую (разрешается до 8 уровней вложенности):

outline3.gif

Более удобный и быстрый способ - использовать для группировки выделенных предварительно строк или столбцов сочетание клавиш Alt+Shift+стрелка вправо, а для разгруппировки Alt+Shift+стрелка влево, соответственно.

Такой способ скрытия ненужных данных гораздо удобнее - можно нажимать либо на кнопку со знаком "+" или "-", либо на кнопки с цифровым обозначением уровня группировки в левом верхнем углу листа - тогда все группы нужного уровня будут сворачиваться или разворачиваться сразу.

Кроме того, если в вашей таблице присутствуют итоговые строки или столбцы с функцией суммирования соседних ячеек, то есть шанс (не 100%-ый правда), что Excel сам создаст все нужные группировки в таблице одним движением - через меню Данные - Группа и структура - Создать структуру (Data - Group and Outline - Create Outline). К сожалению, подобная функция работает весьма непредсказуемо и на сложных таблицах порой делает совершенную ерунду. Но попробовать можно.

В Excel 2007 и новее все эти радости находятся на вкладке Данные (Data) в группе Структура (Outline):

outline5.gif

Способ 3. Скрытие помеченных строк/столбцов макросом

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

outline4.gif

Теперь откроем редактор Visual Basic (ALT+F11), вставим в нашу книгу новый пустой модуль (меню Insert - Module) и скопируем туда текст двух простых макросов:

Sub Hide()
    Dim cell As Range
    Application.ScreenUpdating = False                              'отключаем обновление экрана для ускорения
    For Each cell In ActiveSheet.UsedRange.Rows(1).Cells            'проходим по всем ячейкам первой строки
        If cell.Value = "x" Then cell.EntireColumn.Hidden = True    'если в ячейке x - скрываем столбец
    Next
    For Each cell In ActiveSheet.UsedRange.Columns(1).Cells         'проходим по всем ячейкам первого столбца
        If cell.Value = "x" Then cell.EntireRow.Hidden = True       'если в ячейке x - скрываем строку
    Next
    Application.ScreenUpdating = True
End Sub

Sub Show()
    Columns.Hidden = False   'отменяем все скрытия строк и столбцов
    Rows.Hidden = False
End Sub

Как легко догадаться, макрос Hide скрывает, а макрос Show - отображает обратно помеченные строки и столбцы. При желании, макросам можно назначить горячие клавиши (Alt+F8 и кнопка Параметры), либо создать прямо на листе кнопки для их запуска с вкладки Разработчик - Вставить - Кнопка (Developer - Insert - Button).

Способ 4. Скрытие строк/столбцов с заданным цветом

Допустим, что в приведенном выше примере мы, наоборот, хотим скрыть итоги, т.е. фиолетовые и черные строки и желтые и зеленые столбцы. Тогда наш предыдущий макрос придется немного видоизменить, добавив вместо проверки на наличие "х" проверку на совпадение цвета заливки с произвольно выбранными ячейками-образцами:

Sub HideByColor()
    Dim cell As Range
    Application.ScreenUpdating = False
    For Each cell In ActiveSheet.UsedRange.Rows(2).Cells
        If cell.Interior.Color = Range("F2").Interior.Color Then cell.EntireColumn.Hidden = True
        If cell.Interior.Color = Range("K2").Interior.Color Then cell.EntireColumn.Hidden = True
    Next
    For Each cell In ActiveSheet.UsedRange.Columns(2).Cells
        If cell.Interior.Color = Range("D6").Interior.Color Then cell.EntireRow.Hidden = True
        If cell.Interior.Color = Range("B11").Interior.Color Then cell.EntireRow.Hidden = True
    Next
    Application.ScreenUpdating = True
End Sub

Однако надо не забывать про один нюанс: этот макрос работает только в том случае, если ячейки исходной таблицы заливались цветом вручную, а не с помощью условного форматирования (это ограничение свойства Interior.Color). Так, например, если вы с помощью условного форматирования автоматически подсветили в своей таблице все сделки, где количество меньше 10:

outline7.png

...и хотите их скрывать одним движением, то предыдущий макрос придется "допилить". Если у вас Excel 2010-2013, то можно выкрутиться, используя вместо свойства Interior свойство DisplayFormat.Interior, которое выдает цвет ячейки вне зависимости от способа, которым он был задан. Макрос для скрытия синих строк тогда может выглядеть так:

Sub HideByConditionalFormattingColor()
    Dim cell As Range
    Application.ScreenUpdating = False
    For Each cell In ActiveSheet.UsedRange.Columns(1).Cells
        If cell.DisplayFormat.Interior.Color = Range("G2").DisplayFormat.Interior.Color Then cell.EntireRow.Hidden = True
    Next
    Application.ScreenUpdating = True
End Sub

Ячейка G2 берется в качестве образца для сравнения цвета. К сожалению, свойство DisplayFormat появилось в Excel только начиная с 2010 версии, поэтому если у вас Excel 2007 или старше, то придется придумывать другие способы.

Ссылки по теме

 


Страницы: 1  2  
Nikki
11.11.2012 19:52:52
Можно ли и как знак свертки группы разместить не слева/под свертываемыми данными а справа/над ними?
11.11.2012 20:05:50
Нажмите на символ стрелки в правом нижнем углу группы Структура на вкладке Данные. Будет окно, где это можно настроить.
Владислав
11.11.2012 19:53:21
Да ексель без границ...
Круто!!!.
Наталья
11.11.2012 20:04:42
Добрый день! Есть таблица, ячейки первого столбца залиты разными цветами, на лист я добавила две кнопки, одна должна скрывать строки с ячейками определённого цвета, другая отображать их. Помогите! Заранее спасибо!
11.11.2012 20:07:54
Да, можно использовать макросы из Способа 3. Только вместо
If cell.Value = "x"

нужно будет написать
If cell.Interior.ColorIndex = 3

где 3 - код вашего цвета заливки
Ohra
24.12.2012 17:46:03
А еще можно использовать персональные представления "Вид" - "Представления"
27.01.2013 15:10:56
Подскажите, пожалуйста!
Что нужно поменять в макросе, чтобы проверял не весь столбец, а определенный диапазон (например, столбец 1, строки со 2 по 400).
Спасибо!
27.01.2013 18:38:08
Вместо UsedRange.Columns(1) напишите Range("A2:A400")
Здравствуйте!
Подскажите пожалуйста, что нужно изменить в макросе, что бы проверяло диапазон D20: D59
и если там пусто то удаляло строку. (как проверять диапазон я понял)
P.S. и будет ли удалять если в строке есть формулы?
Заранее спасибо!
01.07.2013 21:24:45
Изменять ничего не нужно - нужно просто полностью переписать макрос:
Sub DeleteRows
   for s=59 to 20 step -1
     if Len(Range("D" & s))=0 Then Range("D" & s).EntireRow.Delete
   Next s
End Sub
Благодарю!
06.12.2013 10:35:16
Спасибо за макрос!  а как сделать чтобы проверяло  3 столбца "D" "H"  и   "M" .
Николай, добрый день! Скажите, как исправить ваш макрос, что бы скрывалась строка, при условии, что в двух столбцах подряд (EF) нули или пусто?
28.06.2013 10:36:15
Возможно ли прописать макрос чтобы столбцы/строки скрывались с соответствующим смещением видимых столбцов/строк на их позиции ?? ну а потом конечно обратно отображались с обратной процедурой сдвига строк/столбцов.
01.07.2013 21:03:09
Скрытие с соответствующим смещением - это называется удаление. Если макросом сохранять предварительно удаляемые строки/столбцы куда-то, а потом их оттуда восстанавливать другим макросом, то - можно. Но это будет совсем другой макрос, не из этой статьи совсем :)
02.07.2013 12:17:03
Ок, понял.
Подскажите, тогда, а что изменить в макросе, чтобы скрытие/отображение строк/столбцов при запуске макроса (как в примере) затрагивало не только конкретный лист, а всю книгу??
03.07.2013 09:24:51
Нужно добавить внешний цикл перебора всех листов в книге с активацией каждого листа по очереди:
Sub HideAllSheets()
    Dim cell As Range
    Application.ScreenUpdating = False
    For Each sh in Worksheets()
       sh.Activate
       For Each cell In ActiveSheet.UsedRange.Rows(1).Cells 
          If cell.Value = "x" Then cell.EntireColumn.Hidden = True
       Next
       For Each cell In ActiveSheet.UsedRange.Columns(1).Cells   
          If cell.Value = "x" Then cell.EntireRow.Hidden = True     
       Next
    Next sh
    Application.ScreenUpdating = True
End Sub

03.07.2013 14:39:36
Спасибо большое!!
22.08.2013 11:50:31
Добрый день! Подскажите пожалуйста. а можно ли сделать такой же макрос только,допустим есть ячейка допустим B50( в ней задано правило раскрывающегося списка от 1 до 4) в строке 50 от колонки H до W ,будут стоять цифры от 1 до 4 с повторениями и с помощью B50 я мог фильтровать столбцы, выбрать все 3-и или все 2-и или отобразить все
03.12.2013 17:17:07
Николай, а можно ли пронумеровать столбцы, например 1, 2, 3, 4, 5 и т..д., и создать несколько кнопок (макросов) с скрытием/отображением необходимых столбцов? Например при нажатии на кнопку 1 отображаются только столбцы под номерами 1, 5, 10, 29, а при нажатии на кнопку 2 отображаются только столбцы под номерами 1, 5, 15, 25.
28.12.2013 11:54:08
Ильдар, тогда уж можно и не нумеровать, а просто прописать в макросе скрытие нужных столбцов:
Sub HideColumns()
   With Worksheets("Лист1")
      .Columns(1).Hidden=True
      .Columns(5).Hidden=False
      ...и так далее
   End With
End Sub
04.01.2014 06:14:00
Спасибо огромное!!!!!
13.12.2013 09:05:14
Как автоматически скрыть только полностью пустые строки, не привязываясь к столбцу?
28.12.2013 11:55:41
Замените в этом макросеDelete на Hidden=True
12.04.2016 06:52:11
Здравствуйте Николай, а если надо не чтобы всю строку анализировал макрос а ячеqку в столбце B
21.01.2014 16:56:33
Николай, добрый день! Подскажите, пожалуйста, а как сделать так, чтобы макрос выполнялся при открытии книги (= столбцы скрывались бы при открытии книги)?

При совместном доступе к файлу, все столбцы, скрытые вручную (Способ 1), автоматически отображаются при открытии. Победить это мы не можем уже давно...
Ваш макрос просто находка!
Заранее спасибо!
24.03.2014 18:14:53
Николай, добрый день!
Подскажите пожалуйста, что нужно изменить в макросе, что бы скрывал по кнопке диапазон столбцов (D5:K5)
и возможно ли сделать таких кнопок около 30шт. с разными диапазонами.
Заранее спасибо!
26.03.2014 13:20:50
Подскажите пожалуйста, а как нужно изменит макрос, чтобы скрывались строки диапазона A1:X997 по трем условиям:
если одновременно три ячейки строки в столбцах N, S и X равны нулю.

Спасибо пребольшое заранее!!
28.05.2014 16:04:13
Николай, добрый день!
Спасибо за идею с макросом.
Вопрос: У меня 2500 тысячи строк. Макрос проходит, удаляет половину и останавливается. Запускаешь его он снова проходит, удаляет половину пустых строк и так далее. Т.е. для того чтобы со всего листа удалить пустые строки необходимо запустить макрос несколько 12 раз. Почему так происходит?
31.05.2014 00:14:46
Мой макрос ничего не удаляет, а скрывает. Не видя ваш макрос, точно ответить не смогу. Предполагаю, что вы изменили команду скрытия на удаление, но не поменяли циклы прохода в обратную сторону. Тогда после удаления строк-столбцов у вас сбивается счетчик цикла.ʛ
03.06.2014 11:16:12
Да, совершенно верно. Ваш макрос ничего не удаляет- это я тупанул, не написав о чем речь))). Я поменял cell.EntireColumn.Hidden = True на
Cell.EntireRow.Delete.
Сам макрос выглядит так:

Sub ()
Dim Cell As Range
   Application.ScreenUpdating = False                              
1        For Each Cell In ActiveSheet.UsedRange.Columns(6).Cells        
       If Cell.Value = "0" Then Cell.EntireRow.Delete    
       Next
'2 и далее идет повторение 12 раз.

Application.ScreenUpdating = False
End sub
09.06.2014 10:56:29
Добрый день!Есть макрос, скрывающий строки в таблице  по щелчку кнопки. как сделать так, что бы еще срывались и необходимые столбцы?
Sub ToggleButton1_Click()
Dim i As Range
Application.ScreenUpdating = 0
If ToggleButton1 Then
For Each i In [F6:F26]
If Len(i) = 0 Then i.EntireRow.Hidden = 1
Next
Else
[F6:F26].EntireRow.Hidden = 0
End If
Application.ScreenUpdating = 1

End Sub
09.06.2014 12:39:31
Нужно просто добавить аналогичную процедуру для столбцов (индикаторы скрытия будут тогда не в диапазоне F6:F26, а в, например, А1:Z1:
Sub ToggleButton1_Click()
Dim i As Range
Application.ScreenUpdating = 0
If ToggleButton1 Then
   For Each i In [F6:F26]
      If Len(i) = 0 Then i.EntireRow.Hidden = 1
   Next
Else
   [F6:F26].EntireRow.Hidden = 0
End If

If ToggleButton1 Then
   For Each i In [A1:Z1]
      If Len(i) = 0 Then i.EntireColumn.Hidden = 1
   Next
Else
   [A1:Z1].EntireColumn.Hidden = 0
End If

Application.ScreenUpdating = 1

End Sub
20.06.2014 14:57:58
Извините, а как использовать способ 2 при включение защита листа
Добрый день есть диапазон столбцов  к примеру C-L его надо скрывать-отображать  макросом на кнопке однако при отображении не  должны показываться столбцы помеченные "*" в строке 1
28.07.2014 15:03:10
Добрый день, Николай. У меня есть похожая таблица, но заголовки столбцов не месяца, а даты и мне нужно сделать так, чтобы первого числа остался только столбик с датой 01.07.2014, второго -02.07.2014, а другие были скрыты, а в конце месяца выводилась таблица полностью. Подскажите как это можно реализовать в коде.
04.11.2014 12:16:47
Добрый день, Николай.
Подскажите, если необходимо скрытие закрашенных строк в черный цвет (часть из них окрашиваются в черный цвет в ручную, вторая часть условным форматированием), что необходимо изменить в  коде? И что нужно изменить, чтобы показывались только эти строки?
Спасибо.
07.11.2014 00:28:15
Вероника, специально в качестве ответа на ваши вопросы дописал сегодня к статье Способ 4 - посмотрите, плиз :)
26.11.2014 18:45:18
Николай, добрый день,
подскажите, как прописать макрос скрытия НЕ выделенных курсором строк (т.е. выделяю нужные строки мышкой, макрос скрывает остальные строки).
А вообще задача более глобальная (возможно не для этой темы): 1) нажимаю на одну из множества ячеек с гиперссылкой; 2) когда перехожу по гиперссылке на другой лист, то вижу только те строки в таблице, которые входят в диапазон имени (диспетчера имен).
03.03.2015 17:13:20
Спасибо за статью да и за весь сайт! Подскажите, пожалуйста, как этот макрос повесить на событие фильтрации сводной таблицы.
05.05.2015 13:42:08
Здравствйте Николай!
Подскажите пожалуйста:
1) Можно  ли создать макрос, который будет скрывать и отображать строки автоматически, без кнопок и команд. Например появилась в ячейке А1 цифра 5 (ячейка соответственно равна другой ячейке), то строка появилась. А если ячейка А1 пустая, то строка скрылась.
2) Можно ли отображать  строки при помощи макроса. Если например в ячейке А10 несколько цифр 8 903 123 45 67. А мне нужно отобразить строку, если есть совпадение с цифрами. Скажем 123. Если нет совпадения, то строка скрывается. Также без кнопок и команд.

Спасибо!
07.06.2015 19:22:26
А можно сменить символ раскрытия скрытия вкладок например на название, к примеру? Что бы было информативно то так же запутаться можно.
08.06.2015 20:47:13
Если вы имеете ввиду символ "плюс-минус" для раскрытия или сворачивания строк - то никак, насколько мне известно.
19.06.2015 11:35:58
Когда скрываешь лишние подробности (я не профи - использовала только 1 и 2 способ), а потом копируешь видимые ячейки (выделяю всю видимую область), чтобы сделать на их основе новую табличку (допустим, видимые ячейки никак не связаны со скрытыми), то скрытые лишние подробности тоже копируются. Скрытые ячейки удалять нельзя. Есть ли способ так обрабатывать подобные таблицы, чтобы создавать на их основе новые без ненужных на данный момент подробностей?
20.08.2015 16:23:11
Добрый день, Николай!
Подскажите, пожалуйста, как скорректировать макрос 3, чтобы при выборе определенного значения в ячейке из выпадающего списка, строки под ячейкой либо скрывались, либо раскрывались.
12.09.2015 12:36:01
Доброго дня!
Николай, благодарю за пример!
Подскажите пож-та, для способа 3 - можно сделать так, чтобы при первом нажатии на кнопку всё скрывалось по условию..., а при втором - раскрывалось? Т.е. чтобы была одна кнопка, а не две? Благодарю!
30.10.2015 13:01:18
Здравствуйте, Николай!
Прошу помочь вот с чем:
Есть книга на кучу столбцов. Сейчас часть столбцов прячется разными кнопками. Разные кнопки - разные столбцы.
Как завязать макрос на выпадающий список?
Чтоб прятались столбцы в зависимости от значения в выпадающем списке
(к примеру:
показать все
1 квартал (стобцы D-G)
2 квартал (стобцы h-j)
3 квартал и т.д.
06.11.2015 10:36:34
Добрый день!
Присоединяюсь к предыдущему вопросу, только в плане отображения только строк из выпадающего списка. На примере Вашей таблицы (продажи / сервис / аренда / все)
09.12.2015 11:44:46
Николай!
Вопрос по вашему способу 4.
Сделал - все работает. Вопрос: как сделать чтобы теперь открывались строки определенного цвета?  
Вообщем нужен макрос Show для открытия определенного цвета.

Спасибо!  
Страницы: 1  2  
Наверх