2016-12-15 6 views
1

Как добавить имена полей в массив, когда я не знаю размер массива? В моих двух функциях ниже я могу заполнить таблицу без проблем, но когда я пытаюсь создать массив, он будет печатать только 1-ю запись из таблицы. Что я должен сделать, чтобы создать массив со всеми значениями?Создать одномерный динамический массив

Function PopulateTable() 
Set rs1 = db.OpenRecordset("MasterList") 
For Each fld In rs1.Fields 
    StrSQL = "INSERT INTO HoldTable (FieldList) VALUES ('" & fld.Name & "');" 
    DoCmd.SetWarnings False 
    DoCmd.RunSQL StrSQL 
Next 
'Create array of all fld.Name Values 
PopulateArray 
End Function 

Function PopulateArray() 
Dim rstData As DAO.Recordset 
Dim v   As Variant 
Dim cn   As Variant 

Set rstData = CurrentDb.OpenRecordset("select fieldlist from HoldTable") 
v = rstData.GetRows(rstData.RecordCount) 
For Each cn In v 
    Debug.Print CStr(cn) 
Next 

End Function 
+1

Из [документации] (https://msdn.microsoft.com/en -us/library/office/ff194427.aspx) (мой акцент), «GetRows возвращает *** двухмерный массив ***». – Comintern

ответ

1

Вы должны использовать ADODB.Connection и OpenSchema метод, чтобы получить список имен полей: List database objects (tables, columns..) using ADO/ADOX

Вы должны будете использовать rstData.MoveLast, а затем rstData.MoveFirst, чтобы получить точную RecordCount.

Function PopulateTable() 
    Set rs1 = CurrentDb.OpenRecordset("MasterList") 
    For Each fld In rs1.Fields 
     StrSQL = "INSERT INTO HoldTable (FieldList) VALUES ('" & fld.Name & "');" 
     'Create array of all fld.Name Values 
     DoCmd.SetWarnings False 
     DoCmd.RunSQL StrSQL 
    Next 
    PopulateArray 
End Function 

Function PopulateArray() 
    Dim rstData As DAO.Recordset 
    Dim v As Variant 
    Dim cn As Variant 

    Set rstData = CurrentDb.OpenRecordset("Select fieldlist FROM HoldTable") 
    rstData.MoveLast 
    rstData.MoveFirst 
    v = rstData.GetRows(rstData.RecordCount) 
    For Each cn In v 
     Debug.Print CStr(cn) 
    Next 

End Function 
+0

Отлично, это было то, что мне нужно. Спасибо за помощь. –

+0

@StarsFlyFreeFromCozyNights Спасибо, что приняли мой ответ. :) –

0

Вы можете определить «нормальный» переменную и присвоить пустой массив к нему:

Dim v : v = Array() 

Тогда вы можете ReDim его:

ReDim Preserve v(rstData.RecordCount) 
+0

Если я добавлю инструкцию ReDim Preserve в мой оператор Debug.Print, я получаю сообщение об ошибке «Массив фиксирован или временно заблокирован» –

+0

, но вы также изменили объявление v на Dim v() или Dim v: v = Массив()? –

1

Это, как я хотел бы создать динамический массив. я бы цикл по данным, и в пределах каждой итерации увеличивать размер массива, а затем установить значение вновь увеличивающегося массива

Dim arraySize as Integer 
Dim dynArray() As string 
arraySize = -1 ' set to -1 so when you first increment the size by one it will start at index 0 

' Iterating through rstData variable 
for each fld in rstData.fields 
    arraySize = arraySize + 1 
    redim preserve dynArray(arraySize) as String 
    dynArray(sz) = fld ' not sure if can set it to fld directly or if need to access the value property of fld 
next 
' End of iterating through