我的数据库越来越庞大,我正试图让事情变得更易于管理。我基本上想做的是:
如果单元格 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
一切就绪了。