Introduction.
Last week we learned how to upload a simple list of names (separated with commas) from a text file into Microsoft Access Table.
Now, we will improve that program a little bit more to add a few fields (Name, Birthdate, Height, and Weight) to each record. The sample text file image is given below for reference.
The text file has a fixed number of items on a single line. All four items belong to a single record. In last week's example, we used a single column in the Access Table output, and the number of items on each line in the text file was different. Since, all the items belong to a single output column on Access Table we need to determine how many items are there in the x_Names Array, put by the Split() Function from a single line of text and we have used Ubound() Function to take the count of items in the output Array.
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 we did in the earlier example, first we are attempting to create a new access table with four fields. If the table creation process ends up with error code 3010 then the table already exists and continues to execute from the next line, skipping the table creation process. If it ends up with any other error code, then the program terminates. Opens the text file for reading the text data, each line at a time. The Split() function breaks up items in the line and loads them into the x_Names Array.
The next step is to add a new record into the access table, take each item from the array element and load it into the corresponding data field before updating them on the table. We know that each text line has four items and they are in which order. Only we need to know the array index numbers to read the items and load them into the fields. Split Function uses a zero-based index system to store the items in the array in memory. Since, we have only four items on a line the index numbers will be 0,1,2,3 to address each item in the array in sequence, Name, Birth Date, Height, and Weight shown in the program snippet given below.
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 good for beginners and easy to understand. But, it is not an efficient method when more items are there on a text line to upload. The second code is more compact and doesn't address the field names directly. If any of the field names change at a later stage the first code snippet will run into an error but the second code will work without errors. The number of items on a line is also taken care of automatically.
The first code cannot be used for a different table, but the second code snippet works for any table without change.
No comments:
Post a Comment
Comments subject to moderation before publishing.