Data transfer often comes in bulk jobs with multiple records and data fields. But occasionally, you'll need to transfer only one record at a time. For example, you might need to transfer details from a data entry order form to a larger purchasing database. In that case, you transfer details as each order is processed, one at a time. When you're facing such a task, you can use VBA code -- and you can set it all up in 10 quick steps.
1: Analyze your needs
There are several parts to a transfer task. The scenarios are unique, but the components are generally the same:
- The data you're transferring
- The source file that contains the data
- The destination file to which you're transferring the data
- The transfer medium used to make the switch; usually, it's code
You'll need to identify these four components before you do a thing.
Our example uses a Word form to gather data (input values), but you might use a Web form, an Excel userform, or some other format. The transferring code and process will be mostly the same, regardless of the input's format. This exercise is less about the source and more about the ability to transfer records, one at a time, to a destination file.
2: Determine the destination formatAfter ensuring that you have all the pieces you need to begin your work, determine the physical dynamics of the destination file. Usually, this format is predetermined. We'll transfer two text elements, a company's name and phone number, record by record, into the simple Excel sheet shown in Figure A.
Our example sheet is simple on purpose. Transferring the data is the job; the number of fields is usually irrelevant.
3: Identify the destination data types
Once you know the format, note the data types the source file expects to receive. You might have to convert data types before actually transferring the data. We won't do so in this example. Both fields in this destination sheet are text using the General format. But it's important to note this information before beginning because the data might need special handling. For instance, strings and dates must be delimited property.
4: Note the destination file's location
The next bit of information you'll need is the path to the destination file. In this example, both files will be on the same drive but in different folders. Some data must travel long distances to get from the source to its destination file, and you'll need to know every node of that journey. If you're using a network, you might need to code in special permissions and passwords to use along the way. Our example destination workbook resides at E:\Examples and isn't password protected.
5: Create the source formIf you're lucky, you'll have some flexibility when choosing the source format (but not always). In this case, we'll use the simple Word form shown in Figure B to collect two pieces of data.
Use Word's form fields to collect data.
A Word form is a document that contains fill-in blanks called fields. Each field is a predefined cell that stores data input. To create the example Word form, insert two text fields into a blank Word document as follows:
- Click the Developer tab and then choose the ab field from the Legacy Tools drop-down in the Controls group (circled in Figure B). In Word 2003, choose Toolbars from the View menu and select Forms, where you'll find the Text Form Field control.
- Click Properties in the Controls group or double-click the field to display its properties.
- Enter txtCompanyName in the Bookmark property, as shown in Figure C.
- Click OK.
- Repeat steps 1 through 4, entering txtPhone in step 3.
- Save the form.
The text form field is a legacy tool in the Ribbon versions.
6: Add the basic code
To add the code that transfers a single record from the fields to the example workbook, do the following:
- With the Word form open, press [Alt]+[F11] to launch the Visual Basic Editor (VBE).
- From the Insert menu, choose Module.
- Enter the code in Listing A.
- Save the module and return to the Word form.
Listing A: The transferring macro
'Transfer a single record from the form fields to an Excel workbook.
Dim strCompanyName As String
Dim strPhone As String
Dim strSQL As String
Dim cnn As ADODB.Connection
Set doc = ThisDocument
On Error GoTo ErrHandler
strCompanyName = Chr(39) & doc.FormFields("txtCompanyName").Result & Chr(39)
strPhone = Chr(39) & doc.FormFields("txtPhone").Result & Chr(39)
'Define sql string used to insert each record in the destination workbook.
'Don't omit the $ in the sheet identifier.
strSQL = "INSERT INTO [PhoneList$]" _
& " (CompanyName, Phone)" _
& " VALUES (" _
& strCompanyName & ", " _
& strPhone _
'Define connection string and open connection to destination workbook file.
Set cnn = New ADODB.Connection
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=E:\Examples\Sales.xlsx;" & _
"Extended Properties=Excel 8.0;"
Set doc = Nothing
Set cnn = Nothing
MsgBox Err.Number & ": " & Err.Description, _
On Error GoTo 0
On Error Resume Next
Set doc = Nothing
Set cnn = Nothing
7: Add a way to execute the macro
You could add a macro button to the Ribbon or even a command button to the document. But using form fields, you can bypass the interface tools and let one of the fields execute the macro as follows:
- Double-click the phone field (txtPhone) to open its property sheet.
- From the Exit drop-down, select the transfer macro from Listing A, TransferToExcel, as shown in Figure D.
- Click OK.
Pressing [Tab] to leave the phone field will execute TransferToExcel(), which will copy the text in the company name and phone fields to Sales.xlsx. When applying this code to your own work, be sure to update the path appropriately.
Select the transfer macro from the Exit drop-down.
8: Protect the Word document
Before using the Word form, restrict its use by limiting changes to the form fields as follows:
- Click the Developer tab and then click Restrict Editing in the Protect group. In Word 2003, click Protect on the Form toolbar.
- In the resulting task pane, click Allow Only This Type Of Editing In This Document.
- From the drop-down, select Filling In Forms, as shown in Figure E.
- Click Yes, Start Enforcing Protection.
- Enter a password twice. Or leave both password entries blank if you don't need password protection.
- Click OK.
Enable protection to restrict data entry to the form fields.
9: Use the formAll your basic components are in place and you're ready to use the form. To do so, tab into the first field (if necessary) and enter a company name. Press [Tab] and enter a phone number, as shown in Figure F. After entering the phone number, press [Tab] to execute the code. Then, check the Sales.xlsx Excel workbook. As you can see in Figure G, the code transferred the record, as expected. The code appends each record as transferred, allowing you to accommodate existing data.
Using form fields to collect data is easy.
Our macro code copied the data from the Word form to an Excel sheet.
10: The rest of the story
The macro in Listing A covers the basics. It identifies the data and transfers it, as is, to a destination workbook. That part's common to almost all transfer tasks where you're moving one record at a time. There's much more to consider. For instance, there's no data validation; there's nothing to force users to enter a valid phone number in the right format. To ensure consistent and valid data, include code that validates the data (usually before transferring).
You also might want to include a confirmation message that asks users to confirm the transfer before actually executing the code. Right now, the transfer is automatic. The error handling is bare bones. You'll need to test your code thoroughly for all possible problems. These are just a few of the areas you'll want to customize.
Susan Sales Harkins is an IT consultant, specializing in desktop solutions. Previously, she was editor in chief for The Cobb Group, the world's largest publisher of technical journals.