1

我面临一个我无法解释的奇怪问题。

我将 Worksheet 函数与 CountIfs 公式一起使用,并且我还使用 Sumproduct 来使用数组。

但是,每次我尝试使用定义为数组的 2 个不同变量时,我都会得到不正确的结果。

让我解释,

当我使用:

Dim lastrow As Long
Dim wsf
lastrow = Sheet2.Cells(Sheet2.Rows.Count, "M").End(xlUp).Row
Set wsf = Application.WorksheetFunction
Doctors = Array("Peter","Sam","Henry")
Emergency = Array("Y","N")

a1 = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range("P2:P" & lastrow), Doctors, Sheet2.Range("M2:M" & lastrow), Emergency))

我得到 a1 的错误结果。

但是,当我尝试:

a1 = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range("P2:P" & lastrow), Doctors, Sheet2.Range("M2:M" & lastrow), "Y"))

b1 = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range("P2:P" & lastrow), Doctors, Sheet2.Range("M2:M" & lastrow), "N"))

Final = a1 + b1

或者

a1 = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range("P2:P" & lastrow), "Peter", Sheet2.Range("M2:M" & lastrow), Emergency))

b1 = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range("P2:P" & lastrow), "Sam", Sheet2.Range("M2:M" & lastrow), Emergency))

c1 = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range("P2:P" & lastrow), "Henry", Sheet2.Range("M2:M" & lastrow), Emergency))

Final = a1 + b1 + c1

我得到了最终的正确结果。

有什么方法可以使第一个公式起作用,或者 vba 是否根本不允许将多个数组变量用作单个 countifs 函数中的标准。

我想也许我应该声明 Doctors 和 Emergency 变量,但到目前为止还没有运气。

有什么建议么?

4

3 回答 3

0

我不认为有相同数量的项目Doctors可以Emergency解决问题 - 例如,如果您将“Z”添加到紧急情况,您只会得到 3 个组合,Peter/Y、Sam/N 和 Henry /Z 不是必需的 3*3 = 9 组合。

我的公式比 VBA 更好,所以我不知道这是否是最好的解决方案,但你可以转置其中一个数组(无论它们是否大小相等),然后会给你所有组合(3 * 2 = 6 在您的示例中),即更改为

a1 = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range("P2:P" & lastrow), Doctors, Sheet2.Range("M2:M" & lastrow), wsf.Transpose(Emergency)))

如果将其编写为工作表函数,您可以执行以下操作:

=SUMPRODUCT(COUNTIFS(Sheet2!P2:P100,{"Peter","Sam","Henry"},Sheet2!M2:M100,{"Y";"N"}))

请注意,我没有使用TRANSPOSE,我只是在 {"Y";"N"} 中使用了一个分号分隔符,它有效地将它从“行”“转置”到“列”——我不知道你是否可以通过在 VBA 中以不同方式定义数组来做到这一点......

于 2013-11-08T23:23:50.080 回答
0

除非两个条件中的项目数量相等,否则您的公式将不起作用。(在这种情况下,您需要例如 YN 和 Z 来匹配医生的数量)。
我建议 UDF 可能是最简单的解决方案。

于 2013-11-08T19:49:26.447 回答
0

您可以在 VBA 中使用数组而不是函数:

Option Explicit
Option Compare Text
Sub MediCount()
'
    Dim lastrow As Long
    Dim Doctors As Variant
    Dim Emergency As Variant
    Dim Profession As Variant
    Dim vData As Variant
    Dim Ct As Long
    Dim jDoc As Long
    Dim jEmr As Long
    Dim jPro As Long
    Dim j As Long
    '
    lastrow = Sheet1.Cells(Sheet1.Rows.Count, "M").End(xlUp).Row
    Doctors = Array("Peter", "Sam", "Harry")
    Emergency = Array("Y", "N")
    Profession = Array("Teacher", "Accountant", "Plumber", "Artist")
    ' assume emergency in M, Profession in N, Doctors in O, start row=2
    vData = Sheet1.Range("M2").Resize(lastrow, 3).Value2
    For j = LBound(vData) To UBound(vData)
        For jDoc = LBound(Doctors) To UBound(Doctors)
            If vData(j, 3) = Doctors(jDoc) Then
                For jEmr = LBound(Emergency) To UBound(Emergency)
                    If vData(j, 1) = Emergency(jEmr) Then
                        For jPro = LBound(Profession) To UBound(Profession)
                            If vData(j, 2) = Profession(jPro) Then
                                Ct = Ct + 1
                            End If
                        Next jPro
                    End If
                Next jEmr
            End If
        Next jDoc
    Next j
    MsgBox Ct
End Sub

(或者你可以使用我的 SpeedTools ACOUNTIFS 功能=ACOUNTIFS(0,$M$2:$O$50,1,1,$H$2:$H$5,2,$I$2:$I$5,3,$G$2:$G$5)

但那是一个商业 Excel 插件)

于 2013-11-09T08:53:57.547 回答