【问题标题】:MS Access VBA: UBound & LBound functions returning subscript out of range error on class arrayMS Access VBA:UBound 和 LBound 函数在类数组上返回下标超出范围错误
【发布时间】:2015-06-16 16:55:52
【问题描述】:

在 MS Access 2003 VBA 中对全局对象的数组调用 LBound() 和 UBound() 函数时,我收到“下标超出范围”错误。我不明白为什么会发生这种情况,因为我确定数组已经初始化,因为我可以通过引用数组的已知索引来访问数组中的值。

这是我的类,它有一个字符串数组作为属性。我正在使用 Class_Initialize 方法初始化数组。

Private pIgnoreDifferencesInDatabaseComparisonForFields() As String

Public Property Get ignoreDifferencesInDatabaseComparisonForFields() As String()
    ignoreDifferncesInDatabaseComparisonForFields = pIgnoreDifferencesInDatabaseComparisonForFields
End Property

Public Property Get ignoreDifferencesInDatabaseComparisonForField(index As Long) As String
    ignoreDifferencesInDatabaseComparisonForField = pIgnoreDifferencesInDatabaseComparisonForFields(index)
End Property

Public Property Let ignoreDifferencesInDatabaseComparisonForField(index As Long, fld As String)
    If index > UBound(pIgnoreDifferencesInDatabaseComparisonForFields) Then ReDim Preserve pIgnoreDifferencesInDatabaseComparisonForFields(index)
    pIgnoreDifferencesInDatabaseComparisonForFields(index) = fld
End Property

Private Sub Class_Initialize()

    Dim ignoreDiffInDBComparisonForFields() As String
    Dim i As Long

    ' Add any new columns to skip inside this string
    ignoreDiffInDBComparisonForFields = Split("EligOvr,UpdateTS,groupStartDate,groupEndDate", ",")

    ReDim pIgnoreDifferencesInDatabaseComparisonForFields(0)

    For i = LBound(ignoreDiffInDBComparisonForFields) To UBound(ignoreDiffInDBComparisonForFields)
        Me.ignoreDifferencesInDatabaseComparisonForField(i) = ignoreDiffInDBComparisonForFields(i)
    Next i

End Sub

我在主模块顶部的任何函数或子模块之外将对象声明为全局变量。

Public settings As Options

然后,在我调用的主函数中,我有以下代码行。

Set settings = New Options

稍后在我的代码中,这个函数被调用。

Function isAnIgnoreDifferencesInDatabaseComparisonField(field As String) As Boolean

    Dim found As Boolean
    Dim i As Long

    found = False

    x = settings.ignoreDifferencesInDatabaseComparisonForField(1)

    For i = LBound(settings.ignoreDifferencesInDatabaseComparisonForFields) To UBound(settings.ignoreDifferencesInDatabaseComparisonForFields)
        If (LCase(field) = LCase(settings.ignoreDifferencesInDatabaseComparisonForField(i))) Then
            found = True
        End If
    Next i

    isAnIgnoreDifferencesInDatabaseComparisonField = found

End Function

我在第一次遇到“For i ...”行时调用 UBound 和 LBound 函数的 for 循环中收到错误消息。它不会通过循环的任何迭代。我将 x 设置为数组中位置 1 处的值作为测试,并且该值确实填充而没有错误,因此数组已被初始化。有谁知道为什么我收到“下标超出范围”错误?谢谢!

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    你的问题是:

    Public Property Get ignoreDifferencesInDatabaseComparisonForFields() As String()
        ignoreDifferencesInDatabaseComparisonForFields = pIgnoreDifferencesInDatabaseComparisonForFields
        ' ^ correct typo here ^
    End Property
    

    当我修复此问题时,您的代码已编译,并且运行正常,没有出现 Subscript out of range 错误。

    【讨论】:

    • 提示:如果你在你的模块声明区使用Option Explicit,你可以通过编译发现这样的错误。
    【解决方案2】:

    我不能说我在 Access 中使用过很多 VBA,但我知道它可以在 Excel 中做一些有趣的事情。我会尝试将上限设置为 Ubound() -1 看看会发生什么。有时 VBA 使用从 0-9 开始的标准约定,有时根据对象类型使用从 1 开始的标准约定。

    同样作为最终 for 循环的一个方面,如果找到匹配项,您可能需要考虑添加 Exit For。如果为真,则没有理由完成循环。

    【讨论】:

    • 感谢您的建议!不幸的是 UBound() - 1 没有效果。即使我将鼠标悬停在 LBound() 或 UBound() 函数上以在中断模式下查看它们的值,它们都显示 。另外,我相信 UBound() - 1 只有在遍历数组中的所有值并且走得太远时才会有所帮助,但它甚至在通过循环之前就出现了这个错误。
    • 您能否确认 ignoreDiffInDBComparisonForFields () 已正确填充?
    • 是的,该变量正在正确填充。事实证明,我的 getter 中有一个拼写错误,它返回了 @kisert 找到的整个数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2020-05-03
    • 1970-01-01
    • 2019-11-09
    • 2015-08-07
    相关资源
    最近更新 更多