无法根据VBA中的两个条件计算计数?

时间:2016-09-23 18:56:41

标签: excel vba excel-vba

我试图通过在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中实现这一点,我不确定我的思维方式是否正确。

感谢您的帮助。

谢谢, 蜂蜜

1 个答案:

答案 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)

enter image description here

三个标准是:

  1. 合约编号的字符串。
  2. 工作表一,两列的范围。正是这个范围,UDF将在第一列中搜索合同,并使用第二列作为分类帐。
  3. 工作表2上的范围,两列。它将搜索第一列并使用第二列作为产品。