excel - 如何仅计算excel列中的条目一定次数?
问题描述
我想数一下某家公司按某个标准审核了多少次。F栏某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某C栏某标准的标准被审计次数超过3次,则其中3间公司应计为1、2、3次。若某公司被审计2次,则应计为1次2.如果一家公司只被审计一次,则应计为1。
我已经有一个代码,不幸的是它不能满足所有要求。
是否可以相应地调整它?
Sub GroupCertificates_MAX3()
Dim Ws As Worksheet
Dim rngDB As Range, vDB As Variant
Dim s1, s2
Dim r As Long, i As Long
Dim k As Long, n As Long
Set Ws = ActiveSheet
Set rngDB = Ws.UsedRange.Offset(1)
vDB = rngDB
r = UBound(vDB, 1)
s1 = vDB(1, 2)
s2 = vDB(1, 5)
k = 1
For i = 1 To r
If vDB(i, 2) = s1 And vDB(i, 5) = s2 Then
n = n + 1
Else
vDB(k, 7) = WorksheetFunction.Min(3, n)
k = i
n = 1
s1 = vDB(i, 2)
s2 = vDB(i, 5)
End If
Next i
rngDB = vDB
End Sub
解决方案
这是嵌套字典的工作。意识到一个字典项可以是另一个字典可能有点费力。此外,如果没有 'with' 语法,事情会很快变得非常冗长
Public Sub CountUsingDictionaries()
Dim myCompanies As Variant
myCompanies = GetColumnArrayFromExcel(ThisWorkbook.Sheets(1).Range("F2:F11"))
Dim myStandard As Variant
myStandard = GetColumnArrayFromExcel(ThisWorkbook.Sheets.Item(1).Range("B2:B11"))
Dim myCounter As Scripting.Dictionary
Set myCounter = New Scripting.Dictionary
Dim myResult As Scripting.Dictionary
Set myResult = New Scripting.Dictionary
Dim myIndex As Long
For myIndex = LBound(myCompanies) To UBound(myCompanies)
Dim myCKey As String
myCKey = myCompanies(myIndex)
Dim mySKey As String
mySKey = myStandard(myIndex)
If Not myCounter.exists(myCKey) Then
myCounter.Add myCKey, New Scripting.Dictionary
End If
With myCounter.Item(myCKey)
If Not .exists(mySKey) Then
.Add mySKey, 0
End If
.Item(mySKey) = .Item(mySKey) + 1
If .Item(mySKey) > 3 Then
myResult.Add myIndex, " "
Else
myResult.Add myIndex, .Item(mySKey)
End If
End With
Next
ThisWorkbook.Sheets.Item(1).Range("G2:G11") = Application.WorksheetFunction.Transpose(myResult.Items)
End Sub
Public Function GetColumnArrayFromExcel(ByVal ipRange As Excel.Range) As Variant
' This is a workaround for an idiosyncracy of Excel which returns a
' 2D variant array when the request is only for a 1D array
' If you need an array from a row then you need two transpose actions
GetColumnArrayFromExcel = Application.WorksheetFunction.Transpose(ipRange.Value)
End Function
上面的代码是用
推荐阅读
- excel - 如何在整个数据中重复代码?
- rest - 微服务中的循环api调用
- javascript - JavaScript 上的下拉验证和组合 If 语句是否带有额外的验证条件?
- mysql - 我无法使用选择查询插入列
- javascript - 滚动时更改导航的背景
- javascript - 反应中的样式不可见?
- c++ - 为什么在这个例子中没有对 Boost Interprocess message_queue 的争用?
- python - 如何编辑车轮名称
- jenkins - 每当我在 pom 文件中更改我的 pom 版本时,我到 nexus 的人工上传阶段都会失败
- javascript - 下次如何使用延迟对象存储结果并从本地内存中提供结果?