Использование именованных диапазонов со встроенными формулами для данных диаграммы Excel - PullRequest
0 голосов
/ 17 мая 2018

У меня есть два раскрывающихся меню, в которых указан диапазон дат.Одна дата определяет начало диапазона, а другая - конец.Я также создал два именованных диапазона следующим образом:

chart_Dates=INDEX(Dates,MATCH(Home!$A$7,Dates,0)):INDEX(Dates,MATCH(Home!$A$9,Dates,0))
chart_Frequency=INDEX(Frequency,MATCH(Home!$A$7,Dates,0)):INDEX(Frequency,MATCH(Home!$A$9,Dates,0))

Dates, и Frequency из этих формул - именованные диапазоны с заданными границами.Если я вручную ввожу значения y как «Home! Chart_Frequency», а значения по горизонтали как Home!chart_Dates, макрос работает просто отлично.Я могу скорректировать даты начала и окончания, используя раскрывающиеся меню и графики обновляются соответственно.

Однако устройство записи макросов не переводит эти действия в код.Я попытался следующий код безуспешно (нет сгенерированной ошибки, но график ссылается только на первую ячейку в моем диапазоне).

ActiveChart.SeriesCollection(1).Values = Range("chart_Frequency")
ActiveChart.SeriesCollection(1).XValues = Range("chart_Dates")

Как мне получить код, чтобы повторить то, что я могу сделать вручную?Любой совет с благодарностью!

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вот код, который у меня есть сейчас.После запуска, когда я проверяю значения y и горизонтальные значения на самом графике, и они оба пустые.

'Create chart
Dim rng As Range
Dim cht As ChartObject

'Data range for the chart
Set rng = ActiveSheet.Range("$E$7:$F$501")

'Designates which cell to place the top left corner of the graph in
ActiveSheet.Range("N5").Select

'Create a chart
Set cht = ActiveSheet.ChartObjects.Add( _
Left:=ActiveCell.Left, _
Width:=360, _
Top:=ActiveCell.Top, _
Height:=216)

'Give chart some data
'I was using the line below to set the range but comment blocked it out and entered the suggested code
'  cht.Chart.SetSourceData Source:=rng
Dim freqRange As String
Dim datesRange As String
Dim Name As Variant
For Each Name In ThisWorkbook.Names
    If Name.Name = "chart_Frequency" Then
        freqRange = Name.Value
    ElseIf Name.Name = "chart_Dates" Then
        datesRange = Name.Value
    End If
Next Name
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.SeriesCollection.NewSeries
ActiveChart.FullSeriesCollection(1).Name = "=Home!$A$5"
ActiveChart.FullSeriesCollection(1).Values = datesRange
ActiveChart.FullSeriesCollection(1).XValues = freqRange

'Determine the chart type
cht.Chart.ChartType = xlLineMarkersStacked

'Remove Major Gridlines
cht.Chart.Axes(xlValue).MajorGridlines.Delete

'Sets the legend to the bottom of the graph
cht.Chart.SetElement (msoElementLegendBottom)
cht.Name = "Frequency_Chart"

'Add title and reference A5 for name
ActiveSheet.ChartObjects("Frequency_Chart").Activate
ActiveChart.SetElement (msoElementChartTitleAboveChart)
Application.CutCopyMode = False
Selection.Caption = "=Home!R5C1"
0 голосов
/ 17 мая 2018

Попробуйте:

Sub testing()
    Dim freqRange As String
    Dim datesRange As String
    Dim Name As Variant
    For Each Name In ThisWorkbook.Names
        If Name.Name = "chart_Frequency" Then
            freqRange = Name.Value
        ElseIf Name.Name = "chart_Dates" Then
            datesRange = Name.Value
        End If
    Next Name
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.FullSeriesCollection(1).Name = "=Sheet1!$B$1"
    ActiveChart.FullSeriesCollection(1).Values = datesRange
    ActiveChart.FullSeriesCollection(1).XValues = freqRange
End Sub

В моей диаграмме не было ни одной серии, поэтому она добавляет новую серию и обновляет Имя, Значения и XValues ​​без проблем.

...