簡體   English   中英

數組 CountIf 替換 - Count(Match())

[英]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! 運行上述代碼后出現錯誤。 必須找到替代品。

解決方案 - Count(Match())

我們正在尋找的解決方案是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM