下标不在范围MS Access中

时间:2018-06-29 15:49:53

标签: vba ms-access

我需要从查询中获取字段名称并将其放入动态数组中。我相信我已经找到了正确的代码,但是出现“下标不在范围内”错误。

到目前为止的代码:

Dim qdf As QueryDef
Dim fld As Field
Dim o As Integer
Dim fieldCount as Integer
fieldCount = CurrentDb.QueryDefs("qryctAverage").Fields.Count

Set qdf = db.QueryDefs("qryctAverage")
Dim n As Integer
n = fieldCount
ReDim colHeaders(0 To n - 1)

For o = 0 To n - 1
    colHeader(o) = qdf.Fields(o).Name
Next o

错误行:colHeader(o) = qdf.Fields(o).Name

我是VBA的新手,所以我感谢耐心和耐心地提供帮助!预先感谢

注意:我找到的所有答案都适用于非动态数组。

编辑:

在删除Dim colHeader() as String

之后,我现在得到“未定义子或函数”

错误行:colHeader(o) = qdf.Fields(o).Name

2 个答案:

答案 0 :(得分:3)

Dim colHeader() As String
ReDim colHeaders(0 To n - 1)

您已声明colHeader,但调整了colHeaders的大小。 Option Explicit无法接受,因为ReDim语句作为声明也完全有效。

但是,colHeader的大小没有确定,因此索引o必然超出范围:

colHeader(o) = qdf.Fields(o).Name

将其更改为

colHeaders(o) = qfd.Fields(o).Name

我将删除Dim colHeader() As String声明,并在模块顶部添加Option Explicit(如果缺少)。

答案 1 :(得分:2)

另一种方法是使用For Each块。
此代码构建由|分隔的单个字段名称字符串。
Split然后用于将字段字符串转换为字段名称数组,然后将其传递回调用过程。

Option Explicit
Sub Test()

    Dim colHeaders As Variant
    colHeaders = FieldNames("qryctAverage")

    Debug.Assert False 'Pause code so you can look at colHeaders.

End Sub

Public Function FieldNames(QueryName As String) As Variant

    Dim qdf As DAO.QueryDef
    Dim fld As DAO.Field
    Dim fldNames As String

    Set qdf = CurrentDb.QueryDefs(QueryName)

    For Each fld In qdf.Fields
        fldNames = fldNames & fld.Name & "|"
    Next fld
    fldNames = Left(fldNames, Len(fldNames) - 1)

    FieldNames = Split(fldNames, "|")

End Function