我正在制作一个电子表格,根据估算的投入预测建筑业务中某些成本的变化。
例如,我们可能会推测,8月份布里斯班的木匠完成装修的价格将每平方米增加8美元。我们将此数据写为:
根据这些数据,我们可以推测未来几个月每项成本会增加多少,而这正是我想要自动完成的。
以下是我在电子表格中使用的表格的表示。
数据如何从导入工作表中查看原始数据的示例。
Area | Month | Centre | Value | Unit
-------|-----------|--------|-------|------
Bris | August | 150 | 10 | %
Sydney | September | 350 | 15 | m2
如何将数据导入数据分析工作表。区域,月份和成本中心将在稍后组合用于VLOOKUP。
Label | Value | Unit
-------------------|-------|------
BrisAugust150 | 10 | %
SydneySeptember350 | 15 | m2
可以在导入中使用的所有单位,以及它们对应的计算。 m2,m2t,m3和EACH都使用相同的计算(计算4)。
Unit | Calc | Description
-----|------|------------
FLAT | 1 | = Increase_Value
% | 2 | = Month_Value * Increase_Value / 100
000 | 3 | = Standard_Value * Increase_Value / 1000
m2 | 4 | = Standard_Value * Increase_Value
m2t | 4 |
m3 | 4 |
EACH | 4 |
与每个成本中心对应的标准数量/维度的示例。
Centre | Value
-------|-------
50 | 6
100 | 12
150 | 17
200 |
250 | ...
300 |
350 |
400 | etc
原始数据在每个月初从实时数据库粘贴到此处,以表示与它们相关的成本。
July August September October
Centre
50 7 16 ... etc
100 68
150
200
250 ...
300
350
400 etc
输出结果的汇总版本,其中每个成本中心都针对每个月,如果导入中存在与这两个月相对应的内容,则将进行适当的计算。
布里斯班:
July August September October
Centre
50
100
150 10%
200
250
300
350
400
悉尼:
July August September October
Centre
50
100
150
200
250
300
350 15m2
400
该公式的伪代码版本,到目前为止将在每个单元格中显示。我认为使用标签而不是单元格引用,取出IFNA公式等来解密会更容易。
=CHOOSE(
VLOOKUP( // Determine whether to use calc 1, 2, 3, or 4.
VLOOKUP( // Unit of calculation (i.e. m2, EACH, etc).
Area&Month&Centre,
Import_Table_Value,
3,
FALSE
),
Calculation_Table,
2,
FALSE
),
VLOOKUP( // Calc 1: Flat increase will only look up the increase value.
Area&Month&Centre,
Import_Value_Table,
2,
FALSE
),
( // Calc 2: % increase.
VLOOKUP( // Lookup the value from the monthly data dump corresponding to the appropriate month & cost centre.
Centre, // Cost centre (for each row).
Monthly_Data_Dump,
Appropriate_Month_Column,
FALSE
) * VLOOKUP( // Lookup the increase value.
Area&Month&Centre,
Import_Value_Table,
2,
FALSE
) / 100
),
( // Calc 3: 000' increase
VLOOKUP( // Lookup the appropriate value from the cost centre values table.
Centre,
Centre_Values,
2,
FALSE
) * VLOOKUP( // Lookup the increase value.
Area&Month&Centre,
Import_Value_Table,
2,
FALSE
) / 1000
),
( // Calc 4: Linear increase.
VLOOKUP( // Lookup the appropriate value from the cost centre values table.
Centre,
Centre_Values,
2,
FALSE
) * VLOOKUP( // Lookup the increase value.
Area&Month&Centre,
Import_Value_Table,
2,
FALSE
)
)
)
基本上,公式将从1-4中查找一个数字并“选择”将使用哪个公式来确定单元格的值(如果有的话)。
电子表格有超过大约300,000个单元格可以在所有不同区域进行更新,并且运行公式需要一个小时或更长时间。我正在努力减少所有膨胀并改善工作表计算所需的时间。
我一直在尝试使用INDEX MATCH而不是VLOOKUPS,以及尝试一些可以在网上找到的一般优化技巧,但结果只需要5-10分钟。
我正在寻求一个更加可靠的解决方案,我正在寻找有关如何做到这一点的建议。
答案 0 :(得分:0)
从数据的角度来看,您有4组信息可以表示为
RAW | CALC | DUMP | CENTRE
----------|--------|----------|-----------
Area* | Unit* | Area* | Centre*
Month* | Calc | Month* | CentreValue
Centre*| | Centre*|
Value | | Dump |
Unit | | |
RAW
是您的原始数据表,CALC
是您的计算表,DUMP
相当于您的每月数据转储,CENTRE
是您的中心值表。
我们可以将这些视为数据库的表格,上面每列中的标签代表相应表格的列。带星号的列表示表的主键。因此,例如,表格RAW
有5列,并且列为Area
,Month
和Centre
列的组合。
在真实数据库中,这4个表可以连接起来形成一个"视图"看起来像
VIEW
--------
Area*
Centre*
Month*
Value
Dump
CentreValue
Calc
可以在此视图中添加一个附加列,例如Result
,并且(假设我已正确理解您的伪公式)指定为
Value if Calc = 1
Value*Dump if Calc = 2
Value*CentreValue/1000 if Calc = 3
Value*CentreValue if Calc = 4
冒着不了解数据的所有微妙之处的风险,我会考虑使用数据库方法实现上述目标。
您的输入中有3个(RAW
,CALC
和CENTRE
)已经显示为所需的表格格式,而第四个(DUMP
)来自数据库所以你可以从它的来源获得所需的格式(如果不是你只需要将它打成形状 - 并不困难)。
使用SQL将表连接到所需的视图会替换复杂的嵌套VLOOKUP
组,并且可能会更高效,更快。 MS Access是一个很好的解决方案,但如果没有,您可以尝试使用MS Query。后者可以通过功能区的“数据”选项卡(来自其他来源/来自Microsoft Query)访问,并且可以访问在Excel工作簿中设置为命名范围的表。使用MS Query,您需要将输入表放在结果视图中的不同工作簿中。
Access和Query都采用可视方法将表连接在一起,并且Web上将提供大量的教程资料。 Excel可以导入"视图"从Access(其中视图称为查询)和如果使用Query,关闭查询弹出窗口会导致提示数据应放置在工作簿中的位置。
在Excel中以数据库表格式获得结果后,数据透视表将快速将其转换为所需的输出格式。