Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Скрыть/показать строку по условию в excel Добавлено: 10.02.09 14:07  

Автор вопроса:  abv
Доброго времени суток!
Есть ли решение для задачи:
=если(ячейка=0;скрыть строку;показать строку)?
Пока попытки создать функцию на VBA самостоятельно успеха не принесли. Буду благодарен, даже если кто-нибудь твердо ответит НЕТ РЕШЕНИЯ.

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 AngryBadger



Вопросов: 33
Ответов: 245
 Профиль | | #1 Добавлено: 10.02.09 14:32
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Cells(1, 1).Value = 0 Then
        Rows(3).Hidden = True
    Else
        Rows(3).Hidden = False
    End If
End Sub

Ответить

Номер ответа: 2
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #2
Добавлено: 10.02.09 15:24
Больше всего подходит Автофильтр. Он для того только и служит, чтоб отображать строки по условию.

Михаил, идея верная. Только есть к чему придраться:
1. Почему мы это делаем в событии Worksheet_SelectionChange?
2. У тебя Target никак не используется и почему-то проверяется исключительно A1 и при этом скрывается другая - третья стрка.

Если макросом, то я бы сделал примерно так:
  1. Sub HideZeros(j As Long) 'j - номер столбца для проверки
  2.     Dim i As Long
  3.     For i = 1 to 65536
  4.         If Cells(i, j).Value = 0
  5.             Rows(i).Hidden = True
  6.         Else
  7.             Rows(i).Hidden = False
  8.         End If
  9.     Next i
  10. End Sub

Ответить

Номер ответа: 3
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #3
Добавлено: 10.02.09 15:28
А если надо скрывать также пустые строки, то можно еще так:
  1. Sub HideZeros(j As Long) 'j - номер столбца для проверки
  2.     Dim i As Long
  3.     For i = 1 to 65536
  4.         If Cells(i, j).Value = 0 Or Cells(i, j).Value = Empty
  5.             Rows(i).Hidden = True
  6.         Else
  7.             Rows(i).Hidden = False
  8.         End If
  9.     Next i
  10. End Sub


Вызывать из другой подпрограммы или обработчика (пример для 1-го столбца):
  1. Call HideZeros(1)

Ответить

Номер ответа: 4
Автор ответа:
 AngryBadger



Вопросов: 33
Ответов: 245
 Профиль | | #4 Добавлено: 10.02.09 15:54
почему-то проверяется исключительно A1 и при этом скрывается другая - третья стрка.
- для примера
Почему мы это делаем в событии Worksheet_SelectionChange?
- это стандартное событие листа, можно использовать другое. Почему нет))
(ByVal Target As Range)
- согласен...ненужно.

Ответить

Номер ответа: 5
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #5
Добавлено: 10.02.09 16:24
Михаил,
угу, мне ясно )

Ответить

Номер ответа: 6
Автор ответа:
 fAndOrIn



Вопросов: 5
Ответов: 344
 Профиль | | #6 Добавлено: 10.02.09 18:27
Для начала неплохо было бы уточнить у автора вопроса, что значит в его случае ячейка=0?
Действительно в ней находится число 0 или это просто пустая ячейка или нужно скрыть строки в любом из данных случаев?
Пример от mc-black может подсказать решение для дюбого из этих вариантов, но...
Если привязать его к Worksheet_SelectionChange, то жизнь из-за жутких тормозов медом не покажется.
Чуть облегчить участь кнопкодава поможет следущее решение:
  1. Sub hidZ(ByVal C As Byte)
  2.   Dim Rn As Range
  3.   Dim R As Long
  4.   Set Rn = ActiveSheet.UsedRange
  5.   For R = Rn(1).Row To Rn(Rn.Count).Row
  6.     If Cells(R, C) = 0 And Cells(R, C) <> "" Then 'скрыть только 0
  7.     'If Cells(R, C) = "" Then                     'скрыть только ""
  8.     'If Cells(R, C) = 0 Or Cells(R, C) = "" Then  'скрыть 0 и ""
  9.       Rows(R).Hidden = True
  10.     End If
  11.   Next R
  12.   Range(Cells(R, 1), Cells(65536, 256)).RowHeight = 0 'если надо скрыть строки ниже занятой области
  13. End Sub

Ответить

Номер ответа: 7
Автор ответа:
 abv



Вопросов: 4
Ответов: 16
 Профиль | | #7 Добавлено: 11.02.09 13:40
Спасибо всем за ответы.
Я не правильно сформулировал вопрос. С автофильтром уже пробовал, работает, но требуется щелкнуть кнопку. Это и есть проблема. Менеджеры щелкают не по кнопке "печатать лист", которая запускает макрос, а по названию листа и потом печатают как обычно (они так привыкли). В результате в бланке присутствует много лишних строк. Если нельзя скрыть/показать строки по их значению, то может быть можно запустить макрос при активации листа (примерно также, как в автозапуске работает команда OnDoubleClick)?

Ответить

Номер ответа: 8
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #8
Добавлено: 11.02.09 14:23
Ну вызывай

  1. Private Sub Worksheet_Activate()
  2.     'Здесь
  3.     Call HideZeros(1)
  4. End Sub

Ответить

Номер ответа: 9
Автор ответа:
 abv



Вопросов: 4
Ответов: 16
 Профиль | | #9 Добавлено: 17.02.09 06:21
Спасибо mc-black! Сработало как надо.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам