需要VBA宏来根据2个不同列

时间:2016-01-28 18:28:20

标签: excel-vba hide rows vba excel

下面是我用来隐藏所有行的代码" Kitchen:在第8列。如果第12列包含" No",我还需要隐藏该行。这是一个"或"声明,而不是"和"声明。 我研究了论坛,但未能找到答案。我也想加快这个过程。任何帮助,将不胜感激。

Sub FOHc()

    BeginRow = 6
    EndRow = 400
    ChkCol = 8


    For RowCnt = BeginRow To EndRow
           If Cells(RowCnt, ChkCol).Value = "Kitchen" Or Cells(RowCnt, ChkCol).Value = Blank Then
           Cells(RowCnt, ChkCol).EntireRow.Hidden = True

            Else
            Cells(RowCnt, ChkCol).EntireRow.Hidden = False

        End If
    Next RowCnt

End Sub

Spreadsheet

2 个答案:

答案 0 :(得分:0)

您可以再添加一个Or条件

If Cells(RowCnt, ChkCol).Value = "Kitchen" Or Cells(RowCnt, ChkCol).Value = Blank Or Cells(RowCnt, ChkCol2).Value = "No" Then

为了加速宏,请在开头添加Application.ScreenUpdating = False,在结尾添加Application.ScreenUpdating = True。这将在继续宏的同时停止更新您的屏幕。

答案 1 :(得分:0)

要添加另一个逻辑测试,只需添加另一个Or语句。

加快收集所有行以隐藏在范围内,并一次隐藏它们。

一般来说,使用适当的限定符也是一个好主意,语句Cells指的是Excel认为是活动表。而ThisWorkbook.Worksheets("Sheet1").Cells始终引用名为“Sheet1”的工作表。

声明所有变量可能会阻止不必要的行为和错误,通常是一种很好的做法。

这是重构的代码。

Sub FOHc()
    Dim beginRow As Long
    Dim endRow As Long
    Dim chkCol As Long
    Dim rowCnt As Long
    Dim rngResult As Range
    Dim ws As Worksheet

    beginRow = 6
    endRow = 400
    chkCol = 8

    Set ws = ThisWorkbook.Worksheets("Sheet1") 'Change this to the actual name of your sheet.

    With ws
        .Cells.EntireRow.Hidden = False 'Unhides all rows, remove line if that's not desired
        For rowCnt = beginRow To endRow
            If .Cells(rowCnt, chkCol) = "Kitchen" Or .Cells(rowCnt, chkCol) = Empty Or .Cells(rowCnt, 12) = "No" Then
                If rngResult Is Nothing Then
                    Set rngResult = .Cells(rowCnt, 1)
                Else
                    Set rngResult = Union(rngResult, .Cells(rowCnt, 1))
                End If
            End If
        Next rowCnt
    End With

    If Not rngResult Is Nothing Then rngResult.EntireRow.Hidden = True

End Sub