VBA根据具体答案隐藏/取消隐藏行

时间:2014-12-15 16:56:55

标签: excel vba

我试图根据特定的单元格值隐藏/取消隐藏行。到目前为止我的代码工作,如下: 但是,我也试图在“是”“否”行之间显示行。例如,第11-15行开始如图所示。第15行有“是”或“否”的答案。选择“是”后,我需要显示16-20。但截至目前,我只能显示20(第8列是选择是/否,第11列是偏移,第12列目前包含要跳过的数字......所以第15行第12列包含“20”..但是我需要16-20岁。我该如何解决这个问题?谢谢

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

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用循环。你想要做的是隐藏循环中的每一行,例如这个循环将隐藏行1-3

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

如果我正确地进行了设置,则第8列包含"是/否"。第11列包含一个行偏移量以启动(un)隐藏行。第12列告诉停止(取消)隐藏行的位置。

我将使用以下符号表示单元格地址(行,列)

如果(15,8)说"是"请回到您的示例然后你取消隐藏第16,17,18,19行, 20 。这意味着(15,11)将包含 1 ,因为到达第16行的偏移量是current_row + 1,其中当前行 15 cell (15,12)包含 20 ,因为它是要跳到的最后一行。只需使用单元格(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