Добавить пустую серию на диаграмме Excel - PullRequest
1 голос
/ 06 апреля 2011

Я пытаюсь добавить много серий в диаграмму, используя VBA, как показано в коде ниже.

For i = 0 To 9
    Set serNew = chtMap.SeriesCollection.NewSeries
    With serNew
        .XValues = Range("Y4").Cells(1, 1 + 2 * i).Resize(32000, 1) 
        .Values = Range("Y4").Cells(1, 2 + 2 * i).Resize(32000, 1) 
    End With
Next i

Диапазоны для некоторых серий еще не имеют данных в своих ячейках; пользователь запишет / загрузит эти данные позже. Идея состоит в том, чтобы иметь диаграмму, готовую к тому, когда они делают.

Проблема : когда цикл достигает такого еще пустого диапазона, я получаю ошибку 1004: Невозможно установить свойство XValues ​​класса Series. Почему и есть ли способ обойти это?

Странно то, что делать это вручную в меню Chart -> | Source Data ... работает отлично. На самом деле, если вы записываете макрос при этом вручную, результат будет следующим:

ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(4).XValues = "=Sheet2!R4C31:R32003C31"
ActiveChart.SeriesCollection(4).Values = "=Sheet2!R4C32:R32003C32"

но тогда Excel выдает ошибку при повторном воспроизведении этого макроса!

Выполнение этого вручную не является приятной перспективой. Я полагаю, что я могу вставить ложные данные в ячейки, создать серию и затем удалить ложные данные. Неужели мне нужно вытянуть такую ​​наживку и включить Excel?

Ответы [ 4 ]

1 голос
/ 12 апреля 2011

Вы можете попробовать скопировать диапазон (оба столбца) и использовать специальную вставку, чтобы добавить его на график:

TwoColumnRange.Copy
chtMap.SeriesCollection.Paste Rowcol:=xlColumns, SeriesLabels:=False, _
    CategoryLabels:=True, Replace:=False, NewSeries:=True
0 голосов
/ 18 октября 2016

Старый вопрос, но ...

Я только что написал этот код и протестировал его в Excel 2010 и 2016. Он добавляет новую серию в существующую диаграмму разброса XY, а новая формула ряда связывает пустые диапазоныиспользуется для .Name, .Values ​​и .XValues:

Sub AddBlankSeries()
  Dim srs As Series

  Set srs = ActiveChart.SeriesCollection.NewSeries

  With srs
    .Name = "=" & ActiveSheet.Range("E2").Address(, , , True)
    .Values = ActiveSheet.Range("E3:E8")
    .XValues = ActiveSheet.Range("D3:D8")
  End With
End Sub

Затем я вернулся к исходному коду:

Sub AddSeveralBlankSeries()
  Dim i As Long
  Dim chtMap As Chart
  Dim serNew As Series

  Set chtMap = ActiveSheet.Shapes.AddChart(xlXYScatterLines).Chart

  For i = 0 To 9
    Set serNew = chtMap.SeriesCollection.NewSeries
    With serNew
      .XValues = Range("Y4").Cells(1, 1 + 2 * i).Resize(32000, 1)
      .Values = Range("Y4").Cells(1, 2 + 2 * i).Resize(32000, 1)
    End With
  Next i
End Sub

Это также работает нормально, и серия ссылается на ожидаемыйдиапазоны на листе.

Так что я не знаю, в чем проблема.

0 голосов
/ 12 апреля 2011

Я решил добавить кнопку листа, которая вызывает подпрограмму, которая может добавить серию после ввода данных.Он также проверяет, являются ли различные диапазоны пустыми, прежде чем фактически добавлять каждую серию.Это похоже на самое чистое решение.

0 голосов
/ 07 апреля 2011

Я предлагаю (как я это сделал сам) спрятать где-нибудь фальшивые данные, чтобы все серии по умолчанию указывали на них.Также скрыть сериал от сюжета с .LineStyle=xlNone и .MarkeStyle=xlNone и даже ActiveChart.Legend.LegendEntries(i).Delete.Затем, когда клиент заполняет данные, запустите макрос, который заменяет точку, на которую указывает серия, и задает стили линии / маркера, а также ActiveChart.HasLegend = True, чтобы воссоздать записи легенды.На самом деле мне пришлось выключить и снова включить легенду, чтобы все правильно восстановилось.

Удачи.

...