Excel:使用公式处理数据
我的任务是使用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,
表如下所示:
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
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