我试图通过在Excel中使用VBA来计算基于两个条件的某些数据的计数。以下是我尝试实施的方案:
有一张Excel表说 SHEET1 ,其数据如下所述。
|Contract No| Ledger No|
| Con1 | Led1 |
| Con1 | Led2 |
| Con1 | Led3 |
| Con2 | Led4 |
| Con2 | Led2 |
| Con3 | Led5 |
| Con3 | Led6 |
| Con3 | Led3 |
还有另一张Excel表格 SHEET2 ,其基本数据与Ledger数字相对应。
| Ledger No| ProductBaught
| Led1 | P1
| Led1 | P2
| Led1 | P3
| Led2 | P4
| Led2 | P3
| Led3 | P2
| Led3 | P1
| Led3 | P4
| Led4 | P2
| Led4 | P3
| Led5 | P1
| Led6 | P4
我正在寻找以下计算(基于合同编号的产品数量)。这里是Cont1 = Led1(P1,P2,P3),Led2(P4,P3),Led3(P2,P1,P4)所以计数是P1,P2,P3,P4表示4.类似地适用于其他的contarct数字。
|Contract No| Count of Products Baught|
| Con1 | 4 |
| Con2 | 3 |
| Con3 | 3 |
我这样想。
将字典中的合同编号和分类帐编号存储为键,值对。以一个Key多个值的形式。所以字典只有三个键Con1,Con2,Con3和Ledger数字将是对应的值。
Integer count
Foreach Key in Dictionary.Keys()
count = 0
Foreach Value in Key.Values()
IF(Lookup in SHEET2 = True)
count = count + 1
END IF
Next Value
First column in Result Sheet = Key
Second column in Result Sheet = count
Next Key
我仍然无法找到正确的方法,因为这个计数也不会 计数是必需的,因为它会将P1,P2,P1的计数视为3而不是2.我必须在VBA中实现这一点,我不确定我的思维方式是否正确。
感谢您的帮助。
谢谢, 蜂蜜
答案 0 :(得分:1)
您可以使用此UDF:
Function COUNTX(crit As String, critrng As Range, prdrng As Range) As Long
Dim critArr, prdArr
Dim i&, j&
Set dict = CreateObject("Scripting.Dictionary")
critArr = critrng.Value
prdArr = prdrng.Value
For i = LBound(critArr, 1) To UBound(critArr, 1)
If critArr(i, 1) = crit Then
For j = LBound(prdArr, 1) To UBound(prdArr, 1)
If prdArr(j, 1) = critArr(i, 2) Then
On Error Resume Next
dict.Add prdArr(j, 2), prdArr(j, 2)
On Error GoTo 0
End If
Next j
End If
Next i
COUNTX = dict.Count
End Function
将其放在工作簿中附带的模块中, NOT 在工作表代码或ThisWorkbook代码中。
然后你可以把它称为像这样的普通公式:
=COUNTX(A1,Sheet1!$A$2:$B$9,Sheet2!$A$2:$B$13)
三个标准是: