VBA Получить фактический первый столбец при использовании ADODB.Recordset - PullRequest
1 голос
/ 15 марта 2019

У меня есть файл Excel, который я запрашиваю со следующими заголовками столбцов:

JIRA #, Имя отчета BO, Расположение отчета BO, Дата завершения, Попытки

При использовании приведенного ниже кода возвращается столбец 5 (Попытки) в качестве первого поля. Я знаю, что это, скорее всего, потому, что заголовок столбца начинается в алфавитном порядке первым, но мой вопрос: как мне сделать так, чтобы первая запись в наборе записей была первым столбцом, вторая запись в наборе записей - это второй столбец и так далее?

Sub GetHeaders()
'add Microsoft Scripting Runtime to your reference library

    Dim ado As Object
    Dim instanceFile As Object

    FilePath = "Your file path" '''Change

    Set ado = CreateObject("ADODB.Connection")
    Set instanceFile = GetObject(FilePath)

    With ado
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & FilePath & ";Extended Properties=""Excel 12.0; HDR=YES; IMEX=1""; Mode=Read;"
        With .OpenSchema(20)
            Dim table As String
            Dim rs As Object
            Dim vFieldName As String

            table = .Fields("TABLE_NAME")
            Set rs = ado.OpenSchema(4, Array(Empty, Empty, table))
            On Error Resume Next
            rs.MoveFirst
            On Error GoTo 0
            While Not rs.EOF
                Debug.Print rs!COLUMN_NAME
                rs.MoveNext
            Wend
        End With
    End With

    ado.Close
    instanceFile.Close
    Set instanceFile = Nothing
End Sub

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Первый столбец SQL-запроса можно получить следующим образом:

dim rs As ADODB.Recordset
...
...
...
id = rs.Fields(0)

ps Обратите внимание, как я использую Раннее связывание , ссылаясь на библиотеку ADODB DLL.Это лучший метод, чем Late Binding , когда вы получаете intellisense.

0 голосов
/ 15 марта 2019

Если вам нужно использовать OpenSchema вместо прямого доступа к именам полей (именам столбцов) базовой таблицы, тогда вы можете использовать поле "ORDINAL_POSITION".Это часть набора строк COLUMNS, который возвращается ado.OpenSchema(4, Array(Empty, Empty, table))

Вот краткий пример использования «ORDINAL_POSITION» со словарем для сортировки имен полей.Замените все в исходном коде между On Error Resume Next и первым End With этим кодом:

        rs.MoveFirst
        On Error GoTo 0
        Dim dictColumns As Scripting.Dictionary
        Dim i As Integer
        Set dictColumns = New Scripting.Dictionary

        While Not rs.EOF
            dictColumns.Add rs.Fields("ORDINAL_POSITION").Value, rs.Fields("COLUMN_NAME").Value
            rs.MoveNext
        Wend

        For i = 1 To dictColumns.Count
            Debug.Print dictColumns.Item(i)
        Next i

Подробные сведения обо всех полях, возвращенных в наборе строк COLUMNS , можно найти здесь ,Однако для Excel вполне вероятно, что некоторые из этих полей будут содержать значение Null, поскольку они относятся к функциям, которые Excel не поддерживает

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