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
我是 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