vba - 从 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 文件中,它以某种方式损坏。我重新输入了文件中的值,脚本现在可以工作了。
解决方案
我假设您还想打印字段的值,而不仅仅是字段名称。
像这样修改你的代码
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
推荐阅读
- jekyll - 如何使用 Liquid 对 Jekyll 的数据项进行分页
- mongodb - 如何在 DynamoDB 中存储任意结构的 API 响应
- angularjs - 如何使用meteorjs、AWS s3和Angularjs下载大文件?
- angular - Filter *ngFor from array object
- javascript - 使用 id 变量的“querySelectorAll”上的无效选择器
- r - 如何使用颜色选择器生成代码颜色字符
- ios - Swift - Creating custom functions for NSExpression
- python - Python: Binarize image and fill shapes
- amazon-web-services - 如何将数据从 Google Cloud Storage 传输到 Amazon S3 并获得相关费用?
- php - 从 php 数据文件中获取特定的键和值到 js