Applicatoin.SumProduct / Countifs in VBA

时间:2016-02-01 17:54:38

标签: excel vba excel-vba

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

enter image description here

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

enter image description here

我已经创建了宏,因此此电子表格的用户在一个选项卡上输入条件,然后根据输入自动格式化此选项卡。数据需要按如下方式组织:

调整员家庭办公室名称>数据集(报告中的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

1 个答案:

答案 0 :(得分:3)

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

其次,如果您真的想在VBA中执行数组公式,请将整个公式包装在EVALUATE([formula])中。但这对你不起作用,因为......

第三,即使您在Excel工作表中将其作为数组公式输入,如果claim typesstates都有多个条件,它也无法正常工作,因为它只会添加数字claim1state1以及claim2state2等的出现次数(如果任一列只有一个,那么公式就可以了。)

所以,如果你想这样做,我会做的是一个嵌套的FOR循环,对于每个Claim Type-State组合,你使用那个{{1}做另一个COUNTIFS() }和Claim Type并增加一个运行总计。

更新:例如,

State