Arrays 从VBA记录集创建数组

Arrays 从VBA记录集创建数组,arrays,vba,ms-access,ms-access-2013,Arrays,Vba,Ms Access,Ms Access 2013,我需要用符合我的IF语句中条件的字段填充VBA数组。我无法从记录集中创建数组,对我来说,这似乎是一个与“普通”数组完全不同的世界。以下是我所拥有的: Function AlterTable() Set rs2 = db.OpenRecordset("___TestTable") For Each fld In rs2.Fields If fld.Name <> "ID" Then If FieldTypeName(fld) <> "Text" Then Debu

我需要用符合我的
IF
语句中条件的字段填充VBA数组。我无法从记录集中创建数组,对我来说,这似乎是一个与“普通”数组完全不同的世界。以下是我所拥有的:

Function AlterTable()

Set rs2 = db.OpenRecordset("___TestTable")
For Each fld In rs2.Fields
If fld.Name <> "ID" Then
If FieldTypeName(fld) <> "Text" Then
    Debug.Print fld.Name  
    'Populate Array Here
  End If
End If
Next

Set fld = Nothing
rs2.Close

End Function
函数可变()
Set rs2=db.OpenRecordset(“测试表”)
对于rs2.字段中的每个fld
如果航班名称为“ID”,则
如果FieldTypeName(fld)“文本”,则
Debug.Print fld.Name
'在此处填充数组
如果结束
如果结束
下一个
设置fld=无
rs2.关闭
端函数

感谢@KazimierzJawor-> 这就是我能够想出的语法,完成了我所追求的。(需要添加错误处理,但这是第一次运行)

函数蓝()
Dim CreateTableSQL作为字符串
模糊fld为刀场
Set db=CurrentDb()
CreateTableSQL=“创建表[GreenSocks](FieldPK计数器约束PrimaryKey主键,fieldname文本)
执行CreateTableSQL
Set rs2=db.OpenRecordset(“测试表”)
对于rs2.字段中的每个fld
如果航班名称“ID”和航班名称“门店编号”,则
如果FieldTypeName(fld)“文本”,则
Debug.Print fld.Name
strSQL=“插入到绿色符号(字段名)值(“&fld.Name&”);”
DoCmd.RunSQL strSQL
如果结束
如果结束
下一个
设置fld=无
rs2.关闭
strSQL=“从绿色符号中选择字段名”
Set rs3=db.OpenRecordset(strSQL)
对于rs3.字段中的每个fld
调试.打印fld.值
secondSQL=“ALTER TABLE”\uuu TestTable ALTER COLUMN[”&fld.Value&“]TEXT(40);”
DoCmd.runsqlsecondsql
下一个
设置fld=无
rs3.关闭
端函数

感谢@KazimierzJawor-> 这就是我能够想出的语法,完成了我所追求的。(需要添加错误处理,但这是第一次运行)

函数蓝()
Dim CreateTableSQL作为字符串
模糊fld为刀场
Set db=CurrentDb()
CreateTableSQL=“创建表[GreenSocks](FieldPK计数器约束PrimaryKey主键,fieldname文本)
执行CreateTableSQL
Set rs2=db.OpenRecordset(“测试表”)
对于rs2.字段中的每个fld
如果航班名称“ID”和航班名称“门店编号”,则
如果FieldTypeName(fld)“文本”,则
Debug.Print fld.Name
strSQL=“插入到绿色符号(字段名)值(“&fld.Name&”);”
DoCmd.RunSQL strSQL
如果结束
如果结束
下一个
设置fld=无
rs2.关闭
strSQL=“从绿色符号中选择字段名”
Set rs3=db.OpenRecordset(strSQL)
对于rs3.字段中的每个fld
调试.打印fld.值
secondSQL=“ALTER TABLE”\uuu TestTable ALTER COLUMN[”&fld.Value&“]TEXT(40);”
DoCmd.runsqlsecondsql
下一个
设置fld=无
rs3.关闭
端函数

您可以使用以下函数生成提取所需内容所需的SQL,然后使用
.GetRows()
。它使用ADO,因此需要添加对ADO的引用。基于以上内容,您可以使用它生成插入from(函数返回)

类似于
docmd.runsql“插入tbl\u测试\u克隆”和GEN\u SQL\u表(“tbl\u测试”)

选项显式
函数GEN_SQL_表(strTableName作为字符串)作为字符串
将r调暗为新ADODB.Recordset
将rKeys设置为新的ADODB.Recordset
设置r=CurrentProject.Connection.OpenSchema(adSchemaColumns_
数组(空、空、strTableName、空))
r、 Filter=“[DATA_TYPE]”和adWChar
设置rKeys=CurrentProject.Connection.OpenSchema(adSchemaPrimaryKeys_
数组(空、空、strTableName))
而不是r.EOF
如果不是rKeys.BOF,则rKeys.MoveFirst
rKeys.Filter=“[COLUMN\u NAME]=”&r.Fields(“COLUMN\u NAME”).value&“
如果rKeys.EOF那么
GEN_SQL_表=_
GEN_SQL_表和IIf(Len(GEN_SQL_表)>0,“,”)&_
r、 字段(“列名称”)。值
如果结束
rKeys.Filter=“”
r、 下一步
温德
GEN\u SQL\u TABLE=“SELECT”&GEN\u SQL\u TABLE&“FROM”&strTableName
r、 接近
rKeys,关了
设置r=无
设置rKeys=无
端函数

您可以使用以下函数生成提取所需内容所需的SQL,然后使用
.GetRows()
。它使用ADO,因此需要添加对ADO的引用。基于以上内容,您可以使用它生成插入from(函数返回)

类似于
docmd.runsql“插入tbl\u测试\u克隆”和GEN\u SQL\u表(“tbl\u测试”)

选项显式
函数GEN_SQL_表(strTableName作为字符串)作为字符串
将r调暗为新ADODB.Recordset
将rKeys设置为新的ADODB.Recordset
设置r=CurrentProject.Connection.OpenSchema(adSchemaColumns_
数组(空、空、strTableName、空))
r、 Filter=“[DATA_TYPE]”和adWChar
设置rKeys=CurrentProject.Connection.OpenSchema(adSchemaPrimaryKeys_
数组(空、空、strTableName))
而不是r.EOF
如果不是rKeys.BOF,则rKeys.MoveFirst
rKeys.Filter=“[COLUMN\u NAME]=”&r.Fields(“COLUMN\u NAME”).value&“
如果rKeys.EOF那么
GEN_SQL_表=_
GEN_SQL_表和IIf(Len(GEN_SQL_表)>0,“,”)&_
r、 字段(“列名称”)。值
如果结束
rKeys.Filter=“”
r、 下一步
温德
GEN\u SQL\u TABLE=“SELECT”&GEN\u SQL\u TABLE&“FROM”&strTableName
r、 接近
rKeys,关了
设置r=无
设置rKeys=无
端函数

要从记录集移动到数组,可以使用简单的方法:
rs2.GetRows()
。然而,首先,您需要基于SQL查询创建正确的记录集结果,您可以排除
ID字段
和其他
文本类型
@KazimierzJawor-因此它甚至比我最初认为的还要大。谢谢你的发帖,让我可以从谷歌开始:)这里有一个非常新鲜的答案:要从记录集移动到阵列,你可以使用
Function Blue()
Dim CreateTableSQL As String
Dim fld As DAO.Field
Set db = CurrentDb()

CreateTableSQL = "CREATE TABLE [GreenSocks] (FieldPK COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, fieldname TEXT);"
db.Execute CreateTableSQL

Set rs2 = db.OpenRecordset("___TestTable")
For Each fld In rs2.Fields
    If fld.Name <> "ID" And fld.Name <> "Store Number" Then
        If FieldTypeName(fld) <> "Text" Then
            Debug.Print fld.Name

                strSQL = "INSERT INTO GreenSocks (fieldname) VALUES ('" & fld.Name & "' );"
                DoCmd.RunSQL strSQL

        End If
    End If
Next

Set fld = Nothing
rs2.Close

strSQL = "select fieldname from GreenSocks"

Set rs3 = db.OpenRecordset(strSQL)
For Each fld In rs3.Fields

    Debug.Print fld.Value

    secondSQL = "ALTER TABLE __TestTable ALTER COLUMN [" & fld.Value & "] TEXT(40);"

    DoCmd.RunSQL secondSQL

 Next

  Set fld = Nothing
  rs3.Close

End Function
Option Explicit

Function GEN_SQL_TABLE(strTableName As String) As String

Dim r As New ADODB.Recordset
Dim rKeys As New ADODB.Recordset

Set r = CurrentProject.Connection.OpenSchema(adSchemaColumns, _
                Array(Empty, Empty, strTableName, Empty))

r.Filter = "[DATA_TYPE]<>" & adWChar

Set rKeys = CurrentProject.Connection.OpenSchema(adSchemaPrimaryKeys, _
        Array(Empty, Empty, strTableName))

While Not r.EOF
    If Not rKeys.BOF Then rKeys.MoveFirst
    rKeys.Filter = "[COLUMN_NAME]='" & r.Fields("COLUMN_NAME").value & "'"
    If rKeys.EOF Then
        GEN_SQL_TABLE = _
            GEN_SQL_TABLE & IIf(Len(GEN_SQL_TABLE) > 0, ",", "") & _
            r.Fields("COLUMN_NAME").value
    End If
    rKeys.Filter=""
    r.MoveNext
Wend

GEN_SQL_TABLE = "SELECT " & GEN_SQL_TABLE & " FROM " & strTableName

r.Close
rKeys.Close

Set r = Nothing
Set rKeys = Nothing

End Function
Dim colNames() As Variant
colNames = Array("Employee", "Client")
'rs.MoveFirst
Dim data() As Variant ' Two dimensional array
data = rs.GetRows(Fields:=colNames)
' data(0,5) is Employee for 6th row in recordset