在VBA中应用.SumProduct / Countifs

我正在尝试使用vba中的Application SumProduct&Countifs而不是.Formula方法。 以下是我每个月运行的报告示例:

在这里输入图像说明

我需要能够通过多个标准来组织这些数据。 下面是我试图按给定标准组织这些数据的电子表格的图片:

在这里输入图像说明

我已经创build了macros,所以这个电子表格的用户在一个标签上input条件,然后这个标签会根据他们的input自动格式化。 数据需要组织如下:

调整员家庭办公室名称>数据集(来自报告的C列)>索赔types(报告E列)>州(报告中的G列)

在做了几次尝试之后,我知道副产品配方中的配方会达到这个目的。 下面是我迄今为止编写的代码片段:

Dim linerngs As Range Dim lineitem As Range Dim lastlinerow As Long Dim Tab1LastRow As Long Dim claimstab As String Dim wsf Dim SpecialStates As Range Dim DedicatedUnits As Range Dim HomeOffice As String Dim DataSet As String claimstab = Sheet2.Range("C2") & " Claims" priorclaimstab = Sheet2.Range("C3") & " Claims" Tab1LastRow = Sheets(claimstab).Cells(Sheets(claimstab).Rows.Count, "A").End(xlUp).Row Set wsf = Application.WorksheetFunction Set SpecialStates = Sheet2.Range("E2:AA2") Set DedicatedUnits = Sheet2.Range("E5:BB5") lastlinerow = Sheet2.Range("D" & Rows.Count).End(xlUp).Row Set linerngs = Sheet2.Range("D12:D" & lastlinerow).SpecialCells(xlCellTypeConstants, 23) For Each lineitem In linerngs HomeOffice = lineitem.Offset(0, -3).Value DataSet = lineitem.Offset(0, -1).Value firsttype = lineitem.Offset(0, 1).Address(False, False) lasttype = lineitem.Offset(0, 6).Address(False, False) firststate = lineitem.Offset(0, 7).Address(False, False) laststate = lineitem.Offset(0, 15).Address(False, False) ClaimTypes = Sheet2.Range(firsttype & ":" & lasttype) StateJuris = Sheet2.Range(firststate & ":" & laststate) If InStr(1, lineitem.Value, "Indemnity") > 0 And InStr(1, lineitem.Value, "AOS") = 0 Then lineitem.Offset(0, 16) = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheets(claimstab).Range("B2:B" & Tab1LastRow), HomeOffice, Sheets(claimstab).Range("C2:C" & Tab1LastRow), DataSet, Sheets(claimstab).Range("E2:E" & Tab1LastRow), ClaimTypes, Sheets(claimstab).Range("G2:G" & Tab1LastRow), StateJuris)) End If Next lineitem 

这一切都返回给我一个零值。 我开始四处探索,发现如果用“IN”replacevariables“ClaimTypes”,并用Coupling代码中的“TX”或任何其他状态缩写replacevariables“StateJuris”,它会给我一个正确的计算。 我知道在coupie的电子表格公式版本中,可以引用水平线的单元格并一次评估它们。 例如,如果你看第二个图像的第12行,我需要能够在第一个图像的状态“AK”,“CA”,“HI”,“TX” 。

我无法弄清楚如何使VBA应用程序版本的countifs&sumproduct这个工作。 任何帮助,将不胜感激。

编辑:

为了不计算在E5:我发布的第二张图片中的范围是什么状态,我尝试了这样的事情:

  If InStr(1, lineitem.Value, "Indemnity") > 0 And InStr(1, lineitem.Value, "AOS") > 0 Then c = 0 For Each ClaimType In ClaimTypes For Each DedState In DedicatedUnits c = c + Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheets(claimstab).Range("B2:B" & Tab1LastRow), HomeOffice, Sheets(claimstab).Range("C2:C" & Tab1LastRow), DataSet, Sheets(claimstab).Range("E2:E" & Tab1LastRow), ClaimType.Value, Sheets(claimstab).Range("G2:G" & Tab1LastRow), "<>" & DedState.Value)) Next DedState Next ClaimType lineitem.Offset(0, 16) = c End If 

然而,这不工作,我不认为我会。 我假设我需要做类似的事情:

 If InStr(1, lineitem.Value, "Indemnity") > 0 And InStr(1, lineitem.Value, "AOS") > 0 Then c = 0 nc = 0 For Each ClaimType In ClaimTypes c = c + Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheets(claimstab).Range("B2:B" & Tab1LastRow), HomeOffice, Sheets(claimstab).Range("C2:C" & Tab1LastRow), DataSet, Sheets(claimstab).Range("E2:E" & Tab1LastRow), ClaimType.Value)) Next ClaimType For Each ClaimType In ClaimTypes For Each DedState In DedicatedUnits nc = nc + Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheets(claimstab).Range("B2:B" & Tab1LastRow), HomeOffice, Sheets(claimstab).Range("C2:C" & Tab1LastRow), DataSet, Sheets(claimstab).Range("E2:E" & Tab1LastRow), ClaimType.Value, Sheets(claimstab).Range("G2:G" & Tab1LastRow), DedState.Value)) Next DedState Next ClaimType lineitem.Offset(0, 16) = c - nc End If 

首先,你可以在这里使用SUM()而不是SUMPRODUCT() – 你只提供一个参数给SUMPRODUCT() ,所以它只是返回总和。

其次,如果你真的想在VBA中做一个数组公式,将整个公式包含在EVALUATE([formula]) 。 但这不适合你,因为…

第三,即使在Excel工作表中以数组公式的formsinput了它,如果对于两种claim typesstates都有多个条件,它也不会正常工作,因为它只会增加声明claim1claim2以及state2state1的出现state2等等(如果任一列只有一个,那么这个公式就可以工作)。

所以,如果你想这样做,我要做的是一个嵌套的FOR循环,其中对于每个Claim Type-State组合,您使用该特定Claim TypeState来执行另一个COUNTIFS() ,并增加一个运行总数。

更新:例如,类似的东西

 c = 0 for each claimType in claimTypes for each state in StateJuris c = c + wsf.CountIfs(Sheets(claimstab).Range("B2:B" & Tab1LastRow), HomeOffice, Sheets(claimstab).Range("C2:C" & Tab1LastRow), DataSet, Sheets(claimstab).Range("E2:E" & Tab1LastRow), ClaimType.value, Sheets(claimstab).Range("G2:G" & Tab1LastRow), State.value) next state next claimType lineitem.Offset(0, 16) = c