2013-02-04 147 views
2

我一直在尝试编写一小段代码来验证以确认日期是否包含在数组中。我已经能够滚动代码,直到我到达If lists(i) = TodaysDate Then行时lists(i)显示subscript out of range。我通过互联网进行了搜索,但无法解决此问题。VBA运行时错误9:下标超出范围

我的宏如下:

Sub size_an_array() 
    Dim i As Integer 
    Dim Range_of_Dates As Integer 
    Dim TodaysDate As Variant, finish As String 
    TodaysDate = Range("Sheet11!c2") 
    ThisWorkbook.Worksheets("Sheet11").Activate 
    lists = Range("Processed_Dates") 

    Range_of_Dates = UBound(lists, 1) - LBound(lists, 1) + 1 

    For c = 1 To UBound(lists, 1) ' First array dimension is rows. 
     For R = 1 To UBound(lists, 2) ' Second array dimension is columns. 
      Debug.Print lists(c, R) 
     Next R 
    Next c 

    x = Range_of_Dates 'UBound(lists, 1) 
    ReDim lists(x, 1) 

    i = 1 
    Do Until i = x 
     If lists(i) = TodaysDate Then 
      Exit Do 
     End If 
    Loop 

    MsgBox "The date has not been found" 

End Sub 

我是比较新的VBA和我一直在尝试使用命名区域在阵列中拉但我想在我无计可施很彻底解决这件事。

任何帮助将不胜感激。

+0

纠正我,如果我错了,但你必须比较值,所以在两边添加“.Value”。变量x也没有定义,所以错误必须早出现 – makciook

回答

2

您已将ReDimmed数组lists从一维数组更改为二维数组,然后尝试在可疑行(下面)中仅使用一个维度引用您的错误。

If lists(i) = TodaysDate Then

作为参考,Run-time error 9: Subscript out of range意味着你正在引用一个不存在的数组元素。

0

我认为这是你正在尝试?

Sub size_an_array() 
    Dim i As Integer 
    Dim TodaysDate As Variant, lists 
    Dim bFound As Boolean 

    '~~> Change SomeWorksheet to the relevant sheet 
    TodaysDate = Sheets("SomeWorksheet").Range("c2") 

    lists = Sheets("Sheet11").Range("Processed_Dates") 

    i = 1 
    Do Until i = UBound(lists) 
     If lists(i, 1) = TodaysDate Then 
      bFound = True 
      Exit Do 
     End If 
     i = i + 1 
    Loop 

    If bFound = True Then 
     MsgBox "The date has been found" 
    Else 
     MsgBox "The date has not been found" 
    End If 
End Sub 

如果我的理解正确,那么使用.Find要容易得多。如果你有兴趣,那么看看这个link

+0

感谢这个,我也看过你的文章.Find,稍后再试。我试图执行代码,但卡在第一个元素的循环中。我目前在我的数组中有五个元素(用于测试目的)(41275,41306,41334,41365,41395),并且它在41275上保持循环。我错过了什么。非常感谢 – CaryBush

+0

更新了上面的代码 –

+0

谢谢,它现在可以工作。并感谢您的时间。 – CaryBush