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

Я создаю отображение ProcessBook, которое заполняет встроенный объект Microsoft Office 11.0 Spreadsheet (Office 2003) набором записей.Затем я вычисляю совокупные данные о них;эти сводные данные не должны отображаться в форме электронной таблицы на экране, но их необходимо использовать для создания гистограммы.Данные в настоящее время используются для заполнения отдельного объекта электронной таблицы Microsoft Office 11.0.Он организован таким образом, что заголовок каждой столбчатой ​​диаграммы находится в столбце A, а соответствующее значение - в столбце B.

Поскольку это ProcessBook, у меня возникли некоторые трудности даже при получении доступа к встроенным объектам, но яНам удалось внедрить и получить доступ к объекту ChartSpace, а также к дочернему ChChart объекту.К сожалению, я не могу понять, как вручную установить значения столбцов или как использовать методы .SetData или .SetSpreadsheetData, чтобы указать его на заполненный объект.

Доступобъект ChartSpace довольно прост: ThisDisplay.ChartSpace1
Затем я могу добавить диаграмму и получить к ней доступ довольно легко:
Dim objChart as ChChart<br> Set objChart = ThisDisplay.ChartSpace1.Charts.Add(0)

Я также могу довольно легко получить доступ к значениям своей электронной таблицы:
strBarName = ThisDisplay.sstChartData.Range("A2").Value<br> intBarVal = ThisDisplay.sstChartData.Range("B2").Value

Как мне на самом деле установить источник данных или вручную установить значения столбцов в объекте ChChart?Или как использовать другой объект для достижения той же цели?

1 Ответ

0 голосов
/ 14 декабря 2010

Видимо, настойчивость является ключом здесь. Мне удалось определить, как добавлять значения вручную и как ссылаться на существующий объект электронной таблицы. Оба примера в значительной степени взяты из онлайн-документации ChChart; Наверное, я просто устал, когда пытался это сделать, и, должно быть, что-то где-то опечатал.

</p> <pre><code>Public Sub AddValuesToChartManually() Dim objChart As ChChart With ThisDisplay.ChartSpace1 Do While .Charts.Count > 0 ThisDisplay.ChartSpace1.Charts.Delete (0) Loop Set objChart = .Charts.Add objChart.HasTitle = True objChart.Title.Caption = "Chart Title" objChart.Axes.Item(0).HasTitle = True objChart.Axes.Item(1).HasTitle = True objChart.Axes.Item(0).Title.Caption = "Axis 0" objChart.Axes.Item(1).Title.Caption = "Axis 1" objChart.HasLegend = False Dim astrHeaders(0 To 4) As String Dim aintValues1(0 To 4) As String Dim aintValues2(0 To 4) As String Dim astrSeries1(0) As String Dim astrSeries2(0) As String astrHeaders(0) = "AL1" astrHeaders(1) = "AL2" astrHeaders(2) = "AL3" astrHeaders(3) = "AL4" astrHeaders(4) = "AL5" astrSeries(0) = "Series Name" aintValues(0) = 1 aintValues(1) = 3 aintValues(2) = 17 aintValues(3) = 1 aintValues(4) = 7 objChart.Type = .Constants.chChartTypeColumnClustered Call objChart.SetData(chDimSeriesName, .Constants.chDataLiteral, astrSeries) Call objChart.SetData(chDimCategories, .Constants.chDataLiteral, astrHeaders) Call objChart.SeriesCollection(0).SetData(.Constants.chDimValues, .Constants.chDataLiteral, aintValues) End With End Sub Public Sub AddValuesFromSpreadsheet() Dim objChart1 As ChChart With ThisDisplay.ChartSpace1 Do While .Charts.Count > 0 ThisDisplay.ChartSpace1.Charts.Delete (0) Loop Set .DataSource = ThisDisplay.sstChartData Set objChart1 = .Charts.Add ' Set the chart type. objChart1.Type = .Constants.chChartTypeColumnClustered ' Display titles objChart1.HasTitle = True objChart1.Title.Caption = "Chart Title" ' Bind the series name to cell B1 in the first sheet of the spreadsheet objChart1.SetData chDimSeriesNames, .Constants.chDataBound, "B1" ' Bind the category axis to cell A2:A28 in the first sheet of the spreadsheet. objChart1.SetData chDimCategories, .Constants.chDataBound, "A2:A6" ' Bind the values of the data series to cells B2:B28 in the first sheet of the spreadsheet. objChart1.SeriesCollection(0).SetData chDimValues, .Constants.chDataBound, "B2:B6" End With End Sub

...