下标超出模板范围

时间:2018-02-09 09:17:25

标签: excel vba templates debugging

我对Excel宏中的VBA有疑问。我为一个新工作表准备了一个宏,但现在我的主管想要将它创建为一个模板。在我的主管任务之前一切正常但是当我制作模板并运行宏时,我在该段代码中的模板上有一个错误的09下标

For i = StartZakres To StopZakres
    Dim Dates As New Scripting.Dictionary
    Data = i
    Dates.Add Data, ""
Debug.Print Dates.Keys(Data)
Next i

我不知道问题出在哪里,模板一切正常。你能解释一下我的问题在哪里吗?

谢谢, 大卫

3 个答案:

答案 0 :(得分:0)

这是一个可行的最小代码:

Sub TestMe()

    Dim i       As Long
    Dim Data    As Variant

    For i = 1 To 10
        Dim Dates As New Scripting.Dictionary
        Data = i
        Dates.Add i, "a" 'to print something
        Debug.Print Dates(Data)
    Next i

End Sub

在你的情况下,错误可能在于从字典中打印。您不需要.Keys集合。

答案 1 :(得分:0)

坚持这个问题的问题,i。你得到的“下标超出范围”错误,这是由于Keys()是一个基于0的数组

所以要么你确定StartZakres从零开始,要么你必须“补偿”任何不同于零的起始值:

For i = StartZakres To StopZakres
    Dim Dates As New Scripting.Dictionary
    Data = i - StartZakres ' be sure to generate indexes always starting from zero
    Dates.Add Data, ""
    Debug.Print Dates.Keys(Data) + StartZakres ' print "real" key by adding the starting value of the loop
Next i 

也适用于StartZakres

的负值

答案 2 :(得分:0)

Dim Dates As New Scripting.Dictionary创建一个新词典Dates。在循环中重复调用新字典应该替换前一个字典,如果你的代码可以正常工作,新字典中只有一个项目在它被循环的下一个循环中的新字典替换之前。我怀疑你的代码是否有效,因为我希望Dim语句本身会导致错误。因此我怀疑你的循环只运行一次。

正如@DisplayName指出的那样,行Debug.Print Dates.Keys(Data)应该存在问题,具体取决于Data的值。我相信他已经解决了问题,你的代码在第一个循环中崩溃了。顺便说一句,您还没有解释为什么同时使用iData这两个值。这种做法似乎是多余的,可能会导致问题,因为它们具有不同的数据类型(您也保密)。

最近,您指出了在模板和其他工作簿之间切换时遇到的问题。我在原始问题中找不到对模板或源工作簿的引用。所以,很明显,这个主题正在经历自己的生活:是时候提供答案了。

以下代码经过测试,确实有效。您可以将其粘贴到工作簿中并尝试使用它。它具有所有声明(观察数据类型)和所有代码。将代码转换到您的项目中它将起作用。

Private Sub TestDictionary()

    Dim StartZakres As Long
    Dim StopZakres As Long
    Dim Dates As Scripting.Dictionary
    Dim i As Long

    StartZakres = 0
    StopZakres = 5
    Set Dates = CreateObject("Scripting.Dictionary")
    With Dates
        For i = StartZakres To StopZakres
            .Add i, Date + i
            Debug.Print .Item(i)
        Next i
    End With
End Sub

如果您想了解有关Dictionary对象的更多信息,可以访问this site。一切都在那里非常详细地解释,非常耐心。

如果您在处理工作簿(模板或其他)时遇到问题,以便从中提取值以放入字典中,请提出另一个问题。这个问题与你现在的问题没有关系。