[英]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
測試R
, C
(主要是因為我認為它更干凈)。 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.