我有一些急需分析的数据,但我不知道该怎么做。数据分为三列;第一列是日期。日期没有按顺序排列(出于各种原因),新数据只是添加到列表底部。第二列是产品的销售价格,第三列是产品类型。例如:
计算必须基于任一类型的最近七个价格。第三低价格和第二高价格分别进入以单元格“A”( F12
) 和“B”( G12
) 开头的表格。
第三个公式应消除(忽略)最近七个价格中的最高价和最低价,并计算剩余五个价格的平均值。该公式位于表格的最后一列,从单元格“C”开始(H12
)。
然后我需要一个条形/线形图组合,横轴为“类型”,纵轴为“价格”。我需要一个堆叠条形图,显示较低范围(单元格“A”)和较高范围(单元格“B”),以及一个与平均值叠加的线形图(单元格“C”)。
我不是 Excel 专家,我尝试了所有自助教程来解决这个问题。我曾经认为这些教程VLOOKUP
可能有用,但现在我不知所措了。
答案1
好的,Scott 提到的在某一天禁止多次销售同一类型商品的限制使这一操作成为可能。但这仍然相当复杂。使用 VBA 可能简单得多,也许有人会在这里发布一个程序。
我将首先使用“辅助”表,因为它有助于查看中间数据并仔细检查计算是否正确,但我还将展示不使用辅助表的公式。辅助表与结果一起显示如下。
我使用了随机价格和日期,但遵守了上述关于每个日期给定类型的多个销售的限制。现在让我们构建 F2 中的公式。
首先,我们需要一个包含每种类型最近 7 个价格的数组。一旦有了这些数组,就可以轻松地从该数组计算结果表中的三个指标。
我们从这个表达式开始:($C$2:$C$55=ROW()-1)
。这是 F2 中公式的一部分,因此ROW()-1
等于 1,并且此表达式给出一个 True/False 值数组,其中 Type 等于 1 的地方为 True,其他地方为 False。随着它向下填充,它ROW()
会递增,因此在下一行中,它会给出一个数组,其中 Type 等于 2 的地方为 True,等等。
现在我们将这个数组乘以日期列:($A$2:$A$55)*($C$2:$C$55=ROW()-1)
。这将得到一个包含 Type 等于 1 的日期的数组,其他位置都为 False。
现在我们想要其中最近的 7 个日期,我们使用该LARGE()
函数获取这些日期。由于上述限制(每个日期只有一次类型 1 销售),这将给出类型 1 的最近 7 次销售的日期:
LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-1),{1,2,3,4,5,6,7})
大括号中的一系列数字表示LARGE()
返回第 1 到第 7 大的值。
现在我们使用来IF()
获取与这些日期相对应的价格:
IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-1),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-1),$B$2:$B$55)
的逻辑测试的第一部分IF()
返回一个数组,其中 A 列中的日期是上述 7 个日期之一,并且该数组再次乘以 type = 1 的数组,因为在这 7 个日期售出了其他类型。因此,测试IF()
A 列中的日期是否等于 7 个最近日期的数组之一和该日期的特定销售是否属于类型 = 1。如果两个条件都为真,则IF()
返回 B 列的销售价格,否则返回 False。
现在,为了在辅助表中从高到低列出价格,我们使用LARGE()
:
(LARGE(IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-1),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-1),$B$2:$B$55),COLUMN()-5)
此公式位于 F 列,因此COLUMN()-5
等于 1,并且该公式返回该列中数组的第 1 大值。随着填充,它会COLUMN()
递增,因此在下一列中,它会给出第 2 大的值,依此类推。
最后,公式被包装起来,IFERROR()
因此当给定类型的销售额少于 7 时,它将返回空白。最终公式:
=IFERROR(LARGE(IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-1),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-1),$B$2:$B$55),COLUMN()-5),"")
在 F2 中输入。由于它是一个数组公式,因此必须使用CTRLShiftEnter而不是仅使用 来输入Enter。如果输入正确,Excel 将在公式栏中使用花括号 {} 将公式括起来。输入后,选择 F2 并向下填充公式,然后横着填充以提供上面的辅助表。
现在很容易填写结果表。这两个公式
=SMALL(F2:L2,3) and =LARGE(F2:L2,2)
计算辅助表第一行中第三小和第二大的值。此公式
=AVERAGE(IFERROR(LARGE(F2:L2,{2,3,4,5,6}),""))
计算中间 5 个值的平均值。这也是一个数组公式,因此必须按上述方式输入。填写这些公式即可得到结果表。
要在不使用辅助表的情况下填充结果表,请使用 F、G 和 H12 中的这三个数组公式并向下填充:
=SMALL(IFERROR(LARGE(IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-11),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-11),$B$2:$B$55),{1,2,3,4,5,6,7}),""),3)
=LARGE(IFERROR(LARGE(IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-11),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-11),$B$2:$B$55),{1,2,3,4,5,6,7}),""),2)
=AVERAGE(IFERROR(LARGE(IFERROR(LARGE(IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-11),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-11),$B$2:$B$55),{1,2,3,4,5,6,7}),""),{2,3,4,5,6}),""))
我希望这对你有所帮助,并且我相信一旦你有了这些数据,你就可以制作出你想要的图表。
欢迎任何意见或建议。