theskiguy Ответов: 1

Создание объекта excel.worksheet из листа диаграммы


Я делаю некоторые графики в Excel через VB.net и у меня возникла проблема при попытке создать новый объект рабочего листа для диаграммы, которую я только что создал. Когда я закончу создавать диаграмму, я сделаю следующее, чтобы найти диаграмму на новом листе:

chartPage.Location(XlChartLocation.xlLocationAsNewSheet, "Chart")


После этого я могу активировать новый рабочий лист диаграммы с помощью:
Dim XLSheets As Sheets = xlWorkBook.Sheets
XLSheets("Chart").activate()


Затем я хочу создать новый объект рабочего листа для нового листа диаграммы, который я делаю:
Dim XLChartSheet As Excel.Worksheet
XLChartSheet = xlWorkBook.Sheets("Chart")


Однако это приводит к ошибке:

Невозможно привести COM-объект типа Microsoft.Офис.Взаимодействие.Превосходить.ChartClass для интерфейса типа Microsoft.Офис.Взаимодействие.Превосходить.Рабочий лист

Я также попробовал код ниже и получил ту же ошибку
XLChartSheet = CType(xlWorkBook.ActiveSheet, Excel.Worksheet)
XLChartSheet = CType(XLSheets("Chart"), Excel.Worksheet)


Я могу создать новый объект рабочего листа для листа без диаграммы, и он отлично работает. Мне кажется, что по какой - то причине он не считает этот лист диаграммы листом.

Есть предложения?

Что я уже пробовал:

Вот еще один мой код:

Dim chartPage As Excel.Chart
Dim xlCharts As Excel.ChartObjects
Dim myChart As Excel.ChartObject
Dim R1 As Range, R2 As Excel.Range
Dim chartRange As Excel.Range

xlCharts = xlWorkSheet.ChartObjects
myChart = xlCharts.Add(250, 10, 500, 350)
chartPage = myChart.Chart
            

'Create a union range for the chart range
R1 = xlWorkSheet.Range(xlWorkSheet.Cells(1, 1), xlWorkSheet.Cells(LastCellRow, 2))
R2 = xlWorkSheet.Range(xlWorkSheet.Cells(1, 4), xlWorkSheet.Cells(LastCellRow, 4))

chartRange = xlApp.Union(R1, R2)
chartPage.SetSourceData(Source:=chartRange)

'Set the chart range to columns
chartPage.PlotBy = Excel.XlRowCol.xlColumns


'Change the chart type for each series
Dim ChartSeries As Excel.SeriesCollection = chartPage.SeriesCollection
ChartSeries.Item(1).ApplyDataLabels(XlDataLabelsType.xlDataLabelsShowValue)
ChartSeries.Item(1).ChartType = XlChartType.xlColumnClustered

'Change the data label precision
If SelectedDownTimeChartUnits.ToUpper = "MINUTES" Then
   ChartSeries.Item(1).DataLabels.numberformat = "0"
Else 'Hours
   ChartSeries.Item(1).DataLabels.numberformat = "0.00"
End If

ChartSeries.Item(1).DataLabels.font.size = 7


'Create the 2nd series for the cumulative percentage
ChartSeries.Item(2).ApplyDataLabels(XlDataLabelsType.xlDataLabelsShowValue)
ChartSeries.Item(2).ChartType = XlChartType.xlLineMarkers
ChartSeries.Item(2).AxisGroup = XlAxisGroup.xlSecondary
'Format data labels
ChartSeries.Item(2).DataLabels.numberformat = "0.00%"
ChartSeries.Item(2).DataLabels.font.size = 7
ChartSeries.Item(2).DataLabels.position = Microsoft.Office.Interop.Excel.XlDataLabelPosition.xlLabelPositionAbove


'Move the legend
chartPage.Legend.Position = XlLegendPosition.xlLegendPositionBottom

'Add the main chart title
chartPage.HasTitle = True
chartPage.ChartTitle.Text = "Down Time Pareto for " & SelectedMachine & " From " & DatStart & " to " & DatEnd


'Add axis titles
XLAxisCategory = chartPage.Axes(, Excel.XlAxisGroup.xlPrimary)
XLAxisCategory.Item(XlAxisType.xlCategory).HasTitle = True
XLAxisCategory.Item(XlAxisType.xlCategory).AxisTitle.Text = "Down Time Reason"

XLAxisValue = chartPage.Axes(, XlAxisGroup.xlPrimary)
XLAxisValue.Item(XlAxisType.xlValue).HasTitle = True
XLAxisValue.Item(XlAxisType.xlValue).AxisTitle.Text = SelectedDownTimeChartUnits & " of Down Time"

'Add Secondary Axes title
XLSecondaryAxisValue = chartPage.Axes(, Excel.XlAxisGroup.xlSecondary)
XLSecondaryAxisValue.Item(XlAxisType.xlValue, XlAxisGroup.xlSecondary).HasTitle = True
XLSecondaryAxisValue.Item(XlAxisType.xlValue, XlAxisGroup.xlSecondary).AxisTitle.Text = "Cumulative %"
            
'AutoFit all the columns
xlWorkSheet.Columns.AutoFit()

'Move chart to separate sheet
chartPage.Location(XlChartLocation.xlLocationAsNewSheet, "Chart")

1 Ответов

Рейтинг:
4

Maciej Los

Если Sheets("Chart") объект представляет собой объект диаграммы в рабочей книге, который необходимо использовать Диаграмма[^] объект, а не Worksheet Обратите внимание, что объект диаграммы отличается от стандартного листа. Он не содержит ни одной клетки! Это всего лишь схема.

XLChartObject = DirectCast(xlWorkBook.Charts("Chart"), Excel.Chart)
'or
XLChartObject = DirectCast(XLSheets("Chart"), Excel.Chart)


MSDN писал:
Объект диаграммы также является членом коллекции листов. Коллекция листов содержит все листы в рабочей книге (как листы диаграмм, так и листы листов). Используйте Sheets(index), где index-это номер индекса или имя листа, чтобы вернуть один лист.


Для получения более подробной информации, пожалуйста, смотрите:
Интерфейс диаграмм (Microsoft.Офис.Взаимодействие.Превосходить)[^]
Создание диаграмм в Microsoft Office Excel 2003 с использованием кода Visual Basic для приложений[^]
Оператор DirectCast (Visual Basic) | Microsoft Docs[^]


theskiguy

Thank you for clearing this up for me. I was unaware that my chart worksheet wasn't an actual worksheet but rather a chart object. I do, however, have another question. The reason why I was trying to create the Worksheet object for the chart was because I wanted access to the page setup so I could add a footer to my chart when someone printed it. I noticed that the "chart" object has its own page setup so I'm thinking I don't really need the worksheet object anymore. I already have a chart object declared in my example called "chartpage", however, when I try to access the page setup, I am getting the following error: "Unable to set the LeftFooter Property of the page setup class"

chartPage.Параметры.LeftFooter = "Printed On &D &T" 'добавить дату/время

Есть предложения?

Maciej Los

Это еще один вопрос, и вы должны опубликовать его с помощью "быстрого ответа->Задавать вопрос- меню вверху этой страницы. Не забудьте поделиться своим кодом. Без этого я не смогу тебе помочь.
Можете ли вы принять этот ответ как решение (зеленая кнопка) - формально удалить свой вопрос из списка без ответа?

Maciej Los

Спасибо, что приняли решение. А сейчас в Польше уже поздновато, так что я пойду спать. Если вы хотите сообщить мне, что опубликовали еще один вопрос, используйте виджет "ответить" в моем комментарии. Я посмотрю на него.

theskiguy

Мне удалось выяснить, как поместить нижний колонтитул на лист диаграммы. Я только что сделал новый объект "диаграмма" после перемещения диаграммы на новый лист, используя ваш первый пример выше. По какой-то причине он не будет работать с моим исходным объектом диаграммы "chartpage". Спасибо за вашу помощь.

Maciej Los

Вы пробовали что-то подобное:
With XLChartObject.PageSetup
    .LeftFooter = "bla bla bla"
End With

theskiguy

Если он попробует это сделать на моем исходном объекте диаграммы "ChartPage", я все равно получу ошибку "Невозможно установить свойство leftfooter". Если я определю новый объект диаграммы после перемещения диаграммы на новый лист, то он будет работать. Кажется, теперь все работает отлично.