使用ADODB.Recordset时,VBA获取实际的第一列

时间:2019-03-14 22:58:04

标签: excel vba

我有一个要查询的Excel文件,其中包含以下列标题:

JIRA#,BO报告名称,BO报告位置,完成日期,尝试

使用以下代码时,它将第5列(尝试)作为第一个字段返回。我知道这很可能是因为列标题从头开始按字母顺序开始,但是我的问题是如何使它成为记录集的第一条记录是第一列,记录集的第二条记录是第二列,依此类推? / p>

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 个答案:

答案 0 :(得分:1)

您可以像这样获取SQL查询的第一列:

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

ps请注意我如何通过引用ADODB DLL使用早期绑定。这是一种比 Late Binding (后期绑定)更好的方法,因为您具有智能感知能力。

答案 1 :(得分:0)

如果您需要使用OpenSchema而不是直接访问基础表的字段名(列名),则可以使用“ ORDINAL_POSITION”字段。这是ado.OpenSchema(4, Array(Empty, Empty, table))

返回的COLUMNS行集的一部分

这是在字典中使用“ 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行集here中返回的所有字段的详细信息。但是,对于Excel,这些字段中的某些字段可能包含Null,因为它们与Excel不支持的功能有关