创建一维动态数组

Create One Dimensional Dynamic Array

当我不知道数组的大小时,如何将字段名称添加到数组中?在下面的两个函数中,我可以毫无问题地填充 table,但是当我尝试创建数组时,它只会打印 table 中的第一条记录。我必须做什么才能创建包含所有值的数组?

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

您应该使用 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

您可以定义一个 "normal" 变量并为其分配一个空数组:

Dim v : v = Array()

然后你就可以重调了:

ReDim Preserve v(rstData.RecordCount)

这就是我创建动态数组的方式。 我会遍历数据并在每次迭代中增加数组的大小,然后将值设置为新增加的数组

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