Alex_ST, Вы злитесь, это плохо. Я четко описала условия и приложила свою таблицу, которая, состоит из ТРЕХ разделов. И в последнем разделе (окрашен жёлтой заливкой) ячейки не могут быть объедены, так как показатели формируются на основании выше внесенных данных, по каждому столбцу (т.е. цифры есть в каждой ячейке).
И судя по Вашему макросу не нужно даже автоматическое определение границ обрабатываемого диапазона
А разве здесь не задается диапазон? С 24 строки по 31 строку? Alex_ST, не обижайтесь, сторожилы форума зря зачастую обвиняют новичков в том, что они не правильно излагают свои вопросы и просьбы, и не внимательно читают ответы. В моем вопросе все было достаточно четко изложено и описано в приложенных файлах. Видимо мы видим результат каждый по своему. Последний вариант работает (СПАСИБО). Не злитесь, скажите как перечислить все диапазоны строк, чтобы не делать на каждый отдельный макрос? [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, Вы злитесь, это плохо. Я четко описала условия и приложила свою таблицу, которая, состоит из ТРЕХ разделов. И в последнем разделе (окрашен жёлтой заливкой) ячейки не могут быть объедены, так как показатели формируются на основании выше внесенных данных, по каждому столбцу (т.е. цифры есть в каждой ячейке).
И судя по Вашему макросу не нужно даже автоматическое определение границ обрабатываемого диапазона
А разве здесь не задается диапазон? С 24 строки по 31 строку? Alex_ST, не обижайтесь, сторожилы форума зря зачастую обвиняют новичков в том, что они не правильно излагают свои вопросы и просьбы, и не внимательно читают ответы. В моем вопросе все было достаточно четко изложено и описано в приложенных файлах. Видимо мы видим результат каждый по своему. Последний вариант работает (СПАСИБО). Не злитесь, скажите как перечислить все диапазоны строк, чтобы не делать на каждый отдельный макрос? [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
Sub selcase() Dim i For i = 16 To 101 Select Case i Case 24 To 31 Case 36 To 66 Case 68 To 71 Case 73 To 82 Case 86 To 91 Case 93 To 97 Case Else: GoTo xxx End Select Rows(i).EntireRow.Hidden = Not (CBool(Cells(i, 4) + Cells(i, 5))) xxx: Next i End Sub
[/vba]Хотя, наверное, можно было бы придумать что-нибудь покрасивее. Терпеть не могу GoTo и меток. Но что-то на скорую руку ничего проще на ум не приходит. Другой вопрос, а что Вы будете делать, когда понадобится в таблице (ну пусть в другом похожем файле) убрать или добавить где-то стоку? Опять руками все диапазоны прописывать? Фу, какая гадость! А по поводу того, чтобы Вы сами придумали признак, отличающий строки заголовков от обрабатываемых, так я говорил абсолютно серьёзно. Предложите что-нибудь. Ну, на вскидку, например, не объединённая, а закрашенная в определённый цвет ячейка. Но только для того, чтобы не задавать этот цвет его кодом в программе, поступите так же как я сделал ещё в первом примере - дайте какое-нибудь имя ячейке, содержащей образец цвета для заголовка, а в начале процедуры считывайте его и используйте для сравнения в условиях внутри цикла..
Ну, например, тупо в лоб:[vba]
Код
Sub selcase() Dim i For i = 16 To 101 Select Case i Case 24 To 31 Case 36 To 66 Case 68 To 71 Case 73 To 82 Case 86 To 91 Case 93 To 97 Case Else: GoTo xxx End Select Rows(i).EntireRow.Hidden = Not (CBool(Cells(i, 4) + Cells(i, 5))) xxx: Next i End Sub
[/vba]Хотя, наверное, можно было бы придумать что-нибудь покрасивее. Терпеть не могу GoTo и меток. Но что-то на скорую руку ничего проще на ум не приходит. Другой вопрос, а что Вы будете делать, когда понадобится в таблице (ну пусть в другом похожем файле) убрать или добавить где-то стоку? Опять руками все диапазоны прописывать? Фу, какая гадость! А по поводу того, чтобы Вы сами придумали признак, отличающий строки заголовков от обрабатываемых, так я говорил абсолютно серьёзно. Предложите что-нибудь. Ну, на вскидку, например, не объединённая, а закрашенная в определённый цвет ячейка. Но только для того, чтобы не задавать этот цвет его кодом в программе, поступите так же как я сделал ещё в первом примере - дайте какое-нибудь имя ячейке, содержащей образец цвета для заголовка, а в начале процедуры считывайте его и используйте для сравнения в условиях внутри цикла..Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Понедельник, 29.09.2014, 20:14
Вот, например, я в Вашем файле кроме имени MYCOLOR, присвоенного ячейке с образцом цвета не скрываемой строки, присвоил имя HEADCOLOR ячейке А15, где у Вас заголовок "Условия", и закрасил эту ячейку А15 в тот же светло-жёлтый цвет, что и не скрываемые заголовки. Получилось вот что:[vba]
Код
Sub Hide_Empty_Rows() Dim rCell As Range, lColor&, lHColor& lColor = [MYCOLOR].Interior.Color lHColor = [HEADCOLOR].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.Interior.Color = lHColor 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]
Вот, например, я в Вашем файле кроме имени MYCOLOR, присвоенного ячейке с образцом цвета не скрываемой строки, присвоил имя HEADCOLOR ячейке А15, где у Вас заголовок "Условия", и закрасил эту ячейку А15 в тот же светло-жёлтый цвет, что и не скрываемые заголовки. Получилось вот что:[vba]
Код
Sub Hide_Empty_Rows() Dim rCell As Range, lColor&, lHColor& lColor = [MYCOLOR].Interior.Color lHColor = [HEADCOLOR].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.Interior.Color = lHColor 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
Alex_ST, слава богу, Вы не злитесь! Я не умею создавать коды (я простой экономист). Сленг программистов мне вообщем-то не понятен. И надеялась я на то, что знающие в этой сфере люди смогут проанализировать мои условия и написать все правильно. Макрос который есть у меня, то же списанный у кого-то. Поэтому в его пользе и правильности ничего и не утверждаю. Думала, он может как-то побыстрее решит мою задачу, с учетом Ваших корректировок. Ну да ладно. Alex_ST, с именной ячейкой я все поняла. А если таблица не будет "разукрашена"?! Поясните, пожалуйста простому экономисту значение строки в коде: [vba]
Код
Rows(i).EntireRow.Hidden = Not (CBool(Cells(i, 4) + Cells(i, 5)))
[/vba]
Alex_ST, слава богу, Вы не злитесь! Я не умею создавать коды (я простой экономист). Сленг программистов мне вообщем-то не понятен. И надеялась я на то, что знающие в этой сфере люди смогут проанализировать мои условия и написать все правильно. Макрос который есть у меня, то же списанный у кого-то. Поэтому в его пользе и правильности ничего и не утверждаю. Думала, он может как-то побыстрее решит мою задачу, с учетом Ваших корректировок. Ну да ладно. Alex_ST, с именной ячейкой я все поняла. А если таблица не будет "разукрашена"?! Поясните, пожалуйста простому экономисту значение строки в коде: [vba]
Код
Rows(i).EntireRow.Hidden = Not (CBool(Cells(i, 4) + Cells(i, 5)))
А по поводу того, чтобы Вы сами придумали признак, отличающий строки заголовков от обрабатываемых, так я говорил абсолютно серьёзно. Предложите что-нибудь.
Ну поймите, программа же не смотрит как человек, осмысливая и додумывая своим мозгом увиденное, а тупо просматривает и анализирует данные в заданном ей месте и по указанным ей признакам. Ну как по-Вашему она должна узнать, что в строке заголовок и его прятать нельзя? Не нравится цвет фона ячейки, так возьмите цвет шрифта. Ну, или в конце-концов скажите, что в столбце С (ед.изм.) там должно быть пусто... Хотя для раздела III это правило не работает Так может быть всё-таки структуру таблицы проще подправить под возможности программы, а не программу под структуру данных? ------------------------------------------ Rows(i).EntireRow.Hidden - надеюсь, пояснения не требует? Это управление свойством Hidden (скрыто) строки, заданной Rows(i).EntireRow CBool - оператор преобразования числа-аргумента в логическую переменную (Булева алгебра). Если аргумент=0, то CBool вернёт False (ЛОЖЬ), если аргумент >0 , то Cbool вернёт True (ИСТИНА) Not - инверсия логического значения. Т.е. если сумма ячеек текущей строки i в столбцах D и E (Cells(i, 4) + Cells(i, 5)) больше 0, то CBool (Cells(i, 4) + Cells(i, 5)) = True , значит Not (CBool(Cells(i, 4) + Cells(i, 5))) = True , следовательно свойство Hidden этой строки будет установлено в True и строка будет скрыта. Но вообще-то практически всё это есть в Справке. Просто встаёте курсором не незнакомую Вам команду, метод, свойство, нажимаете F1 и читаете Справку.
А по поводу того, чтобы Вы сами придумали признак, отличающий строки заголовков от обрабатываемых, так я говорил абсолютно серьёзно. Предложите что-нибудь.
Ну поймите, программа же не смотрит как человек, осмысливая и додумывая своим мозгом увиденное, а тупо просматривает и анализирует данные в заданном ей месте и по указанным ей признакам. Ну как по-Вашему она должна узнать, что в строке заголовок и его прятать нельзя? Не нравится цвет фона ячейки, так возьмите цвет шрифта. Ну, или в конце-концов скажите, что в столбце С (ед.изм.) там должно быть пусто... Хотя для раздела III это правило не работает Так может быть всё-таки структуру таблицы проще подправить под возможности программы, а не программу под структуру данных? ------------------------------------------ Rows(i).EntireRow.Hidden - надеюсь, пояснения не требует? Это управление свойством Hidden (скрыто) строки, заданной Rows(i).EntireRow CBool - оператор преобразования числа-аргумента в логическую переменную (Булева алгебра). Если аргумент=0, то CBool вернёт False (ЛОЖЬ), если аргумент >0 , то Cbool вернёт True (ИСТИНА) Not - инверсия логического значения. Т.е. если сумма ячеек текущей строки i в столбцах D и E (Cells(i, 4) + Cells(i, 5)) больше 0, то CBool (Cells(i, 4) + Cells(i, 5)) = True , значит Not (CBool(Cells(i, 4) + Cells(i, 5))) = True , следовательно свойство Hidden этой строки будет установлено в True и строка будет скрыта. Но вообще-то практически всё это есть в Справке. Просто встаёте курсором не незнакомую Вам команду, метод, свойство, нажимаете F1 и читаете Справку.Alex_ST
Вот дома слепил пример по крайнему своему варианту, добавив комментарии. В ячейке с именем MYCOLOR задаётся образец цвета, при котором не нужно скрывать строку даже если данные в ячейках D и Е равны нулю. Эта же ячейка показывает начало обрабатываемой таблицы. В ячейке с именем HEADCOLOR задаётся образец цвета строк заголовков. Такие строки скрывать не надо.
К стати, обратите внимание на количество имён в книге. Не многовато ли? Да ещё и с формулами из английской локализации Excel?
Вот дома слепил пример по крайнему своему варианту, добавив комментарии. В ячейке с именем MYCOLOR задаётся образец цвета, при котором не нужно скрывать строку даже если данные в ячейках D и Е равны нулю. Эта же ячейка показывает начало обрабатываемой таблицы. В ячейке с именем HEADCOLOR задаётся образец цвета строк заголовков. Такие строки скрывать не надо.
К стати, обратите внимание на количество имён в книге. Не многовато ли? Да ещё и с формулами из английской локализации Excel?Alex_ST
Alex_ST, спасибо Вам, все варианты работают. К вопросу об универсальности: А если в ячейках будут проставляться не числовые значения, а текст? Попробовала в ячейки внести текстовые значения. Макрос скрывает строки, но при этом выдается сообщение Type mismatch (несоответствие типов).
А наличие других имен, так таблица скопирована из другого файла.
Alex_ST, спасибо Вам, все варианты работают. К вопросу об универсальности: А если в ячейках будут проставляться не числовые значения, а текст? Попробовала в ячейки внести текстовые значения. Макрос скрывает строки, но при этом выдается сообщение Type mismatch (несоответствие типов).
А наличие других имен, так таблица скопирована из другого файла.Лорик
Попробовала его в своем файле, макрос скрывает все строки, в которых есть показатели (а это не нужно) и оставляет только те, что закрашены зеленым цветом. Скрывать нужно строки в которых нет данных, но те строки которые являются названиями пунктов в разделе (т.е являются сводной строкой по показателям которые в неё входят) скрываться не должны. Т.е при формировании таблицы на печать пользователь может видеть что, например, по пункту В раздела II показатели равны нулю.
понимаете, скрываются строки в которые мы вносим значения, а их скрывать не надо. Разделы состоят из пунктов, т.е. из строк (закрашенных у меня зеленной заливкой), в которой суммируются показатели занесенные в ПОДПУНКТЫ этих строк. И строки с показателями в подпунктах, должны скрываться только если в них нет данных (числа, текста). Разделы состоят из основных пунктов 1,2,3 и т.д. Но эти пункты, в свою очередь, состоят из подпунктов 1.1, 1.2, 1.3 и т.д. Они (подпункты) не должны скрываться, если в них есть данные.
Wasilic, спасибо, что присоединились. В вашем варианте та же проблема:
Попробовала его в своем файле, макрос скрывает все строки, в которых есть показатели (а это не нужно) и оставляет только те, что закрашены зеленым цветом. Скрывать нужно строки в которых нет данных, но те строки которые являются названиями пунктов в разделе (т.е являются сводной строкой по показателям которые в неё входят) скрываться не должны. Т.е при формировании таблицы на печать пользователь может видеть что, например, по пункту В раздела II показатели равны нулю.
понимаете, скрываются строки в которые мы вносим значения, а их скрывать не надо. Разделы состоят из пунктов, т.е. из строк (закрашенных у меня зеленной заливкой), в которой суммируются показатели занесенные в ПОДПУНКТЫ этих строк. И строки с показателями в подпунктах, должны скрываться только если в них нет данных (числа, текста). Разделы состоят из основных пунктов 1,2,3 и т.д. Но эти пункты, в свою очередь, состоят из подпунктов 1.1, 1.2, 1.3 и т.д. Они (подпункты) не должны скрываться, если в них есть данные.
есть ли смысл, но может быть добавить еще дополнительный столбец (слева) и в нем пометить пункты определенным знаком?
Ещё какой смысл! Всё намного упростится. А если Вы в этом дополнительном столбце ещё и формулу пропишете, которая будет вычислять скрываемые и не скрываемые строки, то вообще макрос будет не нужен. Можно будет автофильтром обойтись
есть ли смысл, но может быть добавить еще дополнительный столбец (слева) и в нем пометить пункты определенным знаком?
Ещё какой смысл! Всё намного упростится. А если Вы в этом дополнительном столбце ещё и формулу пропишете, которая будет вычислять скрываемые и не скрываемые строки, то вообще макрос будет не нужен. Можно будет автофильтром обойтись Alex_ST
Проверил на Вашем реальном примере свои процедуры. ИМХО, всё работает. Что не устраивает-то? Цвет ячейки "Условия" (А15)? Ну так дайте имя HEADCOLOR не этой ячейке, а любой другой в любой строке заголовка чтобы указать программе, оттуда брать образец цвета. А по поводу текстовых значений я уже ответил сегодня здесь.
Проверил на Вашем реальном примере свои процедуры. ИМХО, всё работает. Что не устраивает-то? Цвет ячейки "Условия" (А15)? Ну так дайте имя HEADCOLOR не этой ячейке, а любой другой в любой строке заголовка чтобы указать программе, оттуда брать образец цвета. А по поводу текстовых значений я уже ответил сегодня здесь.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Вторник, 30.09.2014, 11:00
Sub Мяу() Dim i& Application.ScreenUpdating = False For i = Cells(Rows.Count, "F").End(xlUp).Row To 16 Step -1 If Len(Cells(i, "D")) Then Else If Len(Cells(i, "E")) Then Else If Len(Cells(i, "F")) Then Rows(i).Hidden = True End If End If End If Next Application.ScreenUpdating = True End Sub
[/vba]
[vba]
Код
Sub Мяу() Dim i& Application.ScreenUpdating = False For i = Cells(Rows.Count, "F").End(xlUp).Row To 16 Step -1 If Len(Cells(i, "D")) Then Else If Len(Cells(i, "E")) Then Else If Len(Cells(i, "F")) Then Rows(i).Hidden = True End If End If End If Next Application.ScreenUpdating = True End Sub