2016-07-14 162 views
0

我有一系列的數據,我在列C到K,每次一列過濾「是」。在我過濾了範圍後,我想逐行檢查第2列中的字母'R'或'C.'。如果存在R,則將1加到R_counter,對於Cs也是如此。不幸的是,我的櫃檯裏出現了很多古怪的數字。我懷疑這可能與我過濾範圍並告訴它檢查第2行時有關,但是剩下的行數很多,它檢查的是實際的行號,而不是隻是向下移動一行,如果有意義的話。有任何想法嗎?Excel VBA:如果聲明過濾範圍

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

Here is the format of data I am using

這裏是我得到什麼,我希望得到: enter image description here

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 
+0

你的預期產出是什麼?你可以請張貼它 –

回答

1

我重構的碼位並測試它,以產生期望的結果。

值得注意的是:

  • 通過每個Cell在上所寫的問題,從2各循環到filteredrange結束,這是撿行FilteredRange(我的方式循環所述過濾器的外部。
  • 我用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 
+1

精美的作品。非常感謝! – Liz

0

的一個問題是,隨着LstRow不會返回的行數,只留下結果的數量(行仍然保留但隱藏在其間)

如果您編輯LstRow_Yes以實際成爲表的最後一行(未過濾),那麼您可以編輯內部for-loop類似e這:

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

+0

這不適合我。對不起 – Liz

+0

你想在結果中的單元格中嘗試'COUNTIFS'嗎?請注意,如果結果是在另一張表上,您必須編寫'= COUNTIFS(NAMEOFSHEET!$ B $ 2:$ B $ 5;「R」; NAMEOFSHEET!C $ 2:C $ 5;「是)」,您將替換NAMEOFSHEET (並保留!) – Carmelid

1

這是否在VBA做?在使用COUNTIFS函數的工作表上,問題變得非常簡單。

E.g.對於'header1'列,您可以編寫=COUNTIFS(B2:B6,"R",C2:C6,"Yes")來計算R/C爲「R」且header1爲「Yes」的所有實例。同樣的想法可以概括爲「C」和其他標題。

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