ERLANDSEN DATA CONSULTING Excel & VBA Tips   Informasjon på norsk / Information in Norwegian

These pages are no longer updated and are only available for archive purposes.

Click here to visit the pages with updated information.

Import data from a text file (ADO)

The procedure below can be used to get an ADO recordset from a text file and fill in the result in a worksheet.

Sub GetTextFileData(strSQL As String, strFolder As String, rngTargetCell As Range)
' example: GetTextFileData "SELECT * FROM filename.txt", _
              "C:\FolderName", Range("A3")
' example: GetTextFileData "SELECT * FROM filename.txt WHERE fieldname = 'criteria'", _
              "C:\FolderName", Range("A3")
Dim cn As ADODB.Connection, rs As ADODB.Recordset, f As Integer
    If rngTargetCell Is Nothing Then Exit Sub
    Set cn = New ADODB.Connection
    On Error Resume Next
    cn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
        "Dbq=" & strFolder & ";" & _
    On Error GoTo 0
    If cn.State <> adStateOpen Then Exit Sub
    Set rs = New ADODB.Recordset
    On Error Resume Next
    rs.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
    On Error GoTo 0
    If rs.State <> adStateOpen Then
        Set cn = Nothing
        Exit Sub
    End If
    ' the field headings
    For f = 0 To rs.Fields.Count - 1
        rngTargetCell.Offset(0, f).Formula = rs.Fields(f).Name
    Next f
    rngTargetCell.Offset(1, 0).CopyFromRecordset rs ' works in Excel 2000 or later
    'RS2WS rs, rngTargetCell ' works in Excel 97 or earlier
    Set rs = Nothing
    Set cn = Nothing
End Sub

The procedure can be used like this:

Sub TestGetTextFileData()
    Application.ScreenUpdating = False
    GetTextFileData "SELECT * FROM filename.txt", "C:\FolderName", Range("A3")
'    GetTextFileData "SELECT * FROM filename.txt WHERE fieldname = 'criteria'", _
        "C:\FolderName", Range("A3")
    ActiveWorkbook.Saved = True
End Sub
Replace filename.txt with the name of the text file you want to get data from.
Replace C:\FolderName with the name of the folder where the text file is saved.

The first row in the text file will be used as column headings/field names.
Each column with datwa must be separated with the list separator character that is used in the regional settings in the Control Panel. I Norway this usually is semicolon (;), in other countries this can be a comma (,).

You'll find the procedure RS2WS by clicking on this link.

The macro example assumes that your VBA project has added a reference to the ADO object library.
You can do this from within the VBE by selecting the menu Tools, References and selecting Microsoft ActiveX Data Objects x.x Object Library.


Document last updated 2002-04-02 12:46:39      Printerfriendly version

User comments:
Ole P. from Trondheim wrote (2006-09-05 15:52:26 CET):
Re: Import from multiple text files?
Try something like this:

SELECT a.Table1, b.Table1 FROM TextFile1.txt a, TextFile2.txt b Where a.Table2 = b.Table2
Erlend from Norway wrote (2006-09-05 14:20:50 CET):
Import from multiple text files?
Can anyone give an example of how to import from multiple text files-

That is I would like to do something like this (Both tables contain a field Table1):

SELECT TextFile1.Table1,TextFile2.Table1 FROM TextFile1.txt, TextFile2.txt Where TextFile1.Table2 = TextFile2.Table2

But this creates an error..
Ole P. from Norway wrote (2005-12-06 11:38:30 CET):
Re: How about finding just one row of a text file?
Your example refers to an Access database, not a text file.

You can populate the necessary query string like this:

Sub Test()
Dim r As Long, lrn As Long
Dim strItems As String, strItem As String, strSQL As String
' find last used cell
lrn = Range("A" & .Rows.Count).End(xlUp).Row
' populate query filter
For r = 15 To lrn
strItem = Trim(Range("B" & r).Text)
If Len(strItem) > 0 Then
strItems = strItems & "'" & strItem & "', "
End If
Next r
If Len(strItems) > 0 Then
strItems = Left$(strItems, Len(strItems) - 2)
strSQL = "select * from TableName where FieldName in (" & strItems & ")"
With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DSN=MS Access Database;DBQ=C:\Folder\FileName.mdb;DefaultDir=C:\Folder;DriverId=25;FIL=MS Access;MaxBufferSize=20" _
), Array("48;PageTimeout=5;")), Destination:=Range("D1"))
.CommandText = strSQL
.Name = "QueryName"
.FieldNames = False
.RowNumbers = False
.FillAdjacentFormulas = True
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = False
.RefreshPeriod = 0
.PreserveColumnInfo = False
.Refresh BackgroundQuery:=False
End With
End If
End Sub
Andy from Detroit, MI wrote (2005-12-06 01:24:53 CET):
Re:Re: How about finding just one row of a text file?
Ok, I've tried that when I recorded a macro, however, I'm not able to substitute the values for an object string. For example:

Another concern with the loop is that it would repeatedly open a connection -- would definetely be slow. An more efficient way would be to gather all of the PNs -- sort of like making a listbox -- open the connection, gather all of the recordsets, then loop thru the spreadsheet. I think I can figure this out eventually, but I'm stuck on the variables 'xPN' & 'thisPN', as well as constructing an array of multiples, to use your example ('0001324', '0001322', '0005555', '0007777', '0009999').
Ole P. from Norway wrote (2005-12-05 10:06:07 CET):
Re: How about finding just one row of a text file?
If you just want to return one row from your query you have to add a distinct filter-criteria, e.g. like this:
"SELECT * FROM filename.txt WHERE PartNumber = '0001324'"

If you want to query multiple part numbers and return multiple rows in one single query, it can be done like this:
"SELECT * FROM filename.txt WHERE PartNumber IN ('0001324', '0001322', '0005555', '0007777', '0009999')"
Andy from Detroit, MI wrote (2005-12-05 01:37:55 CET):
How about finding just one row of a text file?
I'm trying to figure out the following:

1) Take the Lookup Value in Cell B2, i.e. " 0001324 "

2) Find the match in a text file with PSV laid out thusly over 1.8 million lines-- PartNumber may, or may not, be in ascending order :
9999999|Fluid, Brake,Silicon|E|GAL|$56.00|N



Ole P. from Norway wrote (2004-12-17 20:44:50 CET):
Re: Couldn't get ADO to read very large text file (200,000+ records)
This new example shows how you can read data from a large text file (1 000 000 records) using ADO and put the contents into separate worksheets (e.g. 100 worksheets with 10 000 records each).

Peter Mroz from Princeton, NJ wrote (2004-12-17 17:37:54 CET):
Couldn't get ADO to read very large text file (200,000+ records)
Thanks for the above information - I used it as a starting point for a program that reads a tab-delimited file in and splits it into separate worksheets. The program worked great for smaller files (42,000 records), but was not able to open a 200,000 record file. I know that Excel has a 65536-row limit, but what I was trying to do was determine the number of distinct values of a particular column (EVAL CRITERIA), and then split the file up into separate worksheets based on that column.

Here's the code I wrote, which shows how to issue a SELECT COUNT(*) from a tab delimited text file. This macro works for smaller files, but not for a 200,000+ record file.

[snip, snip, snip, removed large code example]


Erlandsen Data Consulting   
Excel & VBA Tips   Copyright ©1999-2018    Ole P. Erlandsen   All rights reserved
E-mail Contact Address