Как создать столбчатую диаграмму с накоплением исключительно с помощью программирования с помощью excel vba?

Я пытаюсь создать гистограмму с накоплением в VBA, где есть гистограмма, и каждая гистограмма показывает разбивку подкатегорий на графике (см. правую часть изображения). Для обычной гистограммы все, что мне нужно было сделать, это создать новую серию и установить свойства Values ​​и XValues. Я не уверен, как рассказать о значениях для подкатегорий.

alt text
(источник: msecnd.net)


person James    schedule 09.07.2010    source источник
comment
Это не то, что я делал в Excel, но по моему опыту все, что можно сделать вручную, можно сделать с помощью vba. Разбейте, что вам нужно сделать, шаг за шагом, затем просмотрите API и выясните, как это сделать. msdn.microsoft.com/en-us/library/aa213725 (офис.11).aspx   -  person buckbova    schedule 09.07.2010


Ответы (3)


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

Например, я просто записал это (в Excel XP, но более поздние версии должны быть похожими). Код точно такой, как записан:

Option Explicit

Sub Macro1()
'
' Macro1 Macro
' Macro recorded 09/07/2010 by MW
'

'
    Range("B4:D6").Select
    Charts.Add
    ActiveChart.ChartType = xlColumnStacked
    ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("B4:D6"), PlotBy:= _
        xlRows
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
End Sub

Глядя на приведенное выше, я бы сказал, что первая строка, Range("B4:D6").Select, не нужна, так как она повторяется ниже.

Теперь немного почистить. Здесь Object Browser может быть чрезвычайно полезен. Если вы не знакомы, попробуйте нажать F2 в редакторе VBA. Немного сузьте контекст, выбрав «Excel» в верхнем раскрывающемся списке и просмотрев диаграммы в списке классов. Выбор Add в списке «Члены...» дает это в нижней панели:

Function Add([Before], [After], [Count]) As Chart
    Member of Excel.Charts

Таким образом, Charts.Add возвращает диаграмму, которая должна быть ActiveChart, на которую неоднократно ссылаются в остальной части кода. Такое дублирование утомительно (и может влиять на производительность), поэтому я бы немного переработал. Давайте предположим для упражнения, что мы собираемся выбрать наши целевые данные перед запуском макроса, поэтому они будут в Selection, когда макрос запустится. Глядя на элементы диаграммы в обозревателе объектов, становится очевидным, что Source в SetSourceData должно быть Range. Давайте попробуем это:

Sub Macro1()
    With Charts.Add
        .ChartType = xlColumnStacked
        .SetSourceData Source:=Selection, PlotBy:=xlRows
        .Location Where:=xlLocationAsObject, Name:="Sheet1"
    End With
End Sub

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

Sub CreateStackedColumnChartFromSelection()
Dim src As Range
    Set src = Selection
    With Charts.Add
        .ChartType = xlColumnStacked
        .SetSourceData Source:=src, PlotBy:=xlRows
        .Location Where:=xlLocationAsObject, Name:="Sheet1"
    End With
End Sub

Оттуда вы сможете найти все виды настроек (помните Object Browser!), Чтобы получить диаграмму, как вы хотите. (Имейте в виду, что в зависимости от вашей версии Excel могут быть некоторые второстепенные функции, недоступные через VBA.)

person Mike Woodhouse    schedule 09.07.2010

Чтобы создать эффект сложенного столбца, вам нужно создать серию для каждого подразделения в столбце. Например, скажем, у нас было 4 зоопарка. Скажем, они расположены в Майами, Атланте, Нью-Йорке и Лас-Вегасе. Также у нас есть 4 животных: львы, тигры, медведи и тюлени. И нам нужен столбец с накоплением, показывающий количество каждого животного, а также общее количество животных.

Сначала установите тип диаграммы xl3DColumnStacked следующим образом.

ActiveChart.ChartType = xl3DColumnStacked

Затем мы создадим серию для каждого животного.

ActiveChart.SeriesCollection.NewSeries

Затем задайте для свойства Values ​​массив значений для животного, а для свойства XValues ​​— массив названий городов. Итак, если первая серия была для львов, создайте массив с количеством львов в Майами, Атланте, Нью-Йорке, Лас-Вегасе и массив, содержащий строки «Майами», «Атланта» и т. д. Массив cityNames будет повторно использоваться для каждого Series, но lionCounts, очевидно, каждый раз будут заменяться соответствующим массивом. т. е. TigerCounts, BearCounts и т. д.

ActiveChart.SeriesCollection(1).Values = lionCounts
ActiveChart.SeriesCollection(1).XValues = cityNames

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

person James    schedule 15.07.2010

При записи макроса вручную для ChartType предлагаются две возможности; один график по строкам, другой по столбцам. Если это будет изменено позже каким-либо другим процессом, макрос не знает, как переключить его обратно.

Чтобы убедиться, что он отображается правильно каждый раз, укажите значение ActiveChart.SetSourceData, например.

ActiveChart.SetSourceData Range("A1:B2"), xlRows

or

ActiveChart.SetSourceData Range("A1:B2"), xlColumns

person PluckyBob    schedule 30.07.2018