ExcelUser logo Free guides and templates
Work In Progress...After nearly ten years, I'm redesigning ExcelUser.com. This is the new design. You can learn more here. Also, if you find something wrong with the site, please tell me about the problems. And thanks for your patience.--Charley Kyd
Home >  Excel Help Questions > 

A VBA Tutorial

Read a Text File with VBA in Excel, and Write the Text to a Spreadsheet

VBA can read a text file and then write it to your spreadsheet. Here's an example of a VBA program that shows how to do it.


Charley Kyd is a Microsoft Excel MVP by Charley Kyd, MBA
Microsoft Excel MVP

"I need to write a text file into one row of my Excel spreadsheet, cell by cell, 20 characters at a time. It's urgent. Can you help?" -- Kumar

Kumar,

It's sort of a strange request. But it sounds like fun. And it demonstrates how we can read text files into Excel using VBA.

By the way, the following code illustrates the various points I discussed in Corporate VBA Standards For Excel Users Who Program.

To begin, create a new workbook with two sheets. Name one sheet Control and the other Target.

In the Control worksheet, enter the text shown in column A:

Assign the range names shown in column A to cells in column B. To do so, select the range A4:B9. Choose Insert, Name, Create. In the Create Names dialog, ensure that only Left Column is checked. Then choose OK.

Enter the path and name for your text file. (I used File Explorer to navigate to its directory and then copied the path text from the Address bar.) Enter the other information shown.

Leave the Target sheet blank.

Press Alt+F11 to bring up the Visual Basic editor. To create a new module, right-click your workbook's name in the editor's project window and choose Insert, Module.

Then copy and paste the following code to your module.

''Require that all variables be declared
Option Explicit

''======================================================
'' Program:    ParseText
'' Desc:       Reads a text file into a variable then
''             writes it into a row, n chars at a time
'' Called by:  user
'' Call:
'' Arguments:
'' Comments:   Written quickly. No error-checking.
'' Changes----------------------------------------------
'' Date        Programmer     Change
'' 6/14/06     Charley Kyd    Written
''======================================================

Sub ParseText()
   Dim sText As String, sFile As String

   ''Get the full path to the source file
  
With ThisWorkbook
      sFile = .Names("SourcePath").RefersToRange
      If Left(sFile, 1) <> "\" Then sFile = sFile & "\"
      sFile = sFile & .Names("SourceFile").RefersToRange
   End With

   ''Get the full text string from the text file
  sText = GetText(sFile)

   ''Remove all nonprintable characters from the text
   ''Comment out if the characters are wanted
  
sText = Excel.WorksheetFunction.Clean(sText)

   ''Write to the workbook
   WriteToSheet sText
End Sub

''======================================================
'' Program:    GetText
'' Desc:       Read a text file into a string and then
''             return the string
'' Called by:  ParseText
'' Call:       GetText(sFile)
'' Arguments:  sFile--The full path to the text file
'' Comments:
'' Changes----------------------------------------------
'' Date      Programmer   Change
'' 6/14/06   Charley Kyd  Written
''======================================================

Function GetText(sFile As String) As String
   Dim nSourceFile As Integer, sText As String

   ''Close any open text files
  
Close

   ''Get the number of the next free text file
   nSourceFile = FreeFile

   ''Write the entire file to sText
  
Open sFile For Input As #nSourceFile
   sText = Input$(LOF(1), 1)
   Close

   GetText = sText
End Function

''======================================================
'' Program:    WriteToSheet
'' Desc:       Writes a text string to one row of a
''             worksheet, n characters per column
'' Called by:  ParseText
'' Call:       WriteToSheet sText
'' Arguments:  sText--String with text from text file
'' Comments:   This routine will throw an error if the
''             text is too long to fit within 256 columns
'' Changes----------------------------------------------
'' Date      Programmer   Change
'' 6/14/06   Charley Kyd  Written
''======================================================

Sub WriteToSheet(sText As String)
   Dim sTgtSheet As String, nTgtRow As Integer
   Dim nColCount As Integer, sChunk As String
   Dim nIncrement As Integer, rngRef As Range

   ''Get the controlling variables
  
With ThisWorkbook
      sTgtSheet = .Names("TargetSheet").RefersToRange
      nTgtRow = .Names("TargetRow").RefersToRange
      nIncrement = .Names("Increment").RefersToRange

      Set rngRef = Worksheets(sTgtSheet).Cells(nTgtRow, 1)
   End With

   ''Erase any previous entries
   rngRef.EntireRow.ClearContents

   ''Initialize the column counter
   nColCount = 0

   ''Loop thru the string, grabbing text of specified
   ''length, writing the text to the spreadsheet
  
Do
      ''Increment the column count
      nColCount = nColCount + 1
      ''Grab the current chunk of text
      sChunk = Mid$(sText, 1 + (nColCount - 1) * _
          nIncrement, nIncrement)
      ''Write it to the spreadsheet
     
rngRef.Cells(1, nColCount) = sChunk

      ''Stop after writing a partial chunk
   Loop Until Len(sChunk) < nIncrement
End Sub

Finally, set up a button in your Control sheet to run the macro easily. To do so, first activate your Control sheet. Right-click any toolbar. Click on Forms if its not already checked.

Click on the Button icon in the Forms toolbar. Doing so turns your pointer into a cross. Use the cross to draw the outline of a button on your worksheet.

When you release your left mouse button, Excel draws the button and launches the Assign Macro dialog. Choose the ParseText macro, then choose OK. Select the text "Button 1" in the button and then type any text you want, like "Parse Text". Then click on any cell to deselect the button.

Now, when you click on the button, Excel should run your macro and write your text to your Target worksheet.

 




Dashboard Reporting With Excel


Charley's SwipeFile charts