【问题标题】:Create Array From VBA Recordset从 VBA 记录集创建数组
【发布时间】:2020-07-09 15:00:59
【问题描述】:

我需要使用符合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

【问题讨论】:

  • 要从 Recordset 移动到数组,您可以使用简单的方法:rs2.GetRows()。但是,首先您需要根据 SQL 查询创建正确的记录集结果,您可以在其中排除 ID fieldText type 的其他人。
  • @KazimierzJawor - 所以它比我最初想象的还要大。感谢您发帖让我成为 google 的起点 :)
  • 一个真正的新鲜答案在这里:stackoverflow.com/questions/41485788/…

标签: arrays vba ms-access ms-access-2013


【解决方案1】:

感谢@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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      您可以使用以下函数生成提取所需内容所需的 SQL,然后从中使用.GetRows()。它使用 ADO,因此您需要添加对 ADO 的引用。基于上述,您可以使用它来生成INSERT INTO from (function return)

      类似docmd.runsql "INSERT INTO tbl_TEST_Clone " &amp; GEN_SQL_TABLE("tbl_test")

      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
      

      【讨论】:

      • 这看起来是一个很好用的函数,但在这个项目中,我与 DAO 紧密相连,我不相信你可以在一个数据库上同时使用 ADO 和 DAO。 Def保存到文本文件以供以后存储:)
      • 你可以两者都做,我用类名ADODB 做前缀,假设你的表有100个字段,都是非文本的,你的方法将每行插入100次。看这个,一个SQL操作,不​​管你是在DAO上运行runsql还是ADO的execute。 w3schools.com/sql/sql_insert_into_select.asp
      猜你喜欢
      • 1970-01-01
      • 2011-03-11
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 2018-10-25
      相关资源
      最近更新 更多