簡體   English   中英

Excel VBA:如果在過濾范圍上的語句

[英]Excel VBA: If Statement on Filtered Range

我在C到K列中一次過濾了一系列數據,以“是”過濾,一次過濾一列。 過濾范圍后,我想逐行檢查第2列中的字母“ R”或“ C”。 如果有一個RI,則將1加到R_counter ,同樣將Cs加1。 不幸的是,我的櫃台上的數字完全古怪。 我懷疑當我過濾范圍並告訴它檢查第2行到剩下多少行時,可能與它有關,這是在檢查實際的行號,而不只是向下移動一行,如果這樣的話。 有任何想法嗎?

*注意:如果我的描述沒有意義:基本上,我對R或C是否有更多標題1-9感興趣。

這是我正在使用的數據格式

這是我得到的以及我希望得到的: 在此處輸入圖片說明

For z = 3 To LstSpecCol 
        R_counter = 0
        C_counter = 0
        If (WS_Sel.AutoFilterMode And WS_Sel.FilterMode) Or WS_Sel.FilterMode Then
        WS_.ShowAllData
        End If

        WS_Sel.Range(WS_Sel.Cells(1, 1), WS_Sel.Cells(counter + 1, LstCol1)).AutoFilter _
        Field:=z, Criteria1:="Yes"

        With WS_Sel
        Set rngFilter_Yes = Intersect(.UsedRange, .UsedRange.Offset(1), _
        .Columns(z)).SpecialCells(xlCellTypeVisible)
        LstRow_Yes = rngFilter_Yes.Cells.Count
        End With

        For t = 2 To LstRow_Yes
           If WS_Sel.Cells(t, 2) = "R" Then
            R_counter = R_counter + 1
           Else
            C_counter = C_counter + 1
           End If
        Next t
    Next z

我對代碼進行了一些重構,並對其進行了測試以產生所需的結果。

值得注意的是:

  • 我遍歷了FilteredRange每個Cell (在問題中的寫法是將每個Row從2循環到filterrange的末尾,后者在過濾器之外拾取行。
  • 我使用Select Case測試RC (主要是因為我認為它更干凈)。
  • 我在過濾范圍內使用了第2列來測試R/C ? 直接列。
  • 我將整個內容放在With以幫助其更快地處理。

碼:

With WS_Sel

    For Z = 3 To LstSpecCol

        R_Counter = 0
        C_Counter = 0

        If (.AutoFilterMode And .FilterMode) Or .FilterMode Then
            .ShowAllData
        End If

        .Range(.Cells(1, 1), .Cells(counter, LstCol1)).AutoFilter Field:=Z, Criteria1:="Yes"

        Set rngFilter_Yes = Intersect(.UsedRange, .UsedRange.Offset(1), .Columns(2)).SpecialCells(xlCellTypeVisible)

        For Each cel In rngFilter_Yes
            Select Case cel
                Case Is = "R": R_Counter = R_Counter + 1
                Case Is = "C": C_Counter = C_Counter + 1
            End Select
        Next cel

    Next Z

End With

這必須在VBA中完成嗎? 使用COUNTIFS函數,該問題在工作表上變得異常容易。

例如,對於'header1'列,您可以編寫=COUNTIFS(B2:B6,"R",C2:C6,"Yes")來計算R / C為“ R”且header1為“是”的所有實例。 可以將相同的想法推廣到“ C”和其他標題。

如果必須在VBA中完成,則可以使用Application.Evaluate通過代碼獲得相同的結果。

一個問題是,使用LstRow不會返回行數,僅返回過濾后剩下的結果數(行仍然保留,但隱藏在中間)

如果將LstRow_Yes編輯為正確地成為表的最后一行(未過濾),則可以像下面這樣編輯內部for循環:

For t = 2 To LstRow_Yes
    If Not Range("B" & t).EntireRow.Hidden Then
        If WS_Sel.Cells(t, 2) = "R" Then
            R_counter = R_counter + 1
        Else
            C_counter = C_counter + 1
        End If
    End If
Next t

這將確保您僅在過濾后計算可見行。

另一種方法是使用=COUNTIFS($B$2:$B$5;"R";C$2:C$5;"Yes")在沒有VBA的情況下獲得相同的結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM