Как создать диаграмму Excel, которая будет извлекать данные из нескольких листов?

У меня есть ежемесячные данные о продажах, хранящиеся на отдельных листах. Я хотел бы создать график продаж нескольких продуктов за месяц. Каждый продукт будет представлен отдельной цветной линией на одном графике с каждым месяцем, проходящим вдоль оси x.

Каков наилучший способ создания единой линейной диаграммы, которая берет данные из одних и тех же относительных ячеек на нескольких листах?

Решение

Используйте мастер диаграмм.

На шаге 2 из 4 есть вкладка "Серия". На этой вкладке есть 3 поля и поле со списком. В поле списка отображаются различные серии, которые вы уже включили в диаграмму. Каждая серия имеет поле "Имя" и поле "Значения", специфичные для этой серии. Последнее поле - это поле "Метки оси категорий (X)", которое является общим для всех серий.

Нажмите на кнопку "Добавить" под полем со списком. Это добавит пустую серию в окно списка. Обратите внимание, что значения для "Имени" и для "Значений" меняются, когда вы выделяете серию в окне списка.

Выберите новую серию.

В каждом поле справа есть значок. Этот значок позволяет выбрать ячейки в рабочей книге, из которых будут взяты данные. При нажатии на него Мастер временно скрывается (за исключением поля, в котором вы работаете), позволяя вам взаимодействовать с рабочей книгой.

Выберите соответствующий лист в рабочей книге, а затем выберите поля с данными, которые вы хотите отобразить на диаграмме. Кнопку справа от поля можно нажать, чтобы убрать мастер.

Надеюсь, это поможет.

EDIT: Вышеизложенное относится к 2003 и более ранним версиям. В 2007 году, когда выбран график, вы должны иметь возможность выполнить аналогичное действие, используя опцию "Выбрать данные" на вкладке "Дизайн" ленты. При этом откроется диалоговое окно со списком серий для графика. Серии можно выбирать так же, как и в Excel 2003, но для определения пользовательских серий необходимо использовать кнопки "Добавить" и "Изменить".

Комментарии (5)

Вот код из 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
Комментарии (1)

2007 более мощный с лентой...:=) Чтобы добавить новую серию в диаграмму, сделайте следующее: Выберите Диаграмма, затем нажмите Дизайн в Инструментах диаграммы на ленте, На ленте Design выберите "Select Data" в Data Group, Затем вы увидите кнопку Добавить для добавления новой серии.

Надеюсь, это поможет.

Комментарии (0)