Создание диаграмм с именованными диапазонами в VBA - PullRequest
2 голосов
/ 30 декабря 2011

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

ChartName = ActiveSheet.Range(n).Offset(0, -6) & " " & ActiveSheet.Range(n).Offset(0, -5)

Я получаю сообщение об ошибке в приведенной выше строке из-за несоответствия типов, которое я просто не могу понять, как с этим бороться. Кроме того, ActiveSheet.ChartObjects.Add отображает неверное присвоение свойства!

Sub WEO_DevCharts()

Sheets("WEO").Activate

Dim objChart As ChartObject
Dim n As Name
Dim ChartName As String

For Each n In ActiveSheet.Names

    If n.Name <> "DateRange" Then

    ChartName = ActiveSheet.Range(n).Offset(0, -6) & " " & ActiveSheet.Range(n).Offset(0, -5)

        Set objChart = ActiveSheet.ChartObjects.Add

        With objChart.Chart
            .chartType = xlXYScatterLines
            .SeriesCollection.Values = n.Value
            .SeriesCollection.XValues = ActiveSheet.Range("DateRange").Value
            .SeriesCollection.Name = ChartName
            .legend.Delete
        End With
    End If
    Next n
    End Sub

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Я внес ряд изменений ниже

(Обновлен для обработки двух отдельных диапазонов на листе, диапазона, называемого DateRange, и одного, называемого Test. Оба диапазона являются локальными для листа, чтобы соответствовать тесту ActiveSheet, иначе они будут принадлежать ActiveWorkbook {но DateRange может быть глобальным или локальным и в любом случае будет отображаться нормально})

  1. Вместо ActiveSheet.Range(n).Offset(0, -6) вам нужна одна ячейка, вероятно, первая в диапазоне n, то есть Range(n).Cells(1).Offset(0, -6) (плюс это означает, что ваш заголовок лежит на 6 столбцов слева от имени диапазона - убедитесь, что есть место)
  2. Попробуйте добавить свой график как ActiveSheet.ChartObjects.Add(Left:=500, Width:=300, Top:=50, Height:=400)
  3. После того, как вы установили тип xy, вы можете установить исходный диапазон прямо на имя диапазона n, а затем добавить диапазон DateRange в качестве серии x
  4. Добавьте название вашей серии к первой серии, т.е. .SeriesCollection(1).Name = ChartName, а не .SeriesCollection.Name = ChartName
  5. Я использовал InStr(n.Name, "DateRange") = 0 вместо вашего n.Name <> "DateRange", чтобы избежать обработки любых версий DateRange с локальными именами, т.е. WEO!DateRange

Я предлагаю вам взглянуть на отличный сайт Джона Пельтье для более подробных примеров кода

Пример скриншота моего тестового кода для локального имени листа

  • Test в H10:H13
  • DateRange в D14:D17

enter image description here

    Sub WEO_DevCharts()
    Sheets("WEO").Activate
    Dim objChart As ChartObject
    Dim n As Name
    Dim ChartName As String
    For Each n In ActiveSheet.Names
        If InStr(n.Name, "DateRange") = 0 Then
            ChartName = Range(n).Cells(1).Offset(0, -6) & " " & Range(n).Cells(1).Offset(0, -5)
            Set objChart = ActiveSheet.ChartObjects.Add(Left:=500, Width:=300, Top:=50, Height:=400)
            With objChart.Chart
                .ChartType = xlXYScatterLines
                .SetSourceData Range(n)
                .SeriesCollection(1).XValues = Range("DateRange")
                .SeriesCollection(1).Name = ChartName
                .Legend.Delete
            End With
        End If
    Next n
End Sub
0 голосов
/ 30 декабря 2011

Вместо ActiveSheet.Range(n) или n.Value, используйте n.RefersToRange, чтобы получить диапазон, к которому относится имя

...