Vba 获取运行时错误erro 9,下标超出范围

Vba 获取运行时错误erro 9,下标超出范围,vba,excel,vb6,Vba,Excel,Vb6,我在创建图表时遇到此运行时错误9,在Excel VBA 2003中下标超出范围 在代码的某个地方,公共颜色作为变体和 “分配图表颜色” Chrt_color=数组(4,7,9,10,11,12,13,14,17,18,21,22,23,3,43,51,50,39,47,52,56) 公共子标签\u创建\u图表5(ByRef wksht作为Excel.Worksheet) 作为整数的Dim i 作为整数的Dim j Dim iTemp作为整数 Dim cht_Num作为整数 Dim iTextBo

我在创建图表时遇到此运行时错误9,在Excel VBA 2003中下标超出范围

在代码的某个地方,
公共颜色作为变体

“分配图表颜色”
Chrt_color=数组(4,7,9,10,11,12,13,14,17,18,21,22,23,3,43,51,50,39,47,52,56)

公共子标签\u创建\u图表5(ByRef wksht作为Excel.Worksheet)
作为整数的Dim i
作为整数的Dim j
Dim iTemp作为整数
Dim cht_Num作为整数
Dim iTextBoxLoc为整数
将dbTemp设置为双精度
Dim vSeriesValue作为变量
Dim dbSeriesLastValue()为双精度
Application.ScreenUpdating=False
cht_Num=5
wksht.ChartObjects(“图表5”)。激活
wksht.ChartObjects(“图表5”)。选择
当ActiveChart.TextBox.Count>0时执行此操作
ActiveChart.TextBox(1).删除
环
如果ActiveChart.SeriesCollection.Count<1,则转到Sub_end
将DberiesSlastValue(1到ActiveChart.SeriesCollection.Count)重拨为双精度
将ReDim iSeries索引(1到ActiveChart.SeriesCollection.Count)作为整数
对于ActiveChart.SeriesCollection.Count的i=1
vSeriesValues=ActiveChart.SeriesCollection(i).Values
如果wksht.范围(“AJ”和(i+52)).Value=“是”或_
(prdName=”“和InStr(wksht.Range(“A”和(i+52))值,corpName)>2)然后
ActiveChart.SeriesCollection(i).Border.ColorIndex=5
wksht.范围(“Z”和(i+52)和“:AH”和(i+52))。Font.ColorIndex=5
其他的
ActiveChart.SeriesCollection(i).Border.ColorIndex=Chrt\u color(i)
wksht.Range(“Z”和(i+52)和“:AH”和(i+52)).Font.ColorIndex=Chrt_color(i)
如果结束
dbSeriesLastValue(i)=vSeriesValues(UBound(vSeriesValues,1))
指数(i)=i
iTextBoxLoc=12+202*(1-(vSeriesValue(UBound(vSeriesValue,1))/(ActiveChart.Axes(xlValue).MaximumScale-ActiveChart.Axes(xlValue).MinimumScale)))
使用ActiveChart.textboxs.Add(195,iTextBoxLoc,100,13)
.AutoSize=True
.Text=ActiveChart.SeriesCollection(i).Name
使用.Font
.Name=“Arial”
.尺寸=7
.ColorIndex=ActiveChart.SeriesCollection(i).Border.ColorIndex
以
以
接下来我
对于i=1到(ActiveChart.SeriesCollection.Count-1)
对于j=i+1到ActiveChart.SeriesCollection.Count
如果dbSeriesLastValue(j)
我在ActiveChart.SeriesCollection(I).Border.ColorIndex=Chrt\u color(I) 当错误发生时,
ActiveChart.SeriesCollection(i).Border.ColorIndex=-4105
的值也显示在中间窗口中


请帮忙

当您收到错误消息时,我会查看I的值。您的代码从i迭代到序列号。假设你有比Chtr_颜色元素更多的系列,那么Chtr_颜色(i)的评估就不会超出这个范围


另一个问题可能是序列索引从1变为N,而数组索引从0变为N-1。

查看原始问题和注释,一切看起来都很完美。我有几个建议和问题:

似乎ActiveChart.SeriesCollection不包含元素

1.你不确定吗?您没有在手表窗口中登记吗?

*'分配图表颜色Chrt_color=Array(4,7,9,10,11,12,13,14,17,18,21,22,23,3,43,51,50,39,47,52,56)*


2.这很可能不是原因,但请检查单引号是否处于活动状态,如果处于活动状态,则此行将被注释掉,从而使数组变为空。

是否尝试单步执行代码?错误消息表示您试图使用不可用的数组索引。是的,我有,它在
ActiveChart.SeriesCollection(I).Border.ColorIndex=Chrt\u color(I)
。那么
I
是否是
Chrt\u color
的有效索引?如果是这样的话,
Chrt\u colo(i)
是否是
colordex
集合的有效索引?
Chrt\u color=Array(4,7,9,10,11,12,13,14,17,18,21,22,23,3,43,51,50,39,47,52,56)
我如何检查它是否是colordex集合的有效索引?我是VBA新手,正在运行其他人的代码。发生错误时,I=21。此外,我还尝试将数组的大小增加到25个元素,但仍然不起作用。56是一个合法值,似乎ActiveChart.SeriesCollection不包含元素。在那里,通过更改输入输出数据解决了问题。谢谢大家的帮助!
Public Sub label_creation_Chart5(ByRef wksht As Excel.Worksheet)


Dim i As Integer
Dim j As Integer
Dim iTemp As Integer
Dim cht_Num As Integer
Dim iTextBoxLoc As Integer
Dim dbTemp As Double
Dim vSeriesValues As Variant
Dim dbSeriesLastValue() As Double


Application.ScreenUpdating = False
cht_Num = 5

wksht.ChartObjects("Chart 5").Activate
wksht.ChartObjects("Chart 5").Select

Do While ActiveChart.TextBoxes.Count > 0
    ActiveChart.TextBoxes(1).Delete
Loop

If ActiveChart.SeriesCollection.Count < 1 Then GoTo Sub_end

ReDim dbSeriesLastValue(1 To ActiveChart.SeriesCollection.Count) As Double
ReDim iSeriesIndex(1 To ActiveChart.SeriesCollection.Count) As Integer

For i = 1 To ActiveChart.SeriesCollection.Count
    vSeriesValues = ActiveChart.SeriesCollection(i).Values

    If wksht.Range("AJ" & (i + 52)).Value = "Yes" Or _
       (prdName = "" And InStr(wksht.Range("A" & (i + 52)).Value, corpName) > 2) Then
        ActiveChart.SeriesCollection(i).Border.ColorIndex = 5
        wksht.Range("Z" & (i + 52) & ":AH" & (i + 52)).Font.ColorIndex = 5
    Else
        ActiveChart.SeriesCollection(i).Border.ColorIndex = Chrt_color(i)
        wksht.Range("Z" & (i + 52) & ":AH" & (i + 52)).Font.ColorIndex = Chrt_color(i)
    End If

    dbSeriesLastValue(i) = vSeriesValues(UBound(vSeriesValues, 1))
    iSeriesIndex(i) = i
    iTextBoxLoc = 12 + 202 * (1 - (vSeriesValues(UBound(vSeriesValues, 1)) / (ActiveChart.Axes(xlValue).MaximumScale - ActiveChart.Axes(xlValue).MinimumScale)))
    With ActiveChart.TextBoxes.Add(195, iTextBoxLoc, 100, 13)
        .AutoSize = True
        .Text = ActiveChart.SeriesCollection(i).Name
        With .Font
            .Name = "Arial"
            .Size = 7
            .ColorIndex = ActiveChart.SeriesCollection(i).Border.ColorIndex
        End With
    End With
Next i
For i = 1 To (ActiveChart.SeriesCollection.Count - 1)
    For j = i + 1 To ActiveChart.SeriesCollection.Count
        If dbSeriesLastValue(j) < dbSeriesLastValue(i) Then
            dbTemp = dbSeriesLastValue(j)
            dbSeriesLastValue(j) = dbSeriesLastValue(i)
            dbSeriesLastValue(i) = dbTemp
            iTemp = iSeriesIndex(j)
            iSeriesIndex(j) = iSeriesIndex(i)
            iSeriesIndex(i) = iTemp
        End If
    Next j
Next i