VBA 从 TXT 文件创建的记录集 returns 空值(Excel 2013)

VBA recordset created from TXT file returns Null values (Excel 2013)

我是 VBA 中使用记录集的新手,这个问题让我抓狂。

我得到一份大报告(大约 57000 行),保存为带有选项卡的文本文件。我的任务是删除不必要的数据,插入其他数据并创建类似枢轴的东西 table。现在这个任务是在 Excel 中手动完成的,它会产生一个大文件,table 在使用时会很不舒服。所以我想在记录集中导入 TXT 文件并使用 SQL 语句操作数据,并将结果保存在单独的 Excel 文件中。

我已经设法直接从 TXT 导入数据了。 .CountRecord 显示正确的记录数,但它们为 Null。 我尝试从 .Execute.Open 创建记录集,结果相同。 这是我的 VBA 代码:

Sub user_statistic_report()

Dim sPath As String
Range("A1").EntireRow.Delete

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0;"
    .Properties("Data Source") = "C:\Mydocs\raport\" 'sample path
    .Properties("Extended properties") = "text;HDR=No;FMT=Delimited;"
    .Open
End With

rs.CursorLocation = 3 'someone told it helped him but it did not a trick for me
'later I'd like to select only rows with specific conditions
rs.Open "SELECT * FROM [b.txt]", cn, 3
Debug.Print "Number of records:", rs.RecordCount

Set dbFields = rs.Fields
For i = 0 To dbFields.Count - 1
    Debug.Print "Column #", i, dbFields.Item(i).Name
Next i

Debug.Print "Recordset item", rs(3)

rs.Close
cn.Close
Set cn = Nothing
Set rs = Nothing

End Sub

这是我在即时 window 中看到的内容:

Number of records:           5<BR> 
Column #       0            F1<BR>
Column #       1            F2<BR>
Column #       2            F3<BR>
Column #       3            F4<BR>
Recordset item              Null<BR>

这是我的示例 TXT 文件 b.txt。每行以制表符开头:

    Col1    Col2    Col3
    11  12  13
    21  22  23

这里是schema.ini:

[b.txt]
Format=TabDelimited
ColNameHeader=False
MaxScanRows=0

能否请您告知为什么记录集 returns 为空值?

更新: 问题出在我的 TXT 文件中,它以某种方式损坏了。我已在文件中重新输入值,现在脚本可以运行了。

我假设您还想打印字段的值而不仅仅是字段名称。

像那样修改你的代码

Set dbFields = rs.Fields
For i = 0 To dbFields.Count - 1
    Debug.Print "Column #", i, dbFields.Item(i).Name
Next i


rs.MoveFirst
Do While Not rs.EOF
    Debug.Print rs.Fields(1).Value, rs.Fields(2).Value, rs.Fields(3).Value
    rs.MoveNext
Loop

下面的部分将打印字段的值。

你的问题是你误解了你的行的输出

Debug.Print "Recordset item", rs(3)

这一行打印字段号3的值,最好写成

Debug.Print "Recordset item", rs.fields(3).value

并且该字段可能包含 Null

UPDATE 您可以尝试以下代码。您需要添加一个 reference to ADODB

Option Explicit

Sub user_statistic_report()

Dim sPath As String
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    With cn
        .Provider = "Microsoft.Jet.OLEDB.4.0;"
        .Properties("Data Source") = "C:\Mydocs\raport\"    'sample path
        .Properties("Extended properties") = "text;HDR=No;FMT=Delimited;"
        .Open
    End With

    rs.CursorLocation = adUseClient    'someone told it helped him but it did not a trick for me
    'later I'd like to select only rows with specific conditions
    rs.Open "SELECT * FROM [b.txt]", cn, adOpenStatic
    Debug.Print "Number of records:", rs.RecordCount

    Dim wks As Worksheet
    Set wks = ActiveSheet

    wks.UsedRange.Clear
    WriteToSheet wks, rs

    rs.Close
    cn.Close
    Set cn = Nothing
    Set rs = Nothing

End Sub


Sub WriteToSheet(ByVal sh As Worksheet, ByVal rs As ADODB.Recordset)

Dim dbfields As ADODB.Fields
Dim i As Long, j As Long

    ' Write Heading resp. Field names in row 1
    Set dbfields = rs.Fields
    For i = 0 To dbfields.Count - 1
        sh.Cells(1, i + 1).Value = dbfields.Item(i).Name
    Next i

    ' Write values of the recordset starting at row 3
    j = 2
    rs.MoveFirst
    Do While Not rs.EOF
        For i = 0 To dbfields.Count - 1
            sh.Cells(j, i + 1).Value = rs.Fields.Item(i).Value
        Next i
        rs.MoveNext
        j = j + 1
    Loop

End Sub

UPDATE 2 即文本文件

这就是十六进制视图

这就是 excel 使用脚本读取文件的结果

所以,文件的内容是

TAB 11 TAB TAB 13 CRLF

制表符 21 制表符 22 制表符 23 CRLF

制表符 31 制表符 32 制表符 33 CRLF

TAB TAB 42 TAB 43 CRLF