VBA创建非连续数据XY散点图时SeriesCollection行报错如何解决?
VBA创建非连续数据XY散点图报错修复
报错原因
- 直接访问空白图表的系列集合报错:通过
ChartObjects.Add方法新建的图表默认是空白状态,没有任何内置数据系列,直接调用.SeriesCollection(1)会因为索引指向不存在的对象触发运行时错误。 - Chart对象层级调用错误:代码中
cht是图表容器对象ChartObject,需要通过cht.Chart才能访问实际的图表属性和方法,原代码直接调用cht.SeriesCollection属于层级调用错误。 - 执行顺序逻辑错误:原代码将设置图表类型的语句放在了系列配置之后,不符合图表配置的执行逻辑。
- 冗余无效代码:代码中声明的
rng变量未提前定义类型,通过Union拼接的数据范围也没有实际赋值给图表,属于无效冗余代码。
修复方案
核心调整逻辑为:创建空白图表后先手动添加指定数量的系列,修正图表对象层级调用,调整执行顺序,移除无效代码。
修改后的完整可运行代码如下:
Sub CreateChart2() 'PURPOSE: Create XY Scatter chart with non-continuous data Dim cht As ChartObject Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Tabelle4") Dim rngx1 As Range, rngx2 As Range, rngy1 As Range, rngy2 As Range ' 选择数据范围 Set rngx1 = Application.InputBox(prompt:="选择水平系列1数据", Title:="选择X1范围", Default:=ActiveCell.Address, Type:=8) Set rngy1 = Application.InputBox(prompt:="选择垂直系列1数据", Title:="选择Y1范围", Default:=ActiveCell.Address, Type:=8) Set rngx2 = Application.InputBox(prompt:="选择水平系列2数据", Title:="选择X2范围", Default:=ActiveCell.Address, Type:=8) Set rngy2 = Application.InputBox(prompt:="选择垂直系列2数据", Title:="选择Y2范围", Default:=ActiveCell.Address, Type:=8) ' 校验选择是否有效 If rngx1 Is Nothing Or rngy1 Is Nothing Or rngx2 Is Nothing Or rngy2 Is Nothing Then MsgBox "数据范围选择不完整,程序退出" Exit Sub End If ' 创建图表容器 Set cht = ActiveSheet.ChartObjects.Add( _ Left:=ActiveCell.Left, _ Width:=300, _ Top:=ActiveCell.Top, _ Height:=200) ' 配置图表 With cht.Chart ' 先设置图表类型 .ChartType = xlXYScatter ' 手动添加两个数据系列 .SeriesCollection.NewSeries .SeriesCollection.NewSeries ' 配置第一个系列 .SeriesCollection(1).Name = "=Tabelle4!$I$2" .SeriesCollection(1).XValues = rngx1 .SeriesCollection(1).Values = rngy1 ' 配置第二个系列 .SeriesCollection(2).Name = "=Tabelle4!$I$52" .SeriesCollection(2).XValues = rngx2 .SeriesCollection(2).Values = rngy2 ' 其他样式配置 .SetElement msoElementLegendBottom .SetElement msoElementPrimaryValueGridLinesNone .SetElement msoElementPrimaryCategoryAxisTitleAdjacentToAxis .SetElement msoElementPrimaryValueAxisTitleRotated .SetElement msoElementChartTitleCenteredOverlay End With End Sub
内容的提问来源于stack exchange,提问作者A. Kaymakci
相关产品推荐
相关产品推荐

