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

Вход

Регистрация

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

 

= Мир MS Excel/Макрос "Скрыть строки в пределах определенного раздела" - Мир MS Excel

Старая форма входа
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос "Скрыть строки в пределах определенного раздела" (Макросы/Sub)
Макрос "Скрыть строки в пределах определенного раздела"
Лорик Дата: Понедельник, 29.09.2014, 06:19 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 109
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Просмотрев все подобные темы не удалось найти подходящего примера. Прошу помощи в написании макроса. Есть таблица, состоящая из нескольких разделов. Нужно скрыть строки в каждом из разделов (I, II), в которых по столбцам D и E нет данных. При этом основные пункты (закрашенные зеленой заливкой: А,Б,В,Г,Д и тд.), даже если в них сумма показателей равна нулю, скрываться не должны. Исходник прилагаю. Буду признательна за внимание и помощь.
К сообщению приложен файл: 6971952.xlsm (24.4 Kb)
 
Ответить
СообщениеПросмотрев все подобные темы не удалось найти подходящего примера. Прошу помощи в написании макроса. Есть таблица, состоящая из нескольких разделов. Нужно скрыть строки в каждом из разделов (I, II), в которых по столбцам D и E нет данных. При этом основные пункты (закрашенные зеленой заливкой: А,Б,В,Г,Д и тд.), даже если в них сумма показателей равна нулю, скрываться не должны. Исходник прилагаю. Буду признательна за внимание и помощь.

Автор - Лорик
Дата добавления - 29.09.2014 в 06:19
wild_pig Дата: Понедельник, 29.09.2014, 08:06 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 517
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
В оригинале тоже будет цветастенько?
[vba]
Код
Sub hide_rows()
      Application.ScreenUpdating = False
      For Each cel In Range("B16", Cells(Rows.Count, 2).End(xlUp))
          If cel.Interior.Color = 16777215 Then
              cel.EntireRow.Hidden = True
          End If
      Next
      Application.ScreenUpdating = True
End Sub
[/vba]


Сообщение отредактировал wild_pig - Понедельник, 29.09.2014, 08:22
 
Ответить
СообщениеВ оригинале тоже будет цветастенько?
[vba]
Код
Sub hide_rows()
      Application.ScreenUpdating = False
      For Each cel In Range("B16", Cells(Rows.Count, 2).End(xlUp))
          If cel.Interior.Color = 16777215 Then
              cel.EntireRow.Hidden = True
          End If
      Next
      Application.ScreenUpdating = True
End Sub
[/vba]

Автор - wild_pig
Дата добавления - 29.09.2014 в 08:06
Лорик Дата: Понедельник, 29.09.2014, 08:21 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 109
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Да, таблица будет как в исходнике. Но хотелось бы макрос не привязывать к цвету (заливке), так как хочу его применять и в других аналогичных условиях (файлах), а там и разделы могут быть другие и заливка. Вообщем, по возможности, макрос нужен универсальный. Сама макросы не умею создавать.Подгоняю готовые под свои условия чисто интуитивно (где удается понять). Но с таким условиям подходящего готового макроса найти не удалось.
 
Ответить
СообщениеДа, таблица будет как в исходнике. Но хотелось бы макрос не привязывать к цвету (заливке), так как хочу его применять и в других аналогичных условиях (файлах), а там и разделы могут быть другие и заливка. Вообщем, по возможности, макрос нужен универсальный. Сама макросы не умею создавать.Подгоняю готовые под свои условия чисто интуитивно (где удается понять). Но с таким условиям подходящего готового макроса найти не удалось.

Автор - Лорик
Дата добавления - 29.09.2014 в 08:21
wild_pig Дата: Понедельник, 29.09.2014, 08:26 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 517
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
В этом макросе ищем заливку "без заливки" :), все отличные цвета не скрываются.
не привязывать к цвету (заливке)
Ну так скажите к чему привязать.
хочу его применять и в других аналогичных условиях (файлах)
И во всех файлах таблиа будет с 16й строки?
 
Ответить
СообщениеВ этом макросе ищем заливку "без заливки" :), все отличные цвета не скрываются.
не привязывать к цвету (заливке)
Ну так скажите к чему привязать.
хочу его применять и в других аналогичных условиях (файлах)
И во всех файлах таблиа будет с 16й строки?

Автор - wild_pig
Дата добавления - 29.09.2014 в 08:26
Лорик Дата: Понедельник, 29.09.2014, 08:46 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 109
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Спасибо,wild_pig, что отозвались на мою просьбу. В Вашем коде все-таки привязка к цвету заливки (как я поняла?!). Попробовала его в своем файле, макрос скрывает все строки, в которых есть показатели (а это не нужно) и оставляет только те, что закрашены зеленым цветом. Скрывать нужно строки в которых нет данных, но те строки которые являются названиями пунктов в разделе (т.е являются сводной строкой по показателям которые в неё входят) скрываться не должны. Т.е при формировании таблицы на печать пользователь может видеть что, например, по пункту В раздела II показатели равны нулю. В файле проставила примерные показатели и отметила примерные строки, которые должны скрываться. Добавила макрос «Отобразить строки».Просматриваться на наличие показателей в ячейке должен столбец D и E. У меня есть макрос, но в нем просмотр идёт только по одному столбцу.
К сообщению приложен файл: 0487968.xlsm (30.6 Kb)


Сообщение отредактировал Лорик - Понедельник, 29.09.2014, 09:26
 
Ответить
СообщениеСпасибо,wild_pig, что отозвались на мою просьбу. В Вашем коде все-таки привязка к цвету заливки (как я поняла?!). Попробовала его в своем файле, макрос скрывает все строки, в которых есть показатели (а это не нужно) и оставляет только те, что закрашены зеленым цветом. Скрывать нужно строки в которых нет данных, но те строки которые являются названиями пунктов в разделе (т.е являются сводной строкой по показателям которые в неё входят) скрываться не должны. Т.е при формировании таблицы на печать пользователь может видеть что, например, по пункту В раздела II показатели равны нулю. В файле проставила примерные показатели и отметила примерные строки, которые должны скрываться. Добавила макрос «Отобразить строки».Просматриваться на наличие показателей в ячейке должен столбец D и E. У меня есть макрос, но в нем просмотр идёт только по одному столбцу.

Автор - Лорик
Дата добавления - 29.09.2014 в 08:46
Лорик Дата: Понедельник, 29.09.2014, 08:56 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 109
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
И во всех файлах таблиа будет с 16й строки?

Нет, конечно. Но в строке (в Вашем коде) (For Each cel In Range("A16", Cells(Rows.Count, 2).End(xlUp)), Range("A16.. указывает на номер строки с которой происходит скрытие строк, думаю для другой таблицы нужно её изменить на соответствующий?!...
P.S Простите не знаю как вставить текст кода макроса.
 
Ответить
Сообщение
И во всех файлах таблиа будет с 16й строки?

Нет, конечно. Но в строке (в Вашем коде) (For Each cel In Range("A16", Cells(Rows.Count, 2).End(xlUp)), Range("A16.. указывает на номер строки с которой происходит скрытие строк, думаю для другой таблицы нужно её изменить на соответствующий?!...
P.S Простите не знаю как вставить текст кода макроса.

Автор - Лорик
Дата добавления - 29.09.2014 в 08:56
wild_pig Дата: Понедельник, 29.09.2014, 09:12 | Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 517
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
Проморгал про нули, может кто доделает, я убегаю на работу.
 
Ответить
СообщениеПроморгал про нули, может кто доделает, я убегаю на работу.

Автор - wild_pig
Дата добавления - 29.09.2014 в 09:12
Лорик Дата: Понедельник, 29.09.2014, 09:31 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 109
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Не бросайте меня, wild_pig. Жду Вашего возвращения.
 
Ответить
СообщениеНе бросайте меня, wild_pig. Жду Вашего возвращения.

Автор - Лорик
Дата добавления - 29.09.2014 в 09:31
Alex_ST Дата: Понедельник, 29.09.2014, 09:49 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3208
Репутация: 609 ±
Замечаний: 0% ±

2003
Дайте имя MYCOLOR ячейке F15.
Из этой ячейки будет браться образец цвета для не скрываемых строк и от неё вниз будет обрабатываться таблица.
В модуле листа пропишите процедуру:[vba]
Код
Sub Hide_Empty_Rows()
       Dim rCell As Range, lColor&
       lColor = Me.[MYCOLOR].Interior.Color
       Application.ScreenUpdating = False
       For Each rCell In Range("B" & [MYCOLOR].Offset(1).Row, Cells(Rows.Count, 2).End(xlUp))
          If rCell.Interior.Color <> lColor Then
             rCell.EntireRow.Hidden = Not (Cells(rCell.Row, 4) + Cells(rCell.Row, 5))
          End If
       Next
       Application.ScreenUpdating = True
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Понедельник, 29.09.2014, 20:09
 
Ответить
СообщениеДайте имя MYCOLOR ячейке F15.
Из этой ячейки будет браться образец цвета для не скрываемых строк и от неё вниз будет обрабатываться таблица.
В модуле листа пропишите процедуру:[vba]
Код
Sub Hide_Empty_Rows()
       Dim rCell As Range, lColor&
       lColor = Me.[MYCOLOR].Interior.Color
       Application.ScreenUpdating = False
       For Each rCell In Range("B" & [MYCOLOR].Offset(1).Row, Cells(Rows.Count, 2).End(xlUp))
          If rCell.Interior.Color <> lColor Then
             rCell.EntireRow.Hidden = Not (Cells(rCell.Row, 4) + Cells(rCell.Row, 5))
          End If
       Next
       Application.ScreenUpdating = True
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 29.09.2014 в 09:49
Лорик Дата: Понедельник, 29.09.2014, 10:45 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 109
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
В модуле листа пропишите процедуру:

Здравствуйте, Alex_ST. Все сделала как написали, но выдает ошибку. Прилагаю файл и скриншот ошибки.
К сообщению приложен файл: 3182201.xlsm (30.5 Kb)
 
Ответить
Сообщение
В модуле листа пропишите процедуру:

Здравствуйте, Alex_ST. Все сделала как написали, но выдает ошибку. Прилагаю файл и скриншот ошибки.

Автор - Лорик
Дата добавления - 29.09.2014 в 10:45
Лорик Дата: Понедельник, 29.09.2014, 10:51 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 109
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Скриншот в другом формате, не прикрепляется. Посмотрите ошибку в файле пожалуйста.
 
Ответить
СообщениеСкриншот в другом формате, не прикрепляется. Посмотрите ошибку в файле пожалуйста.

Автор - Лорик
Дата добавления - 29.09.2014 в 10:51
Лорик Дата: Понедельник, 29.09.2014, 11:01 | Сообщение № 12
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 109
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Попытка №2
 
Ответить
СообщениеПопытка №2

Автор - Лорик
Дата добавления - 29.09.2014 в 11:01
Alex_ST Дата: Понедельник, 29.09.2014, 11:29 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3208
Репутация: 609 ±
Замечаний: 0% ±

2003
Лорик,
я с работы не могу скачивать файлы с макросами (спасибо собакам-сисадминам, боящимся макровирусов, давно вымерших как динозавры).
Из Ваших скриншотов не видно, какой модуль проекта активен. Но что-то мне подсказывает, что макрос Вы расположили в стандартном модуле, а не в модуле листа.
А ведь я указал:
В модуле листа пропишите процедуру
Именно поэтому обращение "Ме" вызывает ошибку.
Для модуля листа объектом, к которому сокращенно обращаются как Ме, является лист. Т.е. Ме для кода, размещённого в этом модуле, заменяет ThisWorkSheet, на котором, действительно, есть ячейки и диапазоны.
А для стандартного модуля объектом является книга и поэтому сокращение Ме заменяет ThisWorkBook, где нет диапазонов и ячеек.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Понедельник, 29.09.2014, 11:37
 
Ответить
СообщениеЛорик,
я с работы не могу скачивать файлы с макросами (спасибо собакам-сисадминам, боящимся макровирусов, давно вымерших как динозавры).
Из Ваших скриншотов не видно, какой модуль проекта активен. Но что-то мне подсказывает, что макрос Вы расположили в стандартном модуле, а не в модуле листа.
А ведь я указал:
В модуле листа пропишите процедуру
Именно поэтому обращение "Ме" вызывает ошибку.
Для модуля листа объектом, к которому сокращенно обращаются как Ме, является лист. Т.е. Ме для кода, размещённого в этом модуле, заменяет ThisWorkSheet, на котором, действительно, есть ячейки и диапазоны.
А для стандартного модуля объектом является книга и поэтому сокращение Ме заменяет ThisWorkBook, где нет диапазонов и ячеек.

Автор - Alex_ST
Дата добавления - 29.09.2014 в 11:29
Alex_ST Дата: Понедельник, 29.09.2014, 11:55 | Сообщение № 14
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3208
Репутация: 609 ±
Замечаний: 0% ±

2003
А если всё-таки размещать код в стандартном модуле, то обращаться к диапазону нужно с указанием того, на каком листе он расположен.

Чтобы не связываться с названием листа, которое в разных файлах может быть разным, удобнее обращаться к листам не по имени, отображаемом на ярлыке листа ("Расчет") , а по кодовому имени листа (Лист1). Кодовое имя видно в эксплорере проекта. Оно написано перед именем листа, помещённым в скобки.
Для Вашего случая там написано Лист1 (Расчет)
Поэтому в коде, размещаемом в стандартном модуле надо вместо Ме.[MYCOLOR] надо писать Лист1.[MYCOLOR]. или Sheets("Расчет").Range("MYCOLOR")
Хотя если область определения имени - вся книга (по умолчанию для не повторяющихся в книге имён), то можно указание листа и опустить и обращаться без указания листа, опустив Ме.
Например, [MYCOLOR].Interior.Color или Range("MYCOLOR").Interior.Color
[vba]
Код
Sub Hide_Empty_Rows()
     Dim rCell As Range, lColor&
     lColor = [MYCOLOR].Interior.Color
     With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
     For Each rCell In Range("B" & [MYCOLOR].Offset(1).Row, Cells(Rows.Count, 2).End(xlUp))
        If rCell.Interior.Color <> lColor Then
           rCell.EntireRow.Hidden = Not (Cells(rCell.Row, 4) + Cells(rCell.Row, 5))
        End If
     Next
     With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Понедельник, 29.09.2014, 20:08
 
Ответить
СообщениеА если всё-таки размещать код в стандартном модуле, то обращаться к диапазону нужно с указанием того, на каком листе он расположен.

Чтобы не связываться с названием листа, которое в разных файлах может быть разным, удобнее обращаться к листам не по имени, отображаемом на ярлыке листа ("Расчет") , а по кодовому имени листа (Лист1). Кодовое имя видно в эксплорере проекта. Оно написано перед именем листа, помещённым в скобки.
Для Вашего случая там написано Лист1 (Расчет)
Поэтому в коде, размещаемом в стандартном модуле надо вместо Ме.[MYCOLOR] надо писать Лист1.[MYCOLOR]. или Sheets("Расчет").Range("MYCOLOR")
Хотя если область определения имени - вся книга (по умолчанию для не повторяющихся в книге имён), то можно указание листа и опустить и обращаться без указания листа, опустив Ме.
Например, [MYCOLOR].Interior.Color или Range("MYCOLOR").Interior.Color
[vba]
Код
Sub Hide_Empty_Rows()
     Dim rCell As Range, lColor&
     lColor = [MYCOLOR].Interior.Color
     With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
     For Each rCell In Range("B" & [MYCOLOR].Offset(1).Row, Cells(Rows.Count, 2).End(xlUp))
        If rCell.Interior.Color <> lColor Then
           rCell.EntireRow.Hidden = Not (Cells(rCell.Row, 4) + Cells(rCell.Row, 5))
        End If
     Next
     With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 29.09.2014 в 11:55
Лорик Дата: Понедельник, 29.09.2014, 12:09 | Сообщение № 15
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 109
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Да,Alex_ST, Вы оказались правы. Перенесла код в модуль листа. Все заработало, но не так как нужно. Привязка к заливке ячеек не совсем удобна, в Вашем варианте скрылись названия разделов (Объем и Расходы), а они нужны. Скрывать строки нужно именно между разделами, чтобы сохранился вид документа. Может проверку условия можно задать через диапазон. У меня есть макрос (может даже с этого форума), в нем задаются строки для проверки и если удовлетворяют условию, то скрываются. Я сделала этот макрос к каждому просматриваемому разделу, и задала их исполнение одним макросом. Но проблема в том, что проверка осуществляется только по одному столбцу, а мне нужно учитывать и второй столбец.

[vba]
Код
Sub Макрос1в()
For i = 24 To 31 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub Макрос2в()
For i = 36 To 66 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub Макрос3в()
For i = 68 To 71 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub Макрос4в()
For i = 73 To 82 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub Макрос5в()
For i = 86 To 91 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub Макрос6в()
For i = 93 To 97 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub СтартВ()
Макрос1в
Макрос2в
Макрос3в
Макрос4в
Макрос5в
Макрос6в
End Sub
[/vba]
 
Ответить
СообщениеДа,Alex_ST, Вы оказались правы. Перенесла код в модуль листа. Все заработало, но не так как нужно. Привязка к заливке ячеек не совсем удобна, в Вашем варианте скрылись названия разделов (Объем и Расходы), а они нужны. Скрывать строки нужно именно между разделами, чтобы сохранился вид документа. Может проверку условия можно задать через диапазон. У меня есть макрос (может даже с этого форума), в нем задаются строки для проверки и если удовлетворяют условию, то скрываются. Я сделала этот макрос к каждому просматриваемому разделу, и задала их исполнение одним макросом. Но проблема в том, что проверка осуществляется только по одному столбцу, а мне нужно учитывать и второй столбец.

[vba]
Код
Sub Макрос1в()
For i = 24 To 31 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub Макрос2в()
For i = 36 To 66 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub Макрос3в()
For i = 68 To 71 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub Макрос4в()
For i = 73 To 82 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub Макрос5в()
For i = 86 To 91 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub Макрос6в()
For i = 93 To 97 'здесь ты задаёшь то количество строк которое тебе нужно у меня 50 однёрку не трогай это означает, что отбор будет с первой строки
If Cells(i, 4) = 0 Then Rows(i).Select 'а вот тут однёрка означает номер столбца в данном случае A если D будет цифра 4 и т.д. настрой Excel не на буквы а на цифры чтобы лучше ориентироваться
Selection.EntireRow.Hidden = True
Next i
End Sub
Sub СтартВ()
Макрос1в
Макрос2в
Макрос3в
Макрос4в
Макрос5в
Макрос6в
End Sub
[/vba]

Автор - Лорик
Дата добавления - 29.09.2014 в 12:09
Alex_ST Дата: Понедельник, 29.09.2014, 12:25 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3208
Репутация: 609 ±
Замечаний: 0% ±

2003
Некогда разбироаться в чужих кодах.
Давайте договоримся, что ячейки-заголовки отличаются от тех, которые нужно прятать тем, что они объединённые.
Тогда всё просто (на этот раз код можно разместить и а коде листа, и в стандартном):[vba]
Код
Sub Hide_Empty_Rows()
     Dim rCell As Range, lColor&
     lColor = [MYCOLOR].Interior.Color
     With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
     For Each rCell In Range("B" & [MYCOLOR].Offset(1).Row, Cells(Rows.Count, 2).End(xlUp))
        If rCell.Interior.Color <> lColor And Not rCell.MergeCells Then
           rCell.EntireRow.Hidden = Not (Cells(rCell.Row, 4) + Cells(rCell.Row, 5))
        End If
     Next
     With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Понедельник, 29.09.2014, 20:10
 
Ответить
СообщениеНекогда разбироаться в чужих кодах.
Давайте договоримся, что ячейки-заголовки отличаются от тех, которые нужно прятать тем, что они объединённые.
Тогда всё просто (на этот раз код можно разместить и а коде листа, и в стандартном):[vba]
Код
Sub Hide_Empty_Rows()
     Dim rCell As Range, lColor&
     lColor = [MYCOLOR].Interior.Color
     With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
     For Each rCell In Range("B" & [MYCOLOR].Offset(1).Row, Cells(Rows.Count, 2).End(xlUp))
        If rCell.Interior.Color <> lColor And Not rCell.MergeCells Then
           rCell.EntireRow.Hidden = Not (Cells(rCell.Row, 4) + Cells(rCell.Row, 5))
        End If
     Next
     With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 29.09.2014 в 12:25
Лорик Дата: Понедельник, 29.09.2014, 13:26 | Сообщение № 17
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 109
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Alex_ST, понимаете, скрываются строки в которые мы вносим значения, а их скрывать не надо. Разделы состоят из пунктов, т.е. из строк (закрашенных у меня зеленной заливкой), в которой суммируются показатели занесенные в ПОДПУНКТЫ этих строк. И строки с показателями в подпунктах, должны скрываться только если в них нет данных (числа, текста). Разделы состоят из основных пунктов 1,2,3 и т.д. Но эти пункты, в свою очередь, состоят из подпунктов 1.1, 1.2, 1.3 и т.д. Они (подпункты) не должны скрываться, если в них есть данные. В таблице есть еще третий раздел, у него нет объединения ячеек, и он скрылся. А не должен. Привязка к заливке все таки не удобна.
 
Ответить
СообщениеAlex_ST, понимаете, скрываются строки в которые мы вносим значения, а их скрывать не надо. Разделы состоят из пунктов, т.е. из строк (закрашенных у меня зеленной заливкой), в которой суммируются показатели занесенные в ПОДПУНКТЫ этих строк. И строки с показателями в подпунктах, должны скрываться только если в них нет данных (числа, текста). Разделы состоят из основных пунктов 1,2,3 и т.д. Но эти пункты, в свою очередь, состоят из подпунктов 1.1, 1.2, 1.3 и т.д. Они (подпункты) не должны скрываться, если в них есть данные. В таблице есть еще третий раздел, у него нет объединения ячеек, и он скрылся. А не должен. Привязка к заливке все таки не удобна.

Автор - Лорик
Дата добавления - 29.09.2014 в 13:26
Лорик Дата: Понедельник, 29.09.2014, 13:46 | Сообщение № 18
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 109
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Некогда разбироаться в чужих кодах.

Понимаю, да особой спешки нет. На самом деле макрос который я выложила, мне подходит. Задаю проверку диапазона строк между основными пунктами, с условием, что если значение в ячейке равно нулю, то строка скрывается. В данном случае строки, закрашенные зеленой заливкой в проверку не включены и остаются открытыми. Одна ПРОБЛЕМА, как добавить условия проверки по ВТОРОМУ столбцу?!

[vba]
Код
Sub Макрос1в()
For i = 24 To 31 'задаешь номера строк для проверки условия
If Cells(i, 4) = 0 Then Rows(i).Select 'задаешь номер столбца для проверки условия
Selection.EntireRow.Hidden = True
Next i
End Sub
[/vba]
 
Ответить
Сообщение
Некогда разбироаться в чужих кодах.

Понимаю, да особой спешки нет. На самом деле макрос который я выложила, мне подходит. Задаю проверку диапазона строк между основными пунктами, с условием, что если значение в ячейке равно нулю, то строка скрывается. В данном случае строки, закрашенные зеленой заливкой в проверку не включены и остаются открытыми. Одна ПРОБЛЕМА, как добавить условия проверки по ВТОРОМУ столбцу?!

[vba]
Код
Sub Макрос1в()
For i = 24 To 31 'задаешь номера строк для проверки условия
If Cells(i, 4) = 0 Then Rows(i).Select 'задаешь номер столбца для проверки условия
Selection.EntireRow.Hidden = True
Next i
End Sub
[/vba]

Автор - Лорик
Дата добавления - 29.09.2014 в 13:46
Alex_ST Дата: Понедельник, 29.09.2014, 14:35 | Сообщение № 19
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3208
Репутация: 609 ±
Замечаний: 0% ±

2003
Лорик, для того, чтобы не скрывались строки-заголовки разделов, я предложил Вам договориться и ячейки с заголовками разделов сделать объединёнными (такими же, как у Вас в файле ячейки В16 - Объём и В34 - Расходы).
Хотя про третий (четвёртый, шестой, стодвадцатьпятый) разделы в примере ничего не говорилось, но процедуре их количество по барабану. Главное чтобы соблюдалась договорённость о том, что строки-заголовки разделов содержат объединённые ячейки.
Поймите, чтобы как-то разбираться в структуре Вашей таблицы процедуре надо указать конкретный признак строки с заголовком. Самый простой и очевидный из Вашего примера признак - объединённая ячейка. Но вполне можно и что-то другое использовать. Главное чтобы этот признак встречался только в заголовках.
Если не хотите делать объединённые ячейки в заголовках, то флаг Вам в руки. Придумывайте другой признак и пишите коды.

А по поводу лишних скрывающихся строк, то это на самом деле мой косяк в коде процедуры, да ещё плюс к тому - нестандартная реакция VBA на вообще-то стандартные переводы числовых значений в логические, используемые для сокращения кода (также как использование [MYCOLOR] вместо Range("MYCOLOR") ). Обычно всегда Excel понимает числа >0 как Истина, а =0 как Ложь. И поэтому сумма пустых или нулевых ячеек должна была быть обработана как ЛОЖЬ , а ненулевых как ИСТИНА
Ну ладно, исправил. Написал "как в учебнике". Проверил. Теперь работает.[vba]
Код
Sub Hide_Empty_Rows()
      Dim rCell As Range, lColor&
      lColor = [MYCOLOR].Interior.Color
      With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
      For Each rCell In Range("B" & [MYCOLOR].Offset(1).Row, Cells(Rows.Count, 2).End(xlUp))
         If rCell.Interior.Color <> lColor And Not rCell.MergeCells Then
            rCell.EntireRow.Hidden = Not (CBool(Cells(rCell.Row, 4) + Cells(rCell.Row, 5)))
         End If
      Next
      With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Понедельник, 29.09.2014, 14:55
 
Ответить
СообщениеЛорик, для того, чтобы не скрывались строки-заголовки разделов, я предложил Вам договориться и ячейки с заголовками разделов сделать объединёнными (такими же, как у Вас в файле ячейки В16 - Объём и В34 - Расходы).
Хотя про третий (четвёртый, шестой, стодвадцатьпятый) разделы в примере ничего не говорилось, но процедуре их количество по барабану. Главное чтобы соблюдалась договорённость о том, что строки-заголовки разделов содержат объединённые ячейки.
Поймите, чтобы как-то разбираться в структуре Вашей таблицы процедуре надо указать конкретный признак строки с заголовком. Самый простой и очевидный из Вашего примера признак - объединённая ячейка. Но вполне можно и что-то другое использовать. Главное чтобы этот признак встречался только в заголовках.
Если не хотите делать объединённые ячейки в заголовках, то флаг Вам в руки. Придумывайте другой признак и пишите коды.

А по поводу лишних скрывающихся строк, то это на самом деле мой косяк в коде процедуры, да ещё плюс к тому - нестандартная реакция VBA на вообще-то стандартные переводы числовых значений в логические, используемые для сокращения кода (также как использование [MYCOLOR] вместо Range("MYCOLOR") ). Обычно всегда Excel понимает числа >0 как Истина, а =0 как Ложь. И поэтому сумма пустых или нулевых ячеек должна была быть обработана как ЛОЖЬ , а ненулевых как ИСТИНА
Ну ладно, исправил. Написал "как в учебнике". Проверил. Теперь работает.[vba]
Код
Sub Hide_Empty_Rows()
      Dim rCell As Range, lColor&
      lColor = [MYCOLOR].Interior.Color
      With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
      For Each rCell In Range("B" & [MYCOLOR].Offset(1).Row, Cells(Rows.Count, 2).End(xlUp))
         If rCell.Interior.Color <> lColor And Not rCell.MergeCells Then
            rCell.EntireRow.Hidden = Not (CBool(Cells(rCell.Row, 4) + Cells(rCell.Row, 5)))
         End If
      Next
      With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 29.09.2014 в 14:35
Alex_ST Дата: Понедельник, 29.09.2014, 14:52 | Сообщение № 20
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3208
Репутация: 609 ±
Замечаний: 0% ±

2003
На самом деле макрос который я выложила, мне подходит
А как же Ваша просьба
Но хотелось бы макрос не привязывать к цвету (заливке), так как хочу его применять и в других аналогичных условиях (файлах), а там и разделы могут быть другие и заливка. Вообщем, по возможности, макрос нужен универсальный.
Т.е. "цветовая дифференциация штанов" и универсальность Вам уже не нужны? И судя по Вашему макросу не нужно даже автоматическое определение границ обрабатываемого диапазона, а вполне можно и "ручками" (т.е. выделением на листе) обойтись?
А по поводу Вашего вопроса о том как проверять значения в двух ячейках одновременно, то в моём предыдущем посте всё сделано.
Ваш макрос после сокращения избыточности будет выглядеть так:[vba]
Код
Sub Макрос1в()
    Dim i
    For i = 24 To 31
       Rows(i).EntireRow.Hidden = Not (CBool(Cells(i, 4) + Cells(i, 5)))
    Next i
End Sub
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
На самом деле макрос который я выложила, мне подходит
А как же Ваша просьба
Но хотелось бы макрос не привязывать к цвету (заливке), так как хочу его применять и в других аналогичных условиях (файлах), а там и разделы могут быть другие и заливка. Вообщем, по возможности, макрос нужен универсальный.
Т.е. "цветовая дифференциация штанов" и универсальность Вам уже не нужны? И судя по Вашему макросу не нужно даже автоматическое определение границ обрабатываемого диапазона, а вполне можно и "ручками" (т.е. выделением на листе) обойтись?
А по поводу Вашего вопроса о том как проверять значения в двух ячейках одновременно, то в моём предыдущем посте всё сделано.
Ваш макрос после сокращения избыточности будет выглядеть так:[vba]
Код
Sub Макрос1в()
    Dim i
    For i = 24 To 31
       Rows(i).EntireRow.Hidden = Not (CBool(Cells(i, 4) + Cells(i, 5)))
    Next i
End Sub
[/vba]

Автор - Alex_ST
Дата добавления - 29.09.2014 в 14:52
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос "Скрыть строки в пределах определенного раздела" (Макросы/Sub)
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

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