Excel:使用公式处理数据
Posted
技术标签:
【中文标题】Excel:使用公式处理数据【英文标题】:Excel: processing data using formulas 【发布时间】:2021-03-19 12:37:09 【问题描述】:我的任务是使用 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
,则名称为30
,如果>=1000 and <1500
- 60
,如果>=1500
- 90
。在我们的示例中,Adam 得到 60
和 Mary 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 公式解决我的问题?也许有什么方法可以编写我自己的公式函数来计算我的值?
【问题讨论】:
你的输出是什么。在帖子中显示。 【参考方案1】:我不确定基于公式的解决方案是否会更快(特别是如果它必须处理超过 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
【讨论】:
以上是关于Excel:使用公式处理数据的主要内容,如果未能解决你的问题,请参考以下文章