Вопрос:
Я делаю линейный график (диаграмму) в Excel, и несколько строк данных строятся на одной диаграмме.
Мне нужно создать решение макро /VBA, которое может включать/отключать видимость этих серий нажатием кнопки (или галочкой и т.д.)
Подобно этому изображению (вручную выполняется через систему меню excel)
Я попытался просмотреть все членские классы/методы на
https://msdn.microsoft.com/EN-US/library/office/ff837379.aspx
но им не повезло.
Я пробовал играть с битами типа
Charts(«Chart1»).SeriesCollection(1)
и
Worksheets(«Graphical Data»).ChartObjects(1)
но я не могу получить объект диаграммы (я получаю индекс за пределами диапазона) и не могу найти какой-либо метод, который позволил бы мне включить/отключить видимость отдельных серий.
Любые идеи?
Лучший ответ:
Я считаю, что свойство, которое вы ищете, является свойством SeriesCollection.Format.Line.Visible. Я быстро создал книгу Excel и добавил простой набор данных (всего 1-10) и добавил линейный график “Диаграмма 2” на лист Sheet1.
Этот код изменил видимость строки:
Option Explicit Private Sub Test() Dim cht As Chart Dim ser As Series ‘Retrieve our chart and seriescollection objects’ Set cht = Worksheets(«Sheet1»).ChartObjects(«Chart 2»).Chart Set ser = cht.SeriesCollection(1) ‘Set the first series line to be hidden’ With ser.Format.Line .Visible = msoFalse End With End Sub
И аналогично, установка свойства ser.Format.Line.Visible на msoTrue снова сделала видимым изображение.
Что касается получения самой диаграммы, я должен был сначала ее активировать, а затем установить мою переменную cht в ActiveChart. Чтобы просмотреть название диаграммы, выберите его и посмотрите в поле имени (рядом с тем, где вы должны ввести значение ячейки/формулу).
Update
При использовании вышеописанного метода имя серии остается в поле легенды. Я не смог найти свойство видимости для SeriesCollection в легенде, однако одно обходное решение состоит в том, чтобы просто переименовать серию в виде пустой строки (это приведет к исчезновению серии из легенды), а затем переименуйте серию, когда вы хочу показать это.
Этот код ниже переключит видимость названия строки и серии в легенде.
Option Explicit Private Sub Test() Dim cht As Chart Dim ser As Series ‘Retrieve our chart and seriescollection objects’ Set cht = Worksheets(«Sheet1»).ChartObjects(«Chart 1»).Chart Set ser = cht.SeriesCollection(1) ‘Set the first series line to be hidden’ With ser.Format.Line If .Visible = msoTrue Then .Visible = msoFalse ser.Name = vbNullString Else .Visible = msoTrue ser.Name = «Series 1» End If End With End Sub
И всякий раз, когда вы используете .Format.Line.Visible = msoTrue, просто не забудьте установить ser.Name обратно на то, что имя для вашей серии.
Ответ №1
Всякий раз, когда я не знаю, как это сделать, я включаю макрокорректор.
У меня была диаграмма с четырьмя сериями, и я использовал функцию фильтра в Excel 2013, чтобы скрыть и показать вторую серию, в то время как макро-рекордер работал.
Вот соответствующий код:
ActiveChart.FullSeriesCollection(2).IsFiltered = True ‘ series 2 is now hidden ActiveChart.FullSeriesCollection(2).IsFiltered = False ‘ series 2 is now visible
Тип серии (строка или столбец) не имеет значения, это работает для любого из них.
Ответ №2
Существует простой способ включения и выключения видимости серии: использование фильтра для исходных данных.
Пусть это поможет вам легко следующим образом.
Вы можете вставить новое окно. Измените их в лист данных источника, а другое окно – в лист диаграммы. Затем расположите два окна, чтобы увидеть их одновременно. Теперь, если вы фильтруете серию, которая вам нравится в листе данных источника, вы увидите серию, которая вам нужна на другом листе.