优化与优化总结大型公式

时间:2017-08-30 11:47:12

标签: excel optimization excel-formula

我正在制作一个电子表格,根据估算的投入预测建筑业务中某些成本的变化。

例如,我们可能会推测,8月份布里斯班的木匠完成装修的价格将每平方米增加8美元。我们将此数据写为:

  • Area = Brisbane
  • 月=八月
  • 成本中心= Carpenter Fitout = 150
    • 我们将构建成不同成本中心的每项成本分摊,用数字表示。
  • 增加= $ 8
  • 单位= m2

根据这些数据,我们可以推测未来几个月每项成本会增加多少,而这正是我想要自动完成的。

以下是我在电子表格中使用的表格的表示。

原始数据

数据如何从导入工作表中查看原始数据的示例。

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分钟。

我正在寻求一个更加可靠的解决方案,我正在寻找有关如何做到这一点的建议。

1 个答案:

答案 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列,并且列为AreaMonthCentre列的组合。

在真实数据库中,这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个(RAWCALCCENTRE)已经显示为所需的表格格式,而第四个(DUMP)来自数据库所以你可以从它的来源获得所需的格式(如果不是你只需要将它打成形状 - 并不困难)。

使用SQL将表连接到所需的视图会替换复杂的嵌套VLOOKUP组,并且可能会更高效,更快。 MS Access是一个很好的解决方案,但如果没有,您可以尝试使用MS Query。后者可以通过功能区的“数据”选项卡(来自其他来源/来自Microsoft Query)访问,并且可以访问在Excel工作簿中设置为命名范围的表。使用MS Query,您需要将输入表放在结果视图中的不同工作簿中。

Access和Query都采用可视方法将表连接在一起,并且Web上将提供大量的教程资料。 Excel可以导入"视图"从Access(其中视图称为查询)和如果使用Query,关闭查询弹出窗口会导致提示数据应放置在工作簿中的位置。

在Excel中以数据库表格式获得结果后,数据透视表将快速将其转换为所需的输出格式。