首页 > 解决方案 > 从 TXT 文件创建的 VBA 记录集返回 Null 值 (Excel 2013)

问题描述

我是在 VBA 中使用记录集的新手,这个问题让我发疯。

我得到一个大报告(cca 57000 行),它保存为带有标签的文本文件。我的任务是删除不必要的数据,插入其他数据并创建数据透视表之类的东西。现在这个任务是在 Excel 中手动完成的,它会产生一个使用不便的大文件。所以我想在记录集中导入 TXT 文件并使用 SQL 语句操作数据,并将结果保存在单独的 Excel 文件中。

我已经设法直接从 TXT 导入数据。显示.CountRecord正确的记录数,但它们是空的。我尝试从相同的结果.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

这是我在“立即”窗口中看到的内容:

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

您能否告知为什么记录集返回 Null 值?

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

标签: vbaexceladorecordset

解决方案


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

像这样修改你的代码

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

更新您可以尝试以下代码。您需要添加对 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用脚本读取文件的结果

在此处输入图像描述

所以,文件的内容是

选项卡 11 选项卡 13 CRLF

选项卡 21 选项卡 22 选项卡 23 CRLF

选项卡 31 选项卡 32 选项卡 33 CRLF

制表符 制表符 42 制表符 43 CRLF


推荐阅读