VBA根据上面的内容行自动隐藏/取消隐藏行

时间:2018-05-03 12:38:53

标签: vba excel-vba excel

有没有办法自动隐藏/取消隐藏行,具体取决于上面行的内容?

E.g。我有10行。前两行应始终可见。如果第一行中没有内容,则隐藏行3-10。如果第1行中有内容(任何内容),则第3行将被取消隐藏;如果第2行中有内容,则第4行将被取消隐藏,依此类推,直到所有10行都被取消隐藏。

在这10行之下,还有10行应该相应地隐藏/取消隐藏。

有没有办法用VBA实现这个目标?

亲切的问候,

丹尼斯

2 个答案:

答案 0 :(得分:0)

是。诀窍是将代码附加到工作表模块页面的WorkSheet.Change事件。然后,每当有人更改工作表中的任何值时,都会运行此操作。然后它只是一系列IF语句的情况,使用工作表函数COUNTA()来查看特定行中是否有任何数据,然后将所需行的rowhight设置为零(隐藏它)或者回到该行正常的任何值

所以例如

   Private Sub Worksheet_Change(ByVal Target As Range)
    Rows("3:10").RowHeight = 0 'hide everything to start
    If Application.WorksheetFunction.CountA(Rows("1:1")) > 0 Then 'if anything in row 1
    ActiveSheet.Rows(3).RowHeight = 15  'assuming your sheet has rows set to 15
    End If


End Sub

只需重复每行的if语句

答案 1 :(得分:0)

此代码适用于您可能更改的任何行。我理解这可能不是一个完整的答案,因为我不确定在更新不同的行时你想要发生什么。

它确实显示了如何使用Target来检查你刚刚更改的内容并隐藏行而不是更改行高 - 如果你隐藏一个双倍高度的行,它会将它设置为双倍高度当你取消隐藏它。

Private Sub Worksheet_Change(ByVal Target As Range)

    'Target is the cell you just changed.
    'Target.Row is the row number you just updated.
    'divide by 10 and look at the remainder - if it's 1 then you're on a multiple of 10 rows.
    'So this bit will fire on row 1, 11, 21, etc accounting for each block of 10 rows.
    If Target.Row Mod 10 = 1 Then

        'Counts the number of cells in the range that are not empty.
        'The range is the entire row of cells on the row you just changed.
        If Application.WorksheetFunction.CountA(Target.EntireRow) = 0 Then

            'Offset(2) references the cell 2 below Target.
            'Resize(8) changes the range reference to 8 rows and includes the EntireRow
            'which it then hides (so update row 1 and it hides rows 3:10,
            'update row 11 and it hides 12:20.
            Target.Offset(2).Resize(8).EntireRow.Hidden = True
        End If
    End If

    'Now check if the row you just updated is still empty.
    If Application.WorksheetFunction.CountA(Target.EntireRow) > 0 Then

        'If it's not then reference two rows down and hide that row.
        Target.Offset(2).EntireRow.Hidden = False
    End If

End Sub  

修改
第二组代码将查看10个集合中的第一行,然后查看其下方3到10行的每一行。
例如如果更新第17行,它将检查第11行,然后检查第13行到第20行。

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim x As Long
    Dim lStartRow As Long, lEndRow As Long

    lStartRow = Application.WorksheetFunction.Floor(Target.Row, 10) + 1
    lEndRow = lStartRow + 9

    If Application.WorksheetFunction.CountA(Cells(lStartRow, 1)) = 0 Then
        Cells(lStartRow, 1).Offset(2).Resize(8).EntireRow.Hidden = True
    End If

    For x = lStartRow + 2 To lEndRow

        If Application.WorksheetFunction.CountA(Cells(x, 1).EntireRow) > 0 Then
            Cells(x, 1).Offset(2).EntireRow.Hidden = False
        End If

    Next x

End Sub