在VBA中使用Dictionary(散列)

  • 我有一个多张工作表的Excel工作簿。

  • 我必须通过使用filter(我正在search文本,而不是使用filter在这里)获得某些条目的计数

  • “主”表是计数更新的地方。 string从工作簿中的其他工作表中search

  • 计数应更新的单元格不尽相同。

  • search标准,关键字,表单,范围等在我发布的示例代码中给出。

代码示例:

在单元AE43中,计数仅在表单“TT”满足上述标准时更新。

所以,同样的,我将不得不使用相同types的代码30+次来获取数据。

因此,不要为类似的searchinput代码,我想知道我们是否可以在这里使用“Dictionary”函数(在其他语言中进行散列),以便一个单元格可以在符合条件时自动更新。

Sub WBR() Dim wf As WorksheetFunction Set wf = Application.WorksheetFunction With ActiveWorkbook.Worksheets("TT") 'no of tickets processed - summary [AE43] = wf.CountIfs(.Range("I:I"), "<>Duplicate TT", _ .Range("G:G"), "<>Not Tested", _ .Range("U:U"), "Item") End With With ActiveWorkbook.Worksheets("TT") 'not tested tickets - summary [AE44] = wf.CountIfs(.Range("G:G"), "Not Tested") End With With ActiveWorkbook.Worksheets("TT") 'Tickets moved back- outdated OS and App Versions - summary [AE45] = wf.CountIf(.Range("I:I"), "Outdated App Version") + wf.CountIf(.Range("I:I"), "Outdated OS") End With 

这是一个基本的例子,应该让你开始。

小组展示如何调用代码:

 Sub Tester() With ThisWorkbook.Sheets("Main") .Range("A1") = GetCount("TT", False, "A:A", "Blue") .Range("A2") = GetCount("TT", False, "A:A", "Blue", "C:C", "Red") .Range("A3") = GetCount("TT", True, "A:A", "Blue", "C:C", "Red") End With End Sub 

您的用例的通用版本:

 'If addValues is True and there are >1 set of criteria then ' sum up a bunch of COUNTIF(), else use COUNTIFS() so all ' criteria are applied at the same time Function GetCount(shtName As String, addValues As Boolean, _ ParamArray crit()) As Long Dim sht As Worksheet, f As String, num As Long, i As Long Set sht = ThisWorkbook.Sheets(shtName)'<< counting things on this sheet num = UBound(crit) If num = 1 Or addValues Then f = "COUNTIF(" & crit(0) & ",""" & crit(1) & """)" End If If num > 1 Then If addValues Then 'already got the first pair: add the rest For i = 2 To num Step 2 f = f & " + COUNTIF(" & crit(i) & ",""" & crit(i + 1) & """)" Next i Else f = "COUNTIFS(" For i = 0 To num Step 2 f = f & crit(i) & ",""" & crit(i + 1) & """" If i <> num - 1 Then f = f & "," Next i f = f & ")" End If End If If f <> "" Then Debug.Print f GetCount = sht.Evaluate(f) '<<do not use Application.Evaluate here Else GetCount = -1 '<< something went wrong... End If End Function 

debugging输出:

 COUNTIF(A:A,"Blue") COUNTIFS(A:A,"Blue",C:C,"Red") COUNTIF(A:A,"Blue") + COUNTIF(C:C,"Red") 

可能可以使用一些error handling,如果还有其他用例,你需要添加这些。