Создание диаграммы в 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"),

Другие вопросы по тегам