【问题标题】:Creating a multi-line chart in Excel - with calculations?在 Excel 中创建多折线图 - 使用计算?
【发布时间】:2018-02-25 17:47:35
【问题描述】:

尊敬的 StackOverflow 参与者,

我之前的帖子模棱两可,所以这里是第二次尝试。

我有以下数据表:

以及我想要制作的手绘示例:

我想制作一个图表,显示具有相同前四位数字的所有代码(原始图表数据图片的左列)的计算值。我想为每个日期显示一个数据点,将“A”列下的所有值相加。我会对“B”列做同样的事情。但是,“P”数据点是有问题的,因为它会使用以相同的前四位数字开头的 each 代码进行计算。我指的是电子表格顶部每个日期下方的“A”、“B”和“P”,如原始图表数据图片中所示。

“P”是一个百分比值,对于给定的单个代码,具有相应的“A”和“B”数值。对于具有相同前四位数字的每个单个代码,我会将 P 与 B 相乘,然后将这些结果中的每一个相加。然后我会将该总和除以这些相同单个代码的所有“B”值的总和。

我想为每个以相同四位数开头的唯一代码组创建一个 3 折线图。正如 cmets 中所建议的,将“P”值作为辅助轴并使用“A”和“B”的主轴是有意义的。

这些代码会发生变化,并且每周都会添加新的日期和相关值,所以我希望这个图表在原始数据被添加/更改时是动态的。

有没有办法为 Excel 中的图表执行这样的计算?我认为我对 VBA 和 Excel 的公式足够熟悉,可以做到这一点,但我想我会发现的。

谢谢大家,

安格斯

【问题讨论】:

  • 我什至会选择在这张图表上嵌入手绘图表。我有点困惑。
  • 例如,对于给定的日期,您有两个 B 列(我假设您指的是日期下的字母)。唯一区别这些显然是颜色(蓝色/黄色)和它们出现的顺序。您没有提及其中哪些将用于计算 P 并且没有显示 A 的值,这将使我能够自己计算出来。请参阅How to create a Minimal, Complete, and Verifiable example。我认为这个问题需要澄清,然后才能给出合适的答案。
  • FWIW...您可能会在第二轴上绘制 P,因为它是一个百分比并且与 A & B 的比例不同。您似乎在问题的后面但在之前你有令人困惑的陈述,恕我直言,......垂直左轴顶部有“B”,然后是“A”,然后是“P”。我在想也许你的意思是“侧面/水平条形图” - 在这种情况下,你需要单独的图表并将它们伪装成同一个图表的一部分。
  • 抱歉 - 我运行的宏更改了列名,因此有两个“B”列 - 已编辑。你是对的,我的措辞令人困惑,现在我读了你的评论。我将按照您的建议手绘并发布我所设想的图表 - 哈哈,这是个好主意。
  • 谢谢 QHarr - 我已经编辑了我的帖子 - 希望 - 澄清了一些事情。

标签: excel charts pivot-table excel-2013


【解决方案1】:

2 张设置。

1) Sheet1 被称为 DataSheet 并反映您的数据输入表。

2) Sheet2 被称为ChartData,它既有用于绘制图表的转换数据集,也有图表本身。这就是您实际希望数据集用于图表的方式。因此,如果您可以更改报告的格式,那么请始终尝试按照所示进行“平面文件”表格排列。

这是“之后”状态下的样子:

数据表:

dataSheet 中的单元格 B2 可以输入 4 位代码来绘制图表。

注意前导 ' 以保留开头的 0。

第 4 行中的公式:

A) F4 for p

=IFERROR(SUMPRODUCT(OFFSET($A$6,0,SUM(COLUMN(H1)-1),COUNTA(Codes),1),--(LEFT(Codes,4)=$B$2),OFFSET($A$6,0,SUM(COLUMN(F1)-1),COUNTA(Codes),1))/H4,"")

这应用了 p 计算

B) G4 for A

=SUMPRODUCT(OFFSET($A$6,0,SUM(COLUMN(G1)-1),COUNTA(Codes),1),--(LEFT(Codes,4)=$B$2))

对于给定的 4 位起始代码 G 列,此总和。

C) H4 for B

=SUMPRODUCT(OFFSET($A$6,0,SUM(COLUMN(H1)-1),COUNTA(Codes),1),--(LEFT(Codes,4)=$B$2))

对于给定的 4 位起始代码,H 列求和。

您可以将这些复制粘贴到 3 块中以设置未来范围的公式,即选择 F4:H4 并复制到 I4:K4 等,公式将适用于新范围。抱歉,我还没有调整这些,所以可以以某种方式拖动。

感谢 @Tom Sharpe 和 @shrivallabha.redij 解决 sumproduct 谜题 here,这是解决方案的一部分。

图表数据表:

A) B4 中的公式:

=DataSheet!F2

这可确保将开始日期设置为您范围内的第一个日期。

B) B5中的公式将B列向下拖动:

=IF(ROWS($B$4:$B5) <=INT(COLUMNS(dates)/3),$B$4+ROWS($B$5:$B5)*7,NA())

这可确保日期在所需的周数内每周(即加上 7 天)递增。由于每个日期重复 3 次,动态范围 dates 中的列数(涵盖 dataSheet 的第 2 行中的所有日期)除以 3 以获得实际应该绘制的周数。如果超过此数字,则输出#N/A,因为这不会绘制在图表上。

C) C4 中的公式,该公式被拖到 C 列下方,并跨越您使用的列,即所示示例中的列 E:

 =IFNA(INDEX(SOquestions.xlsb!dataRange,MATCH($B4,dates,0)+COLUMNS($E:E)-1),NA())

这将检索 B 列日期的 p, A and B 值。 dataRange 是在dataSheet 中保存您的源计算的动态范围。如果您打开名称管理器,选择dataRange,然后将光标放在Refers To 范围内,它所引用的动态范围由“行军蚂蚁”概述:

如果chartData 表中的日期列 (B) 为 #N/A,则关联的 p、A 和 B 默认为 #N/A,因此不会绘制。

绘制图表:

图表本身是一个组合图表,有4个动态系列。

系列以正常方式添加,但您引用了前面有 Sheetname! 的动态系列;如图所示。您使用 pSeries,aSeries, bSeriesdateSeries 进行绘图。

图表轴应设置为处理每周数据点。

组合图表设置:

注意 p 绘制在第二个 x 轴上并以百分比格式显示。

更新流程:

1) 在数据表中添加新行

2) 将三列的块复制到下一列。请注意,该块的第一列有一个 +7 来增加周数

3) 转到 ChartData 并在 B:E 列中向下拖动公式

4) 在dataSheet 单元格B2 中选择您感兴趣的代码,然后一切都会更新。

需要命名范围:

使用的动态命名范围。 Ctrl & F3 会弹出名称管理器,以便您添加这些。

动态命名范围的公式:

代码

=OFFSET(DataSheet!$A$6,0,0,COUNTA(DataSheet!$A$6:$A$1048576),1)

数据范围

=OFFSET(DataSheet!$F$4,0,0,1,COUNT(DataSheet!$F$2:$XFD$2))

日期

=OFFSET(DataSheet!$F$2,0,0,1,COUNT(DataSheet!$F$2:$XFD$2))

p系列

=OFFSET(DataSheet!$P$11,0,0,COUNT(DataSheet!$B$11:$B$1048576),1)

一个系列

=OFFSET(ChartData!$D$4,0,0,COUNT(ChartData!$B$11:$B$1048576),1)

b系列

=OFFSET(ChartData!$E$4,0,0,COUNT(ChartData!$B$11:$B$1048576),1)

日期系列:

=OFFSET(ChartData!$B$4,0,0,COUNT(ChartData!$B$11:$B$1048576),1)

注意:对于早期版本的 Excel 结束行和列必须调整

结束行 1048576 变为 65536 结束列 XFD 变为 IV

更多版本信息:

http://www.excelfunctions.net/Excel-2003-vs-Excel-2007.html

【讨论】:

  • 我将要上传的文件重命名为已转换为 xlsx,因此不再具有与其中一张答案图片中显示的名称相同的名称。
  • Qharr - 我喘不过气来。你的回答非常透彻和清晰。我对您的知识和技能印象深刻,并且真的感谢您花时间帮助我。这绝对解决了我的问题。我已经阅读了所有内容,并且我很确定我可以实现这一点。感谢您向我展示了一个很棒的答案!
  • 很高兴您花时间修改您的问题,并且实际上包括了一些手绘图 :-)
猜你喜欢
  • 2023-03-30
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多