Excel:使用公式处理数据

Excel:使用公式处理数据,excel,formula,Excel,Formula,我的任务是使用Excel公式从表中获取和处理一些数据。 表如下所示: A B C D Date Name Count Job 1 11.11.2020 Adam 260 1 2 12.11.2020 Nikole 300 2 3 11.11.2020 Adam 900 1 4 11.11.2020 Mary 750 1 任务是: 我有数据和工作编号的字段。例如,在A1中我有11.11.2020,

我的任务是使用Excel公式从表中获取和处理一些数据。
表如下所示:

  A          B      C      D
  Date       Name   Count  Job
1 11.11.2020 Adam   260    1
2 12.11.2020 Nikole 300    2
3 11.11.2020 Adam   900    1
4 11.11.2020 Mary   750    1
任务是:

  • 我有数据和工作编号的字段。例如,在
    A1
    中我有
    11.11.2020
    ,在
    A2
    中我有
    1
    。首先,我需要根据这些条件获取所有行。在示例中,将有第一、第三和第四行
  • 之后,我需要按名称和总和对结果进行分组
    Count
    字段。在这个例子中,我会得到亚当-1160,玛丽-750
  • 然后我需要检查每个结果:如果结果是
    =1000和=1500
    -
    90
    。在我们的例子中,亚当得到了
    60
    ,玛丽得到了
    30
  • 之后,我必须对这些数字求和,并用公式将它们写入单元格。例如,答案是
    90
  • 现在,我正在使用带有SQL查询的宏解决此问题:

    SELECT Name, SUM(Count) FROM MyTable WHERE Date = "A1" AND Job = "A2" GROUP BY Name
    
    然后我循环查询结果,将
    SumOfCount
    的结果写入数组,并将其总和写入我的单元格

    但是这种方式太长,因为
    MyTable
    有超过500.000行,并且宏内部的查询运行得太慢

    我正在用
    SUMIFS
    解决另一个更简单的问题;例如,我只需要求和
    Count
    值,我将使用:

    =SUMIFS(MyTable!$C:$C; MyTable!$A:$A; $A1; MyTable!$D:$D; $A2)
    

    有没有办法用Excel公式解决我的问题?也许有什么方法可以编写我自己的公式函数来计算我的值?

    我不确定基于公式的解决方案是否会更快(特别是如果它必须处理500000行以上的数据)。请尝试以下子程序:

    Sub SubElaborateTable()
        
        'Declarations.
        Dim RngSource As Range
        Dim RngResult As Range
        Dim RngRange01 As Range
        Dim RngTarget As Range
        Dim DatDate As Date
        Dim DblJob As Double
        Dim WksPivotTableWorksheet As Worksheet
        Dim PvtPivotTable As PivotTable
        
        'Setting variables.
        Set RngSource = Sheets("MyTable").Range("A:D")
        Set RngResult = Sheets("MyTable").Range("F1")
        
        'Adding a new sheet.
        Set WksPivotTableWorksheet = Sheets.Add
        
        'Creating a pivot table out of RngSource.
        Set PvtPivotTable = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
                                                              SourceData:=RngSource, _
                                                              Version:=6 _
                                                             ).CreatePivotTable(TableDestination:=WksPivotTableWorksheet.Cells(1, 1), _
                                                                                TableName:=WksPivotTableWorksheet.Name & " Pivot Table", _
                                                                                DefaultVersion:=6 _
                                                                               )
        
        'Filling and formatting the pivot table.
        With PvtPivotTable
            With .PivotFields("Date")
                .Orientation = xlRowField
                .Position = 1
                .PivotItems("(blank)").Visible = False
            End With
            With .PivotFields("Job")
                .Orientation = xlRowField
                .Position = 2
            End With
            With .PivotFields("Name")
                .Orientation = xlRowField
                .Position = 3
            End With
            .AddDataField .PivotFields("Count"), "Count sum", xlSum
            .ColumnGrand = False
            .RowGrand = False
            .PivotFields("Date").Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
            .PivotFields("Job").Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
        End With
        
        'Setting RngRange01.
        With WksPivotTableWorksheet
            Set RngRange01 = .Range(Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
        End With
        
        'Filling the result headers.
        RngResult.Value = "Date"
        RngResult.Offset(0, 1).Value = "Job"
        RngResult.Offset(0, 2).Value = "Score"
        
        'Covering the whole RngRange01.
        For Each RngTarget In RngRange01
            
            'Setting DatDate or DblJob according to RngTarget value.
            Select Case True
                Case Is = IsDate(RngTarget.Value)
                    DatDate = RngTarget.Value
                Case Is = IsNumeric(RngTarget.Value)
                    DblJob = RngTarget.Value
            End Select
            
            'Checking if a Count value is encountered.
            If RngTarget.Offset(0, 1).Value <> "" Then
                
                'If the actual RngResult refers to a different date or job, RngResult is set on the next row.
                If RngResult.Value <> DatDate Or RngResult.Offset(0, 1).Value <> DblJob Then
                    Set RngResult = RngResult.Offset(1, 0)
                End If
                
                'Filling in the results accordingly.
                RngResult.Value = DatDate
                RngResult.Offset(0, 1).Value = DblJob
                Select Case RngTarget.Offset(0, 1).Value
                    Case Is < 1000
                        RngResult.Offset(0, 2).Value = RngResult.Offset(0, 2).Value + 30
                    Case Is < 1500
                        RngResult.Offset(0, 2).Value = RngResult.Offset(0, 2).Value + 60
                    Case Is >= 1500
                        RngResult.Offset(0, 2).Value = RngResult.Offset(0, 2).Value + 90
                End Select
                
            End If
            
        Next
        
        'Deleting WksPivotTableWorksheet.
        Application.DisplayAlerts = False
        WksPivotTableWorksheet.Delete
        Application.DisplayAlerts = True
        
    End Sub
    
    子表()
    "声明,。
    变暗RNG源作为范围
    Dim RngResult As范围
    Dim RngRange01作为范围
    变光目标As范围
    日期为日期
    将DblJob设置为双精度
    将WKSPIVOTTABLE工作表设置为工作表
    Dim PvtPivotTable作为数据透视表
    '设置变量。
    设置RngSource=Sheets(“MyTable”)。范围(“A:D”)
    设置RngResult=工作表(“MyTable”)。范围(“F1”)
    '添加新的工作表。
    设置WksPivotTableWorksheet=工作表。添加
    '从RngSource创建数据透视表。
    设置PvtPivotTable=ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase_
    SourceData:=RngSource_
    版本:=6_
    ).CreatePivotTable(TableDestination:=WKSpivotTableWorker.Cells(1,1)_
    TableName:=WKSPIVOTTABLEWORKEM.Name&“透视表”_
    默认版本:=6_
    )
    '填充和格式化数据透视表。
    带PvtPivotTable
    带.PivotFields(“日期”)
    .Orientation=xlRowField
    .位置=1
    .PivotItems(“(空白)”).Visible=False
    以
    带有.PivotFields(“作业”)
    .Orientation=xlRowField
    .位置=2
    以
    带有.PivotFields(“名称”)
    .Orientation=xlRowField
    .职位=3
    以
    .AddDataField.PivotFields(“计数”),“计数和”,xlSum
    .grand=False
    .RowGrand=False
    .PivotFields(“日期”).Subtotals=数组(假、假、假、假、假、假、假、假、假、假、假、假)
    .PivotFields(“作业”).Subtotals=数组(假、假、假、假、假、假、假、假、假、假、假、假)
    以
    '设置RngRange01。
    使用WksPivotTableWorksheet
    设置RngRange01=.Range(单元格(2,1),.Cells(.Rows.Count,1).End(xlUp))
    以
    '填充结果标题。
    RngResult.Value=“日期”
    RngResult.Offset(0,1).Value=“作业”
    RngResult.Offset(0,2).Value=“分数”
    “覆盖整个RngRange01。
    对于RngRange01中的每个RngTarget
    '根据RngTarget值设置DatDate或DblJob。
    选择Case True
    案例Is=IsDate(RngTarget.Value)
    DatDate=RngTarget.Value
    Case Is=IsNumeric(RngTarget.Value)
    DblJob=RngTarget.Value
    结束选择
    '检查是否遇到计数值。
    如果RngTarget.Offset(0,1).Value“”则
    '如果实际的RngResult引用不同的日期或作业,则在下一行设置RngResult。
    如果RngResult.Value DATDATATE或RngResult.Offset(0,1).Value DblJob,则
    设置RngResult=RngResult.Offset(1,0)
    如果结束
    "填写相应的结果。
    RngResult.Value=DatDate
    RngResult.Offset(0,1).Value=DblJob
    选择案例RngTarget.Offset(0,1).Value
    病例<1000例
    RngResult.Offset(0,2).Value=RngResult.Offset(0,2).Value+30
    病例<1500
    RngResult.Offset(0,2).Value=RngResult.Offset(0,2).Value+60
    案例>=1500
    RngResult.Offset(0,2).Value=RngResult.Offset(0,2).Value+90
    结束选择
    如果结束
    下一个
    '正在删除WksPivotTableWorksheet。
    Application.DisplayAlerts=False
    WksPivotTableWorksheet.Delete
    Application.DisplayAlerts=True
    端接头
    
    我不确定基于公式的解决方案是否会更快(特别是如果它必须处理500000行以上的数据)。请尝试以下子程序:

    Sub SubElaborateTable()
        
        'Declarations.
        Dim RngSource As Range
        Dim RngResult As Range
        Dim RngRange01 As Range
        Dim RngTarget As Range
        Dim DatDate As Date
        Dim DblJob As Double
        Dim WksPivotTableWorksheet As Worksheet
        Dim PvtPivotTable As PivotTable
        
        'Setting variables.
        Set RngSource = Sheets("MyTable").Range("A:D")
        Set RngResult = Sheets("MyTable").Range("F1")
        
        'Adding a new sheet.
        Set WksPivotTableWorksheet = Sheets.Add
        
        'Creating a pivot table out of RngSource.
        Set PvtPivotTable = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
                                                              SourceData:=RngSource, _
                                                              Version:=6 _
                                                             ).CreatePivotTable(TableDestination:=WksPivotTableWorksheet.Cells(1, 1), _
                                                                                TableName:=WksPivotTableWorksheet.Name & " Pivot Table", _
                                                                                DefaultVersion:=6 _
                                                                               )
        
        'Filling and formatting the pivot table.
        With PvtPivotTable
            With .PivotFields("Date")
                .Orientation = xlRowField
                .Position = 1
                .PivotItems("(blank)").Visible = False
            End With
            With .PivotFields("Job")
                .Orientation = xlRowField
                .Position = 2
            End With
            With .PivotFields("Name")
                .Orientation = xlRowField
                .Position = 3
            End With
            .AddDataField .PivotFields("Count"), "Count sum", xlSum
            .ColumnGrand = False
            .RowGrand = False
            .PivotFields("Date").Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
            .PivotFields("Job").Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
        End With
        
        'Setting RngRange01.
        With WksPivotTableWorksheet
            Set RngRange01 = .Range(Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
        End With
        
        'Filling the result headers.
        RngResult.Value = "Date"
        RngResult.Offset(0, 1).Value = "Job"
        RngResult.Offset(0, 2).Value = "Score"
        
        'Covering the whole RngRange01.
        For Each RngTarget In RngRange01
            
            'Setting DatDate or DblJob according to RngTarget value.
            Select Case True
                Case Is = IsDate(RngTarget.Value)
                    DatDate = RngTarget.Value
                Case Is = IsNumeric(RngTarget.Value)
                    DblJob = RngTarget.Value
            End Select
            
            'Checking if a Count value is encountered.
            If RngTarget.Offset(0, 1).Value <> "" Then
                
                'If the actual RngResult refers to a different date or job, RngResult is set on the next row.
                If RngResult.Value <> DatDate Or RngResult.Offset(0, 1).Value <> DblJob Then
                    Set RngResult = RngResult.Offset(1, 0)
                End If
                
                'Filling in the results accordingly.
                RngResult.Value = DatDate
                RngResult.Offset(0, 1).Value = DblJob
                Select Case RngTarget.Offset(0, 1).Value
                    Case Is < 1000
                        RngResult.Offset(0, 2).Value = RngResult.Offset(0, 2).Value + 30
                    Case Is < 1500
                        RngResult.Offset(0, 2).Value = RngResult.Offset(0, 2).Value + 60
                    Case Is >= 1500
                        RngResult.Offset(0, 2).Value = RngResult.Offset(0, 2).Value + 90
                End Select
                
            End If
            
        Next
        
        'Deleting WksPivotTableWorksheet.
        Application.DisplayAlerts = False
        WksPivotTableWorksheet.Delete
        Application.DisplayAlerts = True
        
    End Sub
    
    子表()
    "声明,。
    变暗RNG源作为范围
    Dim RngResult As范围
    Dim RngRange01作为范围
    变光目标As范围
    日期为日期
    将DblJob设置为双精度
    将WKSPIVOTTABLE工作表设置为Workshe