[英]Array CountIf Substitute - Count(Match())
如何盡可能有效地(性能方面)在一個范圍內執行重復的CountIf()
?
數組范圍
由於對電子表格的每次讀/寫都會導致 VBA 代碼變慢,因此建議盡可能少地這樣做。 通常,如果有人重復讀取/寫入范圍,他或她應該首先將該范圍保存到數組中,對數組執行操作,然后在必要時對電子表格進行最終讀取或寫入。
示例值和代碼
如何在上面的A2:A11
范圍內使用 perform CountIf()
來計算每個值的計數並將它們寫入D2:D7
? 我希望下面的代碼能夠工作:
Sub M1ArrayCount()
Dim arrNumbers() As Variant
Dim Long1 As Long
Dim Loop1 As Long
arrNumbers() = ThisWorkbook.Sheets(1).Range("A2:A11").Value
With ThisWorkbook.Sheets(1)
For Loop1 = 1 To 6
.Cells(Loop1 + 1, 4).Value = Application.CountIf(arrNumbers(), Loop1)
Next Loop1
End With
End Sub
CountIf() 不適用於數組
但是,由於Application.CountIf()
僅適用於范圍而不適用於數組,因此D2:D7
都顯示#VALUE!
運行上述代碼后出現錯誤。 必須找到替代品。
我們正在尋找的解決方案是:
Application.Count(Application.Match(SavedArray(), Array([lookup_value]), 0))
力學解釋
非常感謝@Jeeped,這是它的工作原理:
這是Match(lookup value, lookup array, 0)
的一個未公開的特性,如果你把一個數組作為查找值,它會將你輸入的數組中的每個值與查找數組相Match()
。 因此,對於上面的示例,對於Loop = 1
,它將變為:
{match(A2, Array("1"), 0),match(A3, Array("1"), 0), ... match(A11, Array("1"), 0)}
然后,根據@Jeeped:
每個匹配將返回一個數字或一個錯誤。
Count()
函數計算數字,而不是錯誤。 因此,您可以計算A1:A11
中的任何值是否與Loop1
匹配。
最終代碼和值
Sub M1ArrayCount() Dim arrNumbers() As Variant Dim Long1 As Long Dim Loop1 As Long arrNumbers() = ThisWorkbook.Sheets(1).Range("A2:A11").Value With ThisWorkbook.Sheets(1) For Loop1 = 1 To 6 .Cells(Loop1 + 1, 4).Value = Application.Count(Application.Match(arrNumbers(), Array(Loop1), 0)) Next Loop1 End With End Sub
問題
示例:
myarray = array("First","Second","Second","Third","Fourth")
那么
countif(myarray,"second")
語法是什么? (結果應等於 2 個計數)回答
也試試:
MsgBox Application.Count(Application.Match(myArray, Array("Second"), 0))
Dim rowin as integer 'this is a counter for the row index
For rowin = 2 To Sheets("Sheet1").UsedRange.Rows.Count
Sheets("Sheet1").Range("D" & rowin).Value = WorksheetFunction.CountIf(Range("A:A"), Range("C" & rowin))
Next
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.