我正在尝试使用Application SumProduct&用vba而不是.Formula方法。以下是我每月运行的报告示例:
我需要能够按多个标准组织这些数据。下面是电子表格的图片,我试图按照给定的标准组织这些数据:
我已经创建了宏,因此此电子表格的用户在一个选项卡上输入条件,然后根据输入自动格式化此选项卡。数据需要按如下方式组织:
调整员家庭办公室名称>数据集(报告中的C列)>声明类型(报告中的列E)>状态(报告中的列G)
在对此进行多次尝试之后,我知道sumproduct公式中的countifs将实现这一目标。下面是我到目前为止编写的代码片段: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
这使我的一切值为零。我开始四处寻找并发现如果我将变量“ClaimTypes”替换为“IN”并将变量“StateJuris”替换为“TX”或Countifs代码中的任何其他州缩写,它会给我一个正确的计算。我知道在countifs的电子表格公式版本中,您可以引用一个水平的单元格行并立即进行评估。例如,如果你看第二张图像的第12行,我需要能够在第一张图像中为状态“AK”,“CA”,“HI”,“TX”评估报告的G列。
我无法弄清楚如何使用VBA应用程序版本的countifs& SUMPRODUCT。任何有关这方面的帮助将不胜感激。
修改
为了不计算我发布的第二张图片中E5:W5范围内的状态,我尝试过这样的事情:
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
答案 0 :(得分:3)
首先,你可以在这里使用SUM()
而不是SUMPRODUCT()
- 你只向SUMPRODUCT()
提供一个参数,所以它只会返回总和。
其次,如果您真的想在VBA中执行数组公式,请将整个公式包装在EVALUATE([formula])
中。但这对你不起作用,因为......
第三,即使您在Excel工作表中将其作为数组公式输入,如果claim types
和states
都有多个条件,它也无法正常工作,因为它只会添加数字claim1
和state1
以及claim2
和state2
等的出现次数(如果任一列只有一个,那么公式就可以了。)
所以,如果你想这样做,我会做的是一个嵌套的FOR
循环,对于每个Claim Type-State
组合,你使用那个{{1}做另一个COUNTIFS()
}和Claim Type
并增加一个运行总计。
更新:例如,
State