我有一个要查询的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
答案 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))
这是在字典中使用“ 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不支持的功能有关