Импорт таблицы Excel по положению столбца в MS Access - PullRequest
0 голосов
/ 31 августа 2018

Привет, ребята, у меня проблема в том, что импортируемый файл не имеет имен столбцов, и я не могу легко добавить их по другим причинам. Однако я знаю, какие столбцы я хочу. Итак, я создал таблицу с позицией столбцов, чтобы моя VBA могла проходить и добавлять соответствующие поля по одному в строке. Но я, кажется, понимаю, что переменная не читается, она думает, что FieldID является именем столбца. Итак, как мне заставить vba понять, что это столбец, из которого я хочу получить значение?

Dim db As DAO.Database
Set db = CurrentDb
Dim rsImport As DAO.Recordset
Dim rsFileColumns As DAO.Recordset
Dim CSVCn As Object
Dim rsCSV As Object
Dim strSQL, strName, strName1 As String
Dim rsImporttbl As DAO.Recordset

Set rsImport = db.OpenRecordset("Select * FROM ImportFiles ORDER BY FileID ASC")
If Not (rsImport.EOF And rsImport.BOF) Then 'This Table how the directory and order in which we want to import the tables.
    rsImport.MoveFirst                      'This helps if there any directory changes or if we need to switch the sequence of import
    Do Until rsImport.EOF = True
        Directory = rsImport!Directory
        FileID = rsImport!FileID
        FileName = rsImport!FileName
        FileType = rsImport!FileType
        DbName = rsImport!DatabaseName

        Set rsFileColumns = db.OpenRecordset("Select FieldName, FieldID From ImportField WHERE FileID =" & FileID & ";") 'This Tells the program which columns we want to import
            If Not (rsFileColumns.EOF And rsFileColumns.BOF) Then 'Also if needed we do have the column numbers stored
                rsFileColumns.MoveFirst
                Do Until rsFileColumns.EOF = True
                    FieldID = rsFileColumns!FieldID
                        Set CSVCn = CreateObject("ADODB.Connection")
                        Set rsCSV = CreateObject("ADODB.Recordset")

                        strSQL1 = "Provider=" & _
                                  CurrentProject.Connection.Provider & _
                                  ";Data Source=" & Directory & _
                                  ";Extended Properties='text;HDR=YES;FMT=Delimited'"
                        CSVCn.Open strSQL1 'Tells it where to look for the CSV to import

                        strSQL = "SELECT * FROM " & FileName & FileType 'Tells what the file is called to import
                        rsCSV.Open strSQL, CSVCn, adOpenForwardOnly, adLockReadOnly, adCmdText

                        Set rsImporttbl = db.OpenRecordset(DbName, dbOpenTable, dbAppendOnly + dbFailOnError) 'This is the table its appending the data to.

                        Do Until rsCSV.EOF
                            Field1 = rsCSV!FieldID 'Using the column number stored find the value
                            rsImporttbl.AddNew
                                                'please insert it into the same field number into the databases empty verison
                            rsImporttbl.Update
                            rsCSV.MoveNext
                        Loop
                        rsImporttbl.Close
                        rsCSV.Close
                rsFileColumns.MoveNext
                Loop
            Else
                MsgBox "There are no Records in ImportFields for this table: " & FileName
            End If
            rsFileColumns.Close
            Set rsFileColumns = Nothing

    rsImport.MoveNext
    Loop
Else
    MsgBox "There are no Records in ImportFiles"
End If
rsImport.Close
Set rsImport = Nothing
db.Close

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Привет, ребята, так что я пошел дальше, и у меня есть две таблицы: таблица ImportFiles и таблица ImportFields, между этими двумя таблицами я могу указать программе, куда идти и какие поля импортировать. Это код.

Dim db As DAO.Database
Set db = CurrentDb
Dim rsImport As DAO.Recordset
Dim rsFileColumns As DAO.Recordset
Dim CSVCn As Object
Dim rsCSV As Object
Dim strSQL, strName, strName1 As String
Dim rsImporttbl As DAO.Recordset
Dim ColumnIDs As New VBA.Collection
Dim ColumnVals As New VBA.Collection

Set rsImport = db.OpenRecordset("Select * FROM ImportFiles ORDER BY FileID ASC")
If Not (rsImport.EOF And rsImport.BOF) Then 'This Table how the directory and order in which we want to import the tables.
    rsImport.MoveFirst                      'This helps if there any directory changes or if we need to switch the sequence of import
    Do Until rsImport.EOF = True
        Directory = rsImport!Directory
        FileID = rsImport!FileID
        FileName = rsImport!FileName
        FileType = rsImport!FileType
        DbName = rsImport!DatabaseName

        Set rsFileColumns = db.OpenRecordset("Select FieldID From ImportField WHERE FileID =" & FileID & ";") 'This Tells the program which columns we want to import
        Set ColumnIDs = RSToColl(rsFileColumns, "FieldID")

        Set CSVCn = CreateObject("ADODB.Connection")
        Set rsCSV = CreateObject("ADODB.Recordset")
        strSQL1 = "Provider=" & _
                    CurrentProject.Connection.Provider & _
                    ";Data Source=" & Directory & _
                    ";Extended Properties='text;HDR=YES;FMT=Delimited'"
        CSVCn.Open strSQL1 'Tells it where to look for the CSV to import
        strSQL = "SELECT * FROM " & FileName & FileType 'Tells what the file is called to import
        rsCSV.Open strSQL, CSVCn, adOpenForwardOnly, adLockReadOnly, adCmdText

        Set rsImporttbl = db.OpenRecordset(DbName, dbOpenTable, dbAppendOnly + dbFailOnError) 'This is the table its appending the data to.
Dim l As Long
Dim value1 As Integer

        Do Until rsCSV.EOF
            For Each Item In ColumnIDs
                Field1 = rsCSV.Fields(Item)
                ColumnVals.Add Field1
            Next
            value1 = 0
            rsImporttbl.AddNew
                For l = 1 To ColumnIDs.Count
                    Value2 = ColumnVals.Item(l)
                    rsImporttbl.Fields(value1) = Value2
                    value1 = value1 + 1
                Next
            rsImporttbl.Update
            value1 = 0
            Set ColumnVals = Nothing
        rsCSV.MoveNext
        Loop
Loop
Else
    MsgBox "There are no Records in ImportFiles"
End If
rsImport.Close
Set rsImport = Nothing
db.Close
0 голосов
/ 31 августа 2018

Просто не используйте обозначение взрыва, и вы можете использовать FieldID для доступа к определенному полю:

Field1 = rsCSV.Fields(FieldID) не rsCSV!FieldID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...