2014-12-15 2 views
1

Я пытаюсь скрыть/показать строки на основе определенных значений ячеек. Пока мой код работает и находится ниже: Однако я также пытаюсь показать строки между строками «да» «нет». например, строка 11-15 начинается, как показано. Строка 15 имеет ответы «да» или «нет». Выбрав «да», мне нужно показать 16-20. но на данный момент я могу показать только 20 (столбец 8 - выбор для да/нет, а столбец 11 - смещение, а в столбце 12 в настоящее время содержится число, которое нужно пропустить ... так что столбец 15 строки 12 содержит «20». но мне нужно, чтобы это было 16-20). Как я могу это решить? СпасибоVBA Скрыть/показать строки на основе конкретных ответов

Private Sub Worksheet_Change(ByVal Target As Range) 

If Target.Count > 1 Then 

For Each cel In Target 
     Call Worksheet_Change(cel) 
     Next cel 
End If 
If Target.Column = 8 Then 

    If LCase(Target.Value) = LCase(Target.Offset(, 3)) Then 
    Cells(Target.Offset(, 4), 1).EntireRow.Hidden = False 
Else 

    Cells(Target.Offset(, 4), 1).EntireRow.Hidden = True 

End If: End If 

End Sub 

ответ

0

Самый простой способ сделать это - использовать петлю. То, что вы хотите сделать, это скрыть каждую строку в цикле, например, этот цикл будет скрывать строки 1-3

For i=1 to 3 
    Rows(i).EntireRow.Hidden = True 
Next 

Если я understnad ваши настройки правильно столбец 8 содержит «да/нет». Столбец 11 содержит смещение строки для запуска (un) сокрытия строк. В столбце 12 указано, где остановить (un) скрытие строк.

Я буду использовать следующие обозначения для указания адреса ячейки (строка, столбец)

Назад к вашему примеру, если (15,8) говорит «да», то вы UNHIDE строки 16,17, 18,19, . Это означает, что (15,11) будет содержать , поскольку смещение, чтобы получить к строке 16 является CURRENT_ROW + 1, где текущая строка клеток (15,12) содержит , так как это последней строке для перехода к. Просто используйте значение из ячейки (15,11) в начале вашего цикла и значение в ячейке (15,12) в качестве значения стоп

Private Sub Worksheet_Change(ByVal Target As Range) 
 
    'defines some constants 
 
    Const iYES_NO_COL = 8 
 
    Const iOFFSET_COL = 11 
 
    Const iSKIP_TO_COL = 12 
 
    
 
    If Target.Count > 1 Then 
 
    
 
     For Each cel In Target 
 
       Call Worksheet_Change(cel) 
 
       Next cel 
 
     End If 
 
    ElseIf Target.Count = 1 Then 
 
     'im not sure what this does so i left it 
 
     If Target.Column = 8 Then 
 
      
 
      If LCase(Target.Value) = LCase(Target.Offset(, 3)) Then 
 
      Cells(Target.Offset(, 4), 1).EntireRow.Hidden = False 
 
     Else 
 
       Cells(Target.Offset(, 4), 1).EntireRow.Hidden = True 
 
     
 
     End If 
 
     
 
     If (Target.Column = iYES_NO_COL) Then 
 
      '  takes the current row + the value in the offset cell 
 
      my_start = Target.Row + Cells(Target.Row, iOFFSET_COL).Value 
 
      
 
      '  takes the value from the SKIP_TO_COL 
 
      my_stop = Cells(Target.Row, iSKIP_TO_COL).Value 
 
     
 
      'target should be only one cell at this point, see if it 
 
      'contains the word no 
 
      If (StrComp(Trim(LCase(Target.Value)), "no") = 0) Then 
 
      
 
       'hides all the rows between the start and stop value 
 
       For i = my_start To mystop 
 
        Rows(i).EntireRow.Hidden = True 
 
       Next 
 
      ElseIf (StrComp(Trim(LCase(Target.Value)), "yes") = 0) Then 
 
       
 
       'unhides all the rows between the start and stop value 
 
       For i = my_start To mystop 
 
        Rows(i).EntireRow.Hidden = False 
 
       Next 
 
      End If 
 
    End If 
 

 
End Sub

Смежные вопросы