我该如何创建一个从多个表格中提取数据的Excel图表?

7

我有一些存储在不同工作表中的月销售数据。我想创建一个每个月多个产品销售额的图表。每个产品将在同一张图表上用不同的颜色线条表示,每个月份将沿着x轴展示。

如何最好地创建一个单一折线图,它可以从多个工作表的相对单元格中提取数据?


1
不算是一个编程问题,除非你需要 VBA 代码来使图表动态化... - Marc Reside
1
@marc:也许他认为需要使用VBA。 - GEOCHET
我通常会尝试回答我遇到的问题。我是一个Excel专家(至少在2007年之前...我还没有足够使用2007)。 - Marc Reside
1
是的,所有2007年之前的专家都忙着寻找2007年中隐藏的所有功能,以扩展他们的专业知识... - Carl
这个问题更适合于superuser.com。 - user23987
显示剩余2条评论
3个回答

7
使用图表向导。
在4步骤中的第2步,有一个标签为“系列”的选项卡。此选项卡上有3个字段和一个列表框。列表框显示您已经包括在图表中的不同系列。每个系列都有一个“名称”字段和一个特定于该系列的“值”字段。最后一个字段是“类别(X)轴标签”字段,它适用于所有系列。
单击列表框下方的“添加”按钮。这将向您的列表框中添加一个空系列。当您突出显示列表框中的系列时,请注意“名称”和“值”的值会发生变化。
选择新系列。
每个字段右侧都有一个图标。此图标允许您选择工作簿中的单元格以提取数据。单击图标后,向导会暂时隐藏自己(除了您正在操作的字段之外),使您可以与工作簿交互。
选择工作簿中的适当工作表,然后选择要在图表中显示的数据字段。字段右侧的按钮可以单击以取消隐藏向导。
希望对您有所帮助。
编辑:上述内容适用于2003及更早版本。对于2007年版本,在选择图表时,您可以使用选项卡“设计”中的“选择数据”选项执行类似操作。这将打开一个对话框,列出图表的系列。您可以像在Excel 2003中一样选择系列,但必须使用“添加”和“编辑”按钮定义自定义系列。

显然,您总是可以手动键入所需的值到字段中,使用格式“=Sheet1!A2”,但我发布了更多GUI(鼠标导向)的操作方式。 - Marc Reside
我正在使用Excel 2007。如何启动向导?还是只需插入图表并使用图表工具(设计/布局/格式)创建图表?这个答案是否特定于Excel的某个版本? - AlanKley
我猜这只适用于Excel 2003及以前的版本。对于2007,您应该能够使用功能区定义系列。请给我一些时间进行检查。 - Marc Reside
我已更新答案并提供了正确的Excel 2007信息。 - Marc Reside
我非常感谢你的时间和回答,马克。 - AlanKley

0

这里是来自Excel 2010的一些代码,可能会有所帮助。它有一些特定的内容(例如从标题中过滤坏编码字符),但它旨在从具有绝对和基于百分比的数据的四维数据中创建多个多系列图表。您可以根据需要进行修改:

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

这实际上更适用于所有数据都在一个表格中的情况。但无论如何。 - Kev

-1

使用带有功能区的2007更加强大..:=) 要在图表中添加新系列,请执行以下操作: 选择图表,然后单击功能区上的“图表工具”中的“设计”选项卡, 在“设计”选项卡中,在“数据”组中选择“选择数据”, 然后您将看到添加新系列的按钮。

希望这能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接