Introduction.
Last week, we learned how to upload a simple list of names (separated with commas) from a text file into a Microsoft Access Table.
Next, we will enhance the program to include additional fields—Name, Birthdate, Height, and Weight—for each record.
For reference, a sample of the text file layout is shown in the image below.
The text file contains a fixed number of items per line, with all four items for a single record. In last week’s example, we used only one column in the Access table output, and the number of items on each line varied.
Since all items are written to a single output column in the Access table, we need to determine how many elements exist in the x_Names array, which is created using the Split() function from a single line of text. We use the UBound() function to get the count of items in the array before processing them.
In this example, we have an output table with a fixed number of fields: Name, Birth Date, Height, and Weight. A sample image of the output table is given below:
The VBA Code.
VBA Code that uploads the text file into the Access table is given below:
Public Function NamesList2() '----------------------------------------------------- 'Utility: Creating Access Table from ' : comma separated text data. 'Author : a.p.r.pillai 'Date : May 2016 'Rights : All Rights Reserved by www.msaccesstips.com '----------------------------------------------------- Dim db As Database, rst As Recordset, tdef As TableDef Dim strH As String, fld As Field, j As Integer Dim x_Names As Variant, tblName As String, fldName As String Dim txtfile As String On Error GoTo NamesList2_err tblName = "NamesList2" txtfile = "d:\mdbs\Names2.txt" 'Make required changes 'create the NamesList2 table Set db = CurrentDb Set tdef = db.CreateTableDef(tblName) With tdef .Fields.Append .CreateField("Name", dbtext, 50) .Fields.Append .CreateField("BirthDate", dbDate) .Fields.Append .CreateField("Height", dbInteger) .Fields.Append .CreateField("Weight", dbInteger) End With db.TableDefs.Append tdef db.TableDefs.Refresh 'Open the NamesList table to write names with the text file Set rst = db.OpenRecordset(tblName) 'Open the Names2.txt file to upload data into the table Open txtfile For Input As #1 'setup a loop to read the data till the end-of-file reached Do While Not EOF(1) 'read the first line of items separated with commas and 'terminated with carriage return (Enter key)into variable strH Line Input #1, strH 'extract each item separated with comma and load into the Array variable x_Names x_Names = Split(strH, ",") 'Read each item from array elements 'and write into the NamesList2 table fields With rst .AddNew ![Name] = x_Names(0) ![BirthDate] = x_Names(1) ![Height] = x_Names(2) ![Weight] = x_Names(3) .Update End With 'Repeat till the End-Of-Text File is reached Loop NamesList2_Exit: rst.Close db.Close Set rst = Nothing Set db = Nothing Exit Function NamesList2_err: If Err = 3010 Then 'Table already exists 'continue executing from the next line onwards Resume Next Else MsgBox Err & ": " & Err.Description, "NamesList2()" Resume NamesList2_Exit End If End Function
How IT Works.
As in the previous example, we first attempt to create a new Access table with four fields. If the table creation process returns error code 3010, it means the table already exists, and the program skips the table creation step and continues execution. Any other error code will cause the program to terminate.
Next, the text file is opened for reading, processing one line at a time. The Split()
function breaks each line into individual items and stores them in the x_Names
array.
The following step is to add a new record to the Access table. Each item from the array is assigned to its corresponding field before the record in the table is updated. Since each line contains four items in a fixed order, we only need to know the array index numbers to correctly assign them:
-
x_Names(0)
→ Name -
x_Names(1)
→ Birth Date -
x_Names(2)
→ Height -
x_Names(3)
→ Weight
Remember, the Split()
function uses a zero-based index, so the array elements are numbered 0, 1, 2, 3 in memory, corresponding to each item in the line. The program snippet below demonstrates this process.
With rst .AddNew ![Name] = x_Names(0) ![BirthDate] = x_Names(1) ![Height] = x_Names(2) ![Weight] = x_Names(3) .Update End With
We can use the following code in place of the above code snippet:
With rst .AddNew For j = 0 To UBound(x_Names) .Fields(j).Value = x_Names(j) Next .Update End With
The first code snippet is beginner-friendly and easy to understand. However, it becomes less efficient when there are more items on a line to upload.
The second code snippet is more compact and does not reference field names directly. This has two advantages:
-
If any field names change later, the first snippet may generate an error, whereas the second snippet will continue to work without modification.
-
The second snippet automatically handles any number of items on a line, making it more flexible and scalable for larger datasets.
The first code cannot be used for a different table, but the second code snippet works for any table without change.