Индекс не в диапазоне MS Access - PullRequest
0 голосов
/ 29 июня 2018

Мне нужно получить имена полей из запроса и поместить их в динамический массив. Я считаю, что нашел правильный код этого, однако я получаю ошибку «Подстрочный индекс не в диапазоне».

Код пока:

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, поэтому я ценю терпение и время, потраченные на помощь! Заранее спасибо

Примечание. Все найденные ответы относятся к нединамическим массивам.

EDIT:

После удаления Dim colHeader() as String

теперь отображается сообщение «Sub или Function not selected»

Строка ошибки: colHeader(o) = qdf.Fields(o).Name

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Другой способ - использовать блок 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
0 голосов
/ 29 июня 2018
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 в верхней части модуля, если он отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...