Excel Application.WorksheetFunction.CountIf使用相对引用

我会尽量保持这一点,尽可能简单和不具体。 我有三列a,b,c。 Col C在单元格C1-C100中有一百个随机数字。 列A在单元格C1中具有五个随机数:C5。

对于每个单元格B1:B5,我想inputcol a中显示的数字的次数。 如果您直接将公式写入单元格B1,则会这样:

= COUNTIF($ C:$ C,$ A1)

然后,您将向下拖动以填充单元格B2:B5

我想使用VBA的Application.WorksheetFunction.CountIf函数(我的实际项目比这更复杂,单元格需要自动填充)。

Dim colb As Range Set colb = Range("$B1:$B5") Dim colc As Range Set colc = Range("$C:$C") Dim cola As Range Set cola = Range("$A:$A") For Each bcell In colb bcell.Formula = Application.WorksheetFunction.CountIf(colc, bcell.Offset(0, -1)) Next bcell 

这工作正常。 但是我想知道是否可以在没有For-Each循环的情况下完成,并且不需要指定B中有多less个单元格要填充(识别A何时达到其最后的值,并且相应地停止填充B)

 Dim colb As Range Set colb = Range("$B:$B") 

在我看来,关键的线路是这样的:

 colb.Formula = Application.WorksheetFunction.CountIf(colc, cola) 

但是这不起作用。 我有什么要求吗? 我想象让Excel一次填充整个范围将比循环更快。

你可以使用评估:

 Sub testeval() Dim vArr As Variant Dim nARows As Long Dim nCRows As Long Dim oSht1 As Worksheet Dim strSheet As String Set oSht1 = ActiveSheet strSheet = oSht1.Name & "!" nARows = oSht1.Range("A1").Offset(oSht1.Rows.Count - 1).End(xlUp).Row nCRows = oSht1.Range("C1").Offset(oSht1.Rows.Count - 1).End(xlUp).Row vArr = oSht1.Evaluate("=INDEX(COUNTIF(" & strSheet & "$C1:$C" & CStr(nCRows) & "," & strSheet & "$A1:$A" & CStr(nARows) & "),0,1)") oSht1.Range("$B1").Resize(UBound(vArr), 1) = vArr End Sub 

你不需要循环,也不需要使用工作表function:)这将做到你想要的。

 Range("$B1:$B5").Formula="=COUNTIF($C:$C, $A1)" 

 Option Explicit Sub Sample() Dim ws As Worksheet Dim colb As Range Set ws = Sheets("Sheet1") Set colb = ws.Range("$B1:$B5") colb.Formula = "=COUNTIF($C:$C, $A1)" End Sub