The following examples show how to read and write from/to text files using Excel VBA and the Microsoft Scripting runtime library.
' Note: enable 'Microsoft Scripting runtime' Object library to your project before running this suroutine
Dim fso As Scripting.FileSystemObject
Dim ts As Scripting.TextStream
Set fso = New Scripting.FileSystemObject
' Create a text file, and return a reference to a TextStream
Set ts = fso.OpenTextFile("c:\trash\junk.txt", ForWriting)
ts.WriteLine "Write First Line."
ts.WriteBlankLines 2
ts.WriteLine "Skip two lines and write another line."
ts.Close
Set ts = Nothing
Set fso = Nothing
Some VBA vocabulary
FileSystemObject The File System Object (FSO) model provides an object-based tool for working with folders and files. It allows you to use the familiar object.method syntax with a rich set of properties, methods, and events to process folders and files. The FSO model gives your application the ability to create, alter, move, and delete folders, or to determine if and where particular folders exist. It also enables you to get information about folders, such as their names and the date they were created or last modified.
TextStream The TextStream Object facilitates sequential access to a text file. The FileSystemObject(FSO) returns TextStream object when you open or create a text file. You need to reference 'Microsoft Scripting runtime' Object library to your project before using TextStream object.
OpenTextFile Opens a specified file and returns a TextStream object that can be used to read from or append to the file. Parameters:
| object: | Required. Always the name of a FileSystemObject. |
| filename: | Required. String expression that identifies the file to open. |
| iomode: | Optional. Can be one of three constants: ForReading, ForWriting, or ForAppending. |
| create: | Optional. Boolean value that indicates whether a new file can be created if the specified filename doesn't exist. The value is True if a new file is created, False if it isn't created. If omitted, a new file isn't created. |
| format: | Optional. One of three Tristate values used to indicate the format of the opened file (TristateTrue = -1 to open the file as Unicode, TristateFalse = 0 to open the file as ASCII, TristateUseDefault = -2 to open the file as the system default). If omitted, the file is opened as ASCII. |
WriteLine Writes data to a sequential file. WriteLine inserts a newline character (that is, a carriage return/line feed, or Chr(13) + Chr(10)), after it has written the final character in Output to the file.
WriteBlankLines Writes a specified number of newline characters to a TextStream file.
output:
This code reads from open excel spreadsheet and writes to a text file.
Dim fso As Scripting.FileSystemObject
Dim ts As Scripting.TextStream
Dim r As Range
Dim ColumnCount As Integer
Dim i As Integer
Set fso = New Scripting.FileSystemObject
' Open for writing
Set ts = fso.OpenTextFile( _
Environ("UserProfile") & "\Desktop\TestExcelFile.txt", ForWriting, True)
' activate Sheet1
Sheet1.Activate
' determine number of columns to copy
ColumnCount = Range("A1", Range("A1").End(xlToRight)).Cells.Count
' iterate through rows and columns
For Each r In Range("A1", Range("A1").End(xlDown))
For i = 1 To ColumnCount
ts.Write r.Offset(0, i - 1).Value & vbTab
If i < ColumnCount Then ts.Write vbTab
Next i
ts.WriteLine
Next r
ts.Close
Set fso = Nothing
input and output:
This code reads from a text file into an open Excel spreadsheet.
Dim fso As Scripting.FileSystemObject
Dim ts As Scripting.TextStream
Dim TextLine As String
Dim TabPosition As Integer
Set fso = New Scripting.FileSystemObject
' Create a text file, and return a reference to a TextStream
Set ts = fso.OpenTextFile(Environ("UserProfile") & "DesktopTestExcelFile.txt")
Workbooks.Add
Do Until ts.AtEndOfStream
TextLine = ts.ReadLine
TabPosition = InStr(TextLine, vbTab)
Do Until TabPosition = 0
ActiveCell.Value = Left(TextLine, TabPosition - 1)
ActiveCell.Offset(0, 1).Select
TextLine = Right(TextLine, Len(TextLine) - TabPosition)
TabPosition = InStr(TextLine, vbTab)
Loop
ActiveCell.Value = TextLine
ActiveCell.Offset(1, 0).End(xlToLeft).Select
Loop
Set ts = Nothing
Set fso = Nothing
input and output: