如何创建从多个工作表中提取数据的Excel图表?
我将每月的销售数据存储在单独的表格中。我想创建一个每月销售多个产品的图。每个产品将在同一图表上以不同的彩色线条表示,每个月都沿x轴运行。
创建从多个工作表上的相同相对单元格提取单个折线图的最佳方法是什么?
解决方案
使用图表向导。
在第2步(共4步)中,有一个标签为"系列"的标签。此选项卡上有3个字段和一个列表框。列表框显示我们已经包括在图表中的不同系列。每个系列都有一个"名称"字段和一个特定于该系列的"值"字段。最后一个字段是"类别(X)轴标签"字段,该字段在所有系列中都是通用的。
单击列表框下方的"添加"按钮。这会将空白系列添加到列表框中。请注意,当我们在列表框中突出显示一个系列时,"名称"和"值"的值都会更改。
选择新系列。
右侧的每个字段中都有一个图标。此图标使我们可以选择工作簿中的单元格以从中提取数据。当我们单击它时,向导会暂时隐藏自身(正在使用的字段除外),从而使我们可以与工作簿进行交互。
在工作簿中选择适当的工作表,然后选择包含要在图表中显示的数据的字段。可以单击字段右侧的按钮以取消隐藏向导。
希望能有所帮助。
编辑:以上适用于2003年及之前。对于2007年,选择图表后,应该可以使用功能区"设计"选项卡上的"选择数据"选项执行类似的操作。这将打开一个对话框,列出该图表的系列。我们可以像在Excel 2003中一样选择系列,但是必须使用"添加"和"编辑"按钮来定义自定义系列。
功能区2007更强大。.:=)
要在图表中添加新系列,请执行以下操作:
选择"图表",然后在功能区上的"图表工具"中单击"设计",
在"设计"功能区上,在"数据组"中选择"选择数据",
然后,我们将看到"添加"按钮以添加新系列。
希望对我们有所帮助。
这是Excel 2010中可能有效的一些代码。它具有一些细节(例如,从标题中过滤错误编码的字符),但是它旨在根据具有绝对数据和基于百分比的数据的4维数据创建多个多系列图形。修改它喜欢的方式:
Sub createAllGraphs() Const chartWidth As Integer = 260 Const chartHeight As Integer = 200 If Sheets.Count = 1 Then Sheets.Add , Sheets(1) Sheets(2).Name = "AllCharts" ElseIf Sheets("AllCharts").ChartObjects.Count > 0 Then Sheets("AllCharts").ChartObjects.Delete End If Dim c As Variant Dim c2 As Variant Dim cs As Object Set cs = Sheets("AllCharts") Dim s As Object Set s = Sheets(1) Dim i As Integer Dim chartX As Integer Dim chartY As Integer Dim r As Integer r = 2 Dim curA As String curA = s.Range("A" & r) Dim curB As String Dim curC As String Dim startR As Integer startR = 2 Dim lastTime As Boolean lastTime = False Do While s.Range("A" & r) <> "" If curC <> s.Range("C" & r) Then If r <> 2 Then seriesAdd: c.SeriesCollection.Add s.Range("D" & startR & ":E" & (r - 1)), , False, True c.SeriesCollection(c.SeriesCollection.Count).Name = Replace(s.Range("C" & startR), "?", "") c.SeriesCollection(c.SeriesCollection.Count).XValues = "='" & s.Name & "'!$D$" & startR & ":$D$" & (r - 1) c.SeriesCollection(c.SeriesCollection.Count).Values = "='" & s.Name & "'!$E$" & startR & ":$E$" & (r - 1) c.SeriesCollection(c.SeriesCollection.Count).HasErrorBars = True c.SeriesCollection(c.SeriesCollection.Count).ErrorBars.Select c.SeriesCollection(c.SeriesCollection.Count).ErrorBar Direction:=xlY, Include:=xlBoth, Type:=xlCustom, Amount:="='" & s.Name & "'!$F$" & startR & ":$F$" & (r - 1), minusvalues:="='" & s.Name & "'!$F$" & startR & ":$F$" & (r - 1) c.SeriesCollection(c.SeriesCollection.Count).ErrorBar Direction:=xlX, Include:=xlBoth, Type:=xlFixedValue, Amount:=0 c2.SeriesCollection.Add s.Range("D" & startR & ":D" & (r - 1) & ",G" & startR & ":G" & (r - 1)), , False, True c2.SeriesCollection(c2.SeriesCollection.Count).Name = Replace(s.Range("C" & startR), "?", "") c2.SeriesCollection(c2.SeriesCollection.Count).XValues = "='" & s.Name & "'!$D$" & startR & ":$D$" & (r - 1) c2.SeriesCollection(c2.SeriesCollection.Count).Values = "='" & s.Name & "'!$G$" & startR & ":$G$" & (r - 1) c2.SeriesCollection(c2.SeriesCollection.Count).HasErrorBars = True c2.SeriesCollection(c2.SeriesCollection.Count).ErrorBars.Select c2.SeriesCollection(c2.SeriesCollection.Count).ErrorBar Direction:=xlY, Include:=xlBoth, Type:=xlCustom, Amount:="='" & s.Name & "'!$H$" & startR & ":$H$" & (r - 1), minusvalues:="='" & s.Name & "'!$H$" & startR & ":$H$" & (r - 1) c2.SeriesCollection(c2.SeriesCollection.Count).ErrorBar Direction:=xlX, Include:=xlBoth, Type:=xlFixedValue, Amount:=0 If lastTime = True Then GoTo postLoop End If If curB <> s.Range("B" & r).Value Then If curA <> s.Range("A" & r).Value Then chartX = chartX + chartWidth * 2 chartY = 0 curA = s.Range("A" & r) End If Set c = cs.ChartObjects.Add(chartX, chartY, chartWidth, chartHeight) Set c = c.Chart c.ChartWizard , xlXYScatterSmooth, , , , , True, Replace(s.Range("B" & r), "?", "") & " " & s.Range("A" & r), s.Range("D1"), s.Range("E1") Set c2 = cs.ChartObjects.Add(chartX + chartWidth, chartY, chartWidth, chartHeight) Set c2 = c2.Chart c2.ChartWizard , xlXYScatterSmooth, , , , , True, Replace(s.Range("B" & r), "?", "") & " " & s.Range("A" & r) & " (%)", s.Range("D1"), s.Range("G1") chartY = chartY + chartHeight curB = s.Range("B" & r) curC = s.Range("C" & r) End If curC = s.Range("C" & r) startR = r End If If s.Range("A" & r) <> "" Then oneMoreTime = False ' end the loop for real this time r = r + 1 Loop lastTime = True GoTo seriesAdd postLoop: cs.Activate End Sub