有没有办法自动隐藏/取消隐藏行,具体取决于上面行的内容?
E.g。我有10行。前两行应始终可见。如果第一行中没有内容,则隐藏行3-10。如果第1行中有内容(任何内容),则第3行将被取消隐藏;如果第2行中有内容,则第4行将被取消隐藏,依此类推,直到所有10行都被取消隐藏。
在这10行之下,还有10行应该相应地隐藏/取消隐藏。
有没有办法用VBA实现这个目标?
亲切的问候,
丹尼斯
答案 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