2017-01-05 4 views
0

Ich muss ein VBA-Array mit den Feldern füllen, die den Kriterien in meiner IF-Anweisung entsprechen. Ich kann mich nicht darum kümmern, das Array aus dem Recordset zu erstellen, es scheint mir eine völlig andere Welt zu sein als ein "normales" Array. Hier ist, was ich habe:Array aus VBA-Recordset erstellen

+3

zu bewegen von Cord-Array erzeugen Sie einfache Methode verwenden: 'rs2.GetRows()'. Zuerst müssen Sie jedoch die korrekten Recordset-Ergebnisse basierend auf der SQL-Abfrage erstellen, bei der Sie das Feld "ID-Feld" und andere Elemente des Typs "Text" ausschließen können. –

+0

@KazimierzJawar - so ist es noch größer als das, was ich anfangs dachte. Danke für das Posten, um mir einen Startpunkt für Google zu erlauben :) –

+0

Eine wirklich * frische * Antwort hier: http://stackoverflow.com/questions/41485788/dynamically-populate-vba-array/41486069#41486069 –

Antwort

0

Sie könnten die folgende Funktion verwenden, um die SQL zu generieren erforderlich zu extrahieren, was Sie wünschen und dann .GetRows() daraus verwenden. Es verwendet ADO, daher müssen Sie den Verweis auf ADO hinzufügen. Basierend auf den oben Sie diese nutzen, um die INSERT INTO from (function return)

so etwas wie docmd.runsql "INSERT INTO tbl_TEST_Clone " & 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 
+0

Das sieht so aus eine gute Funktion zu verwenden, aber in diesem Projekt bin ich ziemlich gebunden an DAO und ich glaube nicht, dass Sie sowohl ADO und DAO in einer Datenbank verwenden können. Def speichern in eine Textdatei zum Speichern für später :) –

+0

Sie können beides tun, ich habe Präfix mit dem Klassennamen 'ADODB', sagen Sie Ihre Tabelle hat 100 Felder, alle Nicht-Text, Ihre Methode wird eine Einfügung 100 mal tun pro Zeile. Sehen Sie sich dies an, eine SQL-Operation, egal ob Sie auf DAO runsql oder ADO execute laufen. http://www.w3schools.com/sql/sql_insert_into_select.asp –

1

Dank den Kommentar Bereitstellung Richtung auf, wo durch @KazimierzJawor zu lenken -> Dies war die Syntax, die ich war in der Lage zu kommen mit dem erreicht, was ich nach war. (Need Fehlerbehandlung hinzufügen, aber dies ist die 1. Lauf durch)

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 
Verwandte Themen