根据多个单元格隐藏行

根据多个单元格隐藏行

我的数据库越来越庞大,我正试图让事情变得更易于管理。我基本上想做的是:

如果单元格 E:E =“完成”,则隐藏相应行
;否则,如果单元格 F:F =“完成”,则隐藏相同/相应的行

这将持续一年 52 周,加上无限数量的行,具体取决于数据

我尝试了一个简单的代码:

Private Sub Worksheet_Change(check)

    If Range("E:Z") = Complete Then
        Rows("3:7000").EntireRow.Hidden = True
    Else
        Rows("3:7000").EntireRow.Hidden = False
    End If

这可以编译,但是没有发生其他事情。

任何帮助都将非常有帮助。

答案1

好的,让我们把它分开。

您的命令将整行和整列作为块处理,但它们实际上并不评估当前单元格。VBA 中的文本值必须放在双引号内,否则 Excel 会认为这是一个命名变量或对象。

据我了解,您需要查看 E 到 Z 列以查找要输入的单词“Complete”。Worksheet_Change 事件作用于 Target,即已更改的单元格。要查看单元格是否位于 E 到 Z 列中,您可以检查 Target 是否与该范围相交。

Intersect(Target, Range("E:Z"))

此命令返回一个范围对象。如果更改的单元格不在指定范围内,则不会返回任何内容。因此,下一个命令有点双重否定,但我们希望在相交对象是不是什么也没有。写如下

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
'   do something
End If

接下来,您要检查目标单元格的值是否为“Complete”。最好不区分大小写,因此将目标包装到 a 中UCase即可解决此问题。

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        ' some code to hide the row
    End If
End If

隐藏行的代码需要获取目标单元格的行号。这可以通过 来完成Target.Row,然后可以将其输入到与Rows()您使用的命令类似的命令中,但仅适用于目标单元格的行。

Rows(Target.Row).EntireRow.Hidden = True

到目前为止代码如下

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        Rows(Target.Row).EntireRow.Hidden = True
    End If
End If

End Sub

... 这对单个行有效。但是,如果您一次性将“Complete”复制到多个行中,则目标将包含多个行,并且需要调整代码以反映这一点。声明一个名为 cel 的范围,然后循环遍历目标范围中的每个 cel。UCase 和 Rows 命令现在需要处理cel而不是Target

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cel As Range
If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    For Each cel In Target
        If UCase(cel.Value) = "COMPLETE" Then
            Rows(cel.Row).EntireRow.Hidden = True
        End If
    Next cel
End If

End Sub

一切就绪了。

相关内容