Как создать столбчатую диаграмму с накоплением исключительно посредством программирования с помощью Excel VBA - PullRequest
2 голосов
/ 09 июля 2010

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

alt text http://officeimg.vo.msecnd.net/en-us/files/627/780/ZA010220411.gif

Ответы [ 3 ]

2 голосов
/ 16 июля 2010

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

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

ActiveChart.ChartType = xl3DColumnStacked

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

ActiveChart.SeriesCollection.NewSeries

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

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

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

2 голосов
/ 09 июля 2010

Самый простой способ запустить такую ​​задачу - посмотреть, что происходит, когда вы выполняете задачу вручную, используя Macro Recorder для захвата 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 при запуске макроса. Глядя на элементы Chart в обозревателе объектов, становится очевидно, что 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.)

0 голосов
/ 30 июля 2018

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

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

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

или

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

...