如何在多列中进行CountIf?

Ale*_*gro 8 excel vba excel-vba

x = 0
For Each cell in Sheets("01").Range("A:A").Cells
If cell.Value = "aaa" And cell.Offset(0, 1).Value = "bbb" Then
x = x+1
End If
Next cell
MsgBox x
Run Code Online (Sandbox Code Playgroud)

有没有更短的方式,请?

chr*_*sen 23

你可以使用这样的公式来做到这一点

(Excel 2007或更高版本)

=COUNTIFS(A:A,"aaa",B:B,"bbb")
Run Code Online (Sandbox Code Playgroud)

(Excel 2003或更早版本)

=SUMPRODUCT(--(A:A="aaa")*--(B:B="bbb"))
Run Code Online (Sandbox Code Playgroud)

或者,如果您必须在VBA中执行此操作,请使用 Evaluate

MsgBox Evaluate("=COUNTIFS(A:A,""aaa"",B:B,""bbb"")")

MsgBox Evaluate("=SUMPRODUCT(--(A:A=""aaa"")*--(B:B=""bbb""))")
Run Code Online (Sandbox Code Playgroud)

根据您的评论编辑

如果是rDatrSecRange,并且ct表单CodeName是这样的

Dim rDat As Range
Dim rSec As Range
Set rDat = ct.[A:A]
Set rSec = ct.[B:B]
ct.Range("C6").Value = Evaluate("=COUNTIFS(" & rDat.Address(, , , True) & " ,""a""," & rSec.Address(, , , True) & ",""1"")")
Run Code Online (Sandbox Code Playgroud)

如果ct是工作表Name,请使用此选项

Dim ws As Worksheet
Dim rDat As Range
Dim rSec As Range
Set ws = ActiveWorkbook.Worksheets("ct")
Set rDat = ws.[A:A]
Set rSec = ws.[B:B]
ws.Range("C6").Value = Evaluate("=COUNTIFS(" & rDat.Address(, , , True) & " ,""a""," & rSec.Address(, , , True) & ",""1"")")
Run Code Online (Sandbox Code Playgroud)

如果rDatrSec是字符串,用这个

Dim ws As Worksheet
Dim rDat As String
Dim rSec As String
Set ws = ActiveWorkbook.Worksheets("ct")
rDat = "ct!A:A"
rSec = "ct!B:B"
ws.Range("C6").Value = Evaluate("=COUNTIFS(" & rDat & " ,""a""," & rSec & ",""1"")")
Run Code Online (Sandbox Code Playgroud)

另一选项(rDat,rSec如范围)

ct.Range("C6").Value = Application.WorksheetFunction.CountIfs(rDat, "a", rSec, "1")
Run Code Online (Sandbox Code Playgroud)

  • 太糟糕了,SUMPRODUCT在Google Spreadsheets中不起作用. (2认同)