Excel VBA:如果声明过滤范围

我有一系列的数据,我在C到K列中筛选为“是”,一次一列。 在过滤了范围之后,我想逐行检查第2列中的字母“R”或“C”。 如果有一个RI加1到R_counter和Cs一样。 不幸的是,我的柜台里面总是有些古怪的数字。 我怀疑它可能有什么关系,当我过滤范围,并告诉它检查行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 

我重构了一下代码,并对其进行了testing,以产生所需的结果。

值得注意的是:

  • 我遍历FilteredRange每个Cell (写入问题的方式是将每Row从2循环到过滤的范围的末尾,即在filter外部拾取行。
  • 我用一个Select Case来testingRC (主要是因为我认为它更干净)。
  • 我在过滤的范围中使用第2列来testingR/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为“Yes”的所有实例。 同样的想法可以概括为“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