我正在尝试比较几家公司 (a、b、c、d) 的详细信息,这些详细信息显示在单元格 A1 和 B1 的下拉列表中。我使用 VBA 例程(如下所示)在整行没有值时隐藏行,但即使有一个值也保持未隐藏状态
对于此示例 1,例程不应隐藏任何行,但它隐藏了第 2 行和第 3 行,但第 4 行未被隐藏
A B
1 Company A Company B
2 las vegas
3 boston
4 north north
我如何确保 VBA 不会隐藏示例中的第 2 行和第 3 行?
我使用了以下代码:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, c As Range
Set r = range[a2:b3]
Application.ScreenUpdating = False
For Each c In r
If Len(c.Value) > 0 Then
c.EntireRow.Hidden = False
Else
c.EntireRow.Hidden = True
End If
Next c
Application.ScreenUpdating = True
End Sub
我上面使用的 VBA 仅适用于一列值,而不适用于用于比较的多列值。
我怎样才能做到这一点?
答案1
我对你的问题有点困惑。当我尝试运行你的程序时,它立即阻塞了Set r =
,因为Union()
必须给出至少两个参数。但是,当我将其更改为时Set r = [a2:b3]
,它会运行,并隐藏第 2 行,但不会隐藏第 3 行。
这正是我期望例程做的事情。
它逐个查看范围内的每个单元格A2:B3
,然后对其采取行动。它会从上到下遍历该范围,然后从每行的左到右遍历该范围。(至少这是默认行为;也许可以更改它。)因此,会发生以下情况:
- 看看单元格
A2
。它有一个值,所以我们联合国隐藏第 2 行。 - 查看单元格
B2
。它没有值,因此我们隐藏第 2 行。 - 查看单元格
A3
。它没有值,因此我们隐藏第 3 行。 - 看看单元格
B3
。它有一个值,所以我们联合国隐藏第 3 行。
因此第 2 行最终被隐藏,而第 3 行最终被取消隐藏。
你需要看的是范围,而不是仅仅看一堆细胞,但作为一组行(每行都是一组单元格)。您需要另一个变量,它将采用逻辑(True/False)值。对于每一行,首先将变量设置为 True,这意味着“是的,据我所知,此行没有任何数据。”然后,对于该行中的每个单元格,如果该单元格有值,则将变量设置为 False,这意味着“不,此行不为空。”并且,在查看完一行中的每个单元格后,将该行的Hidden
属性设置为变量的值。