我会尽量保持这个简单和非特异性。我有三列,a,b,c。 Col C在单元格C1-C100中具有一百个随机数。 Col A在单元格C1:C5中有五个随机数。
对于每个单元格B1:B5,我想输入col c中出现的数字的次数。如果您将公式直接写入单元格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中要填充多少个单元格(识别A何时到达其最后一个值,并且相应地停止填充B,a la < / p>
Dim colb As Range
Set colb = Range("$B:$B")
在我看来,关键路线应该是:
colb.Formula = Application.WorksheetFunction.CountIf(colc, cola)
但这不起作用。有什么我想问的可能吗?我想让Excel一次填充整个范围会比循环更快。
答案 0 :(得分:1)
您可以使用评估:
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
答案 1 :(得分:1)
你不需要循环,也不需要使用工作表函数:)这将是你想要的。
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