Создание диаграммы в VBA с использованием метода Cells - ошибка приложения или объекта
Я пытаюсь создать диаграмму с помощью VBA в Excel 2010. Я пытаюсь выбрать данные из другого листа в той же книге. Данные, однако, являются горизонтальными (и должны храниться таким образом), поэтому мне нужно использовать функцию Cells(), чтобы выбрать данные для диаграммы.
Однако, похоже, это не работает, и я не могу понять, почему. Я получаю сообщение об ошибке "Ошибка приложения или объекта" в любой строке, в которой для определения диапазона используется функция Cells(). Однако, если Cells() используется для ссылки на одну ячейку, он работает нормально.
Может ли Range(Cells(x, y), Cells(z, w)) не использоваться в этом случае?
Вот соответствующий код:
BinNumber = 2048
Worksheets("Graph One").Activate
Range("A1").Select
'Setting the range the chart will cover
Set rngChart = ActiveSheet.Range("H2:U26")
'Dimensioning the chart and choosing chart type
Set co = ActiveSheet.Shapes.AddChart(xlXYScatter, rngChart.Cells(1).Left, rngChart.Cells(1).Top, rngChart.Width, rngChart.Height)
Set cht = co.Chart
Set sc = cht.SeriesCollection
'Remove any default series
Do While sc.Count > 0
sc(1).Delete
Loop
'Setting chart data
'Graphing Data
With cht.SeriesCollection.NewSeries
.Name = Worksheets("Transposed Data").Cells(3, 1)
.XValues = Worksheets("Transposed Data").Range(Cells(2, 5), Cells(2, BinNumber + 4))
.Values = Worksheets("Transposed Data").Range(Cells(3, 5), Cells(3, BinNumber + 4))
.MarkerSize = 4
.MarkerStyle = xlMarkerStyleCircle
End With
'Setting chart labels
With cht
.HasTitle = True
.ChartTitle.Characters.Text = "Counts per energy level"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Energy (keV)"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Counts"
.Axes(xlCategory).HasMajorGridlines = True
.Axes(xlCategory).HasMinorGridlines = True
End With
Код останавливается, когда он пытается установить значения x и y под заголовком Graphing Data.
Просто чтобы выделить это, я включу его снова ниже.
'Graphing Data
With cht.SeriesCollection.NewSeries
.Name = Worksheets("Transposed Data").Cells(3, 1)
.XValues = Worksheets("Transposed Data").Range(Cells(2, 5), Cells(2, BinNumber + 4))
.Values = Worksheets("Transposed Data").Range(Cells(3, 5), Cells(3, BinNumber + 4))
.MarkerSize = 4
.MarkerStyle = xlMarkerStyleCircle
Данные для значений x находятся в диапазоне от E2 до BZX3, а данные для значений y находятся в диапазоне от E3 до BZX3. Ячейка A3 просто имеет название для диаграммы.
1 ответ
Однако, если Cells() используется для ссылки на одну ячейку, он работает нормально.
Это не совсем так.
Проблема в том, что Cells(2, 5)
всегда относится к активному листу, если он не полностью квалифицирован. Таким образом, в этой строке Cells
Метод квалифицирован для явной ссылки на лист, и ошибки не должно быть. Это может быть то, что вы видели, что это "единая клетка", но различие здесь в том, что она полностью квалифицирована.
.Name = Worksheets("Transposed Data").Cells(3, 1)
Эта строка не будет работать, если не будет активен лист "Транспонированные данные" ( не рекомендуется) или вы не полностью определите диапазон.
.XValues = Worksheets("Transposed Data").Range(Cells(2, 5), Cells(2, BinNumber + 4))
Это эквивалентно:
.XValues = Worksheets("Transposed Data").Range(ActiveSheet.Cells(2, 5), ActiveSheet.Cells(2, BinNumber + 4))
Когда мы говорим об этом, становится яснее, что существует вероятность ошибки:)
Вот ваш код, слегка реструктурированный. Я буду использовать With
блок для самого листа и создайте переменную для представления серии:
Dim srs as Series
Set srs = cht.SeriesCollection.NewSeries
With Worksheets("Transposed Data")
srs.Name = .Cells(3, 1)
srs.XValues = .Range(.Cells(2, 5), .Cells(2, BinNumber + 4))
srs.Values = .Range(.Cells(3, 5), .Cells(3, BinNumber + 4))
srs.MarkerSize = 4
srs.MarkerStyle = xlMarkerStyleCircle
End With
Так что обратите внимание на .
предшествующий .Range
а также .Cells(...
это делает эти методы связаны с With Worksheets("Transposed Data")
,