VBA Countif有两套标准匹配

时间:2015-05-25 15:37:33

标签: excel vba excel-vba

我试图计算每个“三”,当且仅当它跟在“两个”之后。我在一列(G1:G100)中有一个数据列表,在“一,二和三”之间交替显示,我只是在寻找三次跟随两次的次数。

我正在使用的代码搜索每个实例并添加但是正如我所解释的那样,如果条件满足,我希望它只计算每个实例。

Sub sample()
Dim wsMain As Worksheet: Set wsMain = ThisWorkbook.Sheets("sheet1")
Dim k As Long

'get count of cells that start with ring
k = Application.WorksheetFunction.CountIf(Columns(7), "Two") + Application.WorksheetFunction.Countif(Columns(7)

If k > 0 Then
    Range("C2").Value = k
    End If


End Sub

2 个答案:

答案 0 :(得分:0)

为什么要为此使用VBA? 您可能需要在VBA中执行循环,

如果你避免使用VBA,你可以这样做:

1)在H1中创建一个公式:=AND(G1="Two",G2="Three") 2)复制该公式:H2:H100 3)在任何其他细胞中你需要最终答案:     =COUNTIF(H:H,TRUE)

我认为这会更容易吗?

[编辑] 如果你真的需要使用VBA,只需使用一个循环:

Sub test()
  Dim cnt As Integer
  cnt = 0
  For i = 1 To 100
    If Cells(i, 7).Value = "Two" And Cells(i + 1, 7).Value = "Three" Then
      cnt = cnt + 1
    End If
  Next i

  Range("C2").Value = cnt
End Sub

使用某些INDEX函数可能会有更高级的方式..但我不确定它是否真的值得与上面代码的复杂程度相比;) [/编辑]

答案 1 :(得分:0)

COUNTIFS function中的 criteria_range 单元格范围必须相同,但它们不必位于同一平面上;即它们可以相互抵消。

Sub two_three()
    Dim rng As Range, k As Long
    With Sheets("Sheet1")
        Set rng = Intersect(.Columns(7), .UsedRange)
        k = Application.CountIfs(rng, "two", rng.Offset(1, 0), "three")
        If k > 0 Then
            .Range("C2").Value = k
        End If
    End With
End Sub

您无法偏移完整列引用,因为它已引用列中的每个单元格,并且无处可抵消。但是,使用整个列的可能性极小,因此从截断到Worksheet.UsedRange property范围的列开始应该允许您将第1行向下偏移第二个条件。