我使用VBA和ADODB查询管道分隔的文本文件。我尝试过使用ACE和JET引擎,但结果是一样的,不正确。我在目录中保存了一个“schema.ini”文件,告诉引擎文件是管道分隔的。当查询完成时,我有数据移动列和其他字段,当我可以看到文本文件中的数据时,这些字段是空白的。我使用CopyFromRecordset
方法将结果传输到我的工作簿。谁能在我的代码中看到一些东西?或者有没有人碰到这个?
我的连接字符串:
With Conn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & strPath & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
.Open
End With
“strPath”的价值:
strPath = "H:\Folder\"
SQL字符串:
strSQL = "SELECT * FROM " & strFile & ";"
数据传输:
With ThisWorkbook
With .Sheets("CashFlows")
.Range("a2").CopyFromRecordset Rst
With .Range("a1")
For i = 0 To Rst.Fields.Count - 1
.Offset(0, i) = Rst.Fields(i).Name
Next i
End With
End With
End With
我从未遇到过ADO(Ace或Jet)的问题,而且我经常使用它们。但是,我之前没有将它们用于管道分隔文件。
如果我的解释不清楚,或者您需要更多代码,请发表评论。
修改 请参阅下面的管道脱离文本文件中的两行。第一行正常解析。第二个是“651111100”和“654444475”。最奇怪的是,当我直接在Excel中打开它们并将文本用于列时,这些解析完全正常。
08/31/2015|000|000|Recital #5546|0000000012|88885463|123334563
08/31/2015|000|000|DII #7412|651111100|654444475|00000326541
我重新检查了,问题只在于它正在丢弃列,而不是它正在移动它们。抱歉有任何困惑。
更新
我在文本文件中进行了查找/替换,并输入“^”而不是“|”。然后我试图再次运行它,我遇到了同样的问题!
答案 0 :(得分:0)
虽然我仍然不确定问题是什么,但以下是一个可用的解决方案:
Option Explicit
Public Sub ImportTextFile()
Dim lngRowNumber As Long
Dim strImportFile As String
Dim intNextFreeFile As Integer
Dim strOneImportLine As String
Dim arySplitLine As Variant
With Application
.ScreenUpdating = False
.Calculation = xlManual
.EnableEvents = False
End With
intNextFreeFile = FreeFile
strImportFile = "C:\path\to\the\TextFile.csv"
lngRowNumber = 1
Open strImportFile For Input Access Read As #intNextFreeFile
Do While Not EOF(intNextFreeFile)
Line Input #intNextFreeFile, strOneImportLine
arySplitLine = Split(strOneImportLine, "|")
Sheets(1).Cells(lngRowNumber, 1).Value2 = arySplitLine
lngRowNumber = lngRowNumber + 1
Loop
Close #intNextFreeFile
With Application
.ScreenUpdating = True
.Calculation = xlAutomatic
.EnableEvents = True
End With
End Sub
我的计算机上的测试运行在12秒内完成了80MB文件中100万行的导入。 虽然我确信有更好的方法可以做到这一点超出这个解决方案,但您可能希望在此期间尝试一下。