当我有两个条件时宏不起作用

时间:2019-01-25 09:55:57

标签: excel vba if-statement

我正在尝试创建一个跟踪器,当从下拉列表中选择“按时关闭”或“较晚关闭”时,它会自动隐藏整个行。我目前正在使用下面的代码,因为迟到而关闭,但没有按时关闭。有人可以帮忙吗?

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

1 个答案:

答案 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