我试图在Excel 2010中使用VBA创建图表。我试图从同一工作簿中的另一个工作表中选择数据。但是,数据是水平的(必须保持这种状态),因此我需要使用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
当它尝试在Graphing Data标头下设置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()引用单个单元格,则可以正常工作。
这是不完全正确的。
问题在于,除非完全合格,否则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")
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句