我正在尝试创建一个跟踪器,当从下拉列表中选择“按时关闭”或“较晚关闭”时,它会自动隐藏整个行。我目前正在使用下面的代码,因为迟到而关闭,但没有按时关闭。有人可以帮忙吗?
Private Sub Worksheet_Change(ByVal Target As Range)
BeginRow = 3
EndRow = 700
ChkCol = 14
For RowCnt = BeginRow To EndRow
If (Cells(RowCnt, ChkCol)(.Value = "Closed late")) And (.Value = "Closed on time") Then
Cells(RowCnt, ChkCol).EntireRow.Hidden = True
Else
Cells(RowCnt, ChkCol).EntireRow.Hidden = False
End If
Next RowCnt
End Sub
答案 0 :(得分:1)
问题在于
If (Cells(RowCnt, ChkCol)(.Value = "Closed late")) And (.Value = "Closed on time") Then
是无效的语法。应该是
If Cells(RowCnt, ChkCol).Value = "Closed late" And Cells(RowCnt, ChkCol).Value = "Closed on time") Then
尽管如此,我还是建议进行以下改进:
使用Intersect(Target, Target.Parent.Range(Cells(BeginRow, ChkCol), Cells(EndRow, ChkCol)))
,可以确保代码仅在第14列中已更改的单元格上运行。因此,您不会循环访问不必要的未更改的单元格。
我还建议激活Option Explicit
:在VBA编辑器中,转到工具› 选项› Require Variable Declaration
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim BeginRow As Long
BeginRow = 3
Dim ChkCol As Long
ChkCol = 14
Dim EndRow As Long
EndRow = 700 'could be replaced with dynamic solution below
'EndRow = Target.Parent.Cells(Target.Parent.Rows.Count, ChkCol).End(xlUp).Row
Dim ChangedCells As Range
Set ChangedCells = Intersect(Target, Target.Parent.Range(Cells(BeginRow, ChkCol), Cells(EndRow, ChkCol)))
If Not ChangedCells Is Nothing Then
Dim Cell As Range
For Each Cell In ChangedCells
If Cell.Value = "Closed late" Or _
Cell.Value = "Closed on time" Then
Cell.EntireRow.Hidden = True
End If
Next Cell
End If
End Sub