使用单元格方法在应用程序或对象定义的错误中在VBA中创build图表

我试图在Excel 2010中使用VBA创build图表。我试图从同一工作簿中的另一张表中select数据。 然而,数据是水平的(并且必须保持这种方式),所以我需要使用Cells()函数为图表select数据。

但是,它似乎并没有工作,我真的不明白为什么。 在任何使用Cells()函数定义范围的行上,我总是收到错误“Application-Defined or Object-Defined error”。 但是,如果单元格()用于引用单个单元格,它工作正常。

Can Range(单元格(x,y),单元格(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 

当它试图设置graphics数据标题下的x和y值时,代码停止。

只是为了将其单独列出,下面再列出。

 '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到BZX2的范围内,而y值的数据在E3到BZX3的范围内。 单元格A3只有图表的标题。

但是,如果单元格()用于引用单个单元格,它工作正常。

这不完全正确。

问题是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块,并创build一个variables来表示该系列:

 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")