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

StackOverflow https://stackoverflow.com/questions/163363

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: вышесказанное относится к 2003 году и ранее. В 2007 году, когда выбран график, вы сможете выполнить аналогичное действие, используя " Выбрать данные " параметр "Дизайн" вкладка ленты. Откроется диалоговое окно со списком серий для диаграммы. Вы можете выбрать серию так же, как и в Excel 2003, но вы должны использовать " Добавить " и " Изменить " кнопки для определения пользовательских серий.

Другие советы

Вот код из 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<*>quot; & startR & ":$D<*>quot; & (r - 1)
            c.SeriesCollection(c.SeriesCollection.Count).Values = "='" & s.Name & "'!$E<*>quot; & startR & ":$E<*>quot; & (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<*>quot; & startR & ":$F<*>quot; & (r - 1), minusvalues:="='" & s.Name & "'!$F<*>quot; & startR & ":$F<*>quot; & (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<*>quot; & startR & ":$D<*>quot; & (r - 1)
            c2.SeriesCollection(c2.SeriesCollection.Count).Values = "='" & s.Name & "'!$G<*>quot; & startR & ":$G<*>quot; & (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<*>quot; & startR & ":$H<*>quot; & (r - 1), minusvalues:="='" & s.Name & "'!$H<*>quot; & startR & ":$H<*>quot; & (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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top