[AccessD] Normalizing Excel Data

MartyConnelly martyconnelly at shaw.ca
Thu Apr 20 13:47:55 CDT 2006


Why not do it through ADO rather than import, you can retrieve 
individual sheets too.

    'Open the ADO connection to the Excel workbook
    Set oConn = New ADODB.Connection
    oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & App.Path & "\Results\Orders1.xls;" & _
               "Extended Properties=""Excel 8.0;HDR=NO;"""

Then just move the Excel fields into Access Tables.

ExcelADO demonstrates how to use ADO to read and write data in Excel 
workbooks
http://support.microsoft.com/kb/278973/EN-US/

and
http://support.microsoft.com/kb/257819/EN-US/

Here are some slightly different methods but still ADO based
I tested by exporting  Northwind Products table to xls file.

Sub test()
Dim oConn As New ADODB.Connection
Dim oRS As New ADODB.Recordset
Set oRS = New ADODB.Recordset
Set oConn = New ADODB.Connection
With oConn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .Properties("Extended Properties").Value = "Excel 8.0"
    .Open "C:\Excel\ExcelADO\Results\Products.xls"
    '....
   
    'Set oRS = cConn.Open("Select * from [Sheet1$A1:B10]", oConn, 
adOpenStatic)
With oRS
 .Open "Insert Into tbltest SELECT * FROM [Products$A1:B10]", _
         oConn, adOpenStatic
 '.Open "SELECT * FROM [Sheet1$] WHERE LastName = 'Doe'", _
 '        cnnDB, adOpenDynamic, , adCmdText
 Debug.Print oRS.RecordCount
 .Close
End With
    .Close
End With

End Sub



Sub ImportExcelToAccess()
Dim sqlString As String
Dim strexcelpath As String
Dim dbs As Database
Set dbs = CurrentDb
strexcelpath = "C:\Excel\ExcelADO\Results\Products.xls"

'Import to Excel
'Assumes Access table does not already exist

sqlString = "SELECT * INTO [tblExcelNew] FROM [Excel 8.0;DATABASE=" & _
             strexcelpath & ";HDR=Yes;IMEX=1].[Products$A1:B100]"
'export to Excel
sqlString = " INSERT INTO [Excel 
8.0;Database=C:\temp\MyWorkbook.xls;].[MySheet1$E6:G65536]" & _
            "SELECT * FROM MyTable WHERE MyKeyCol = 99"
           
'Assumes Access table exists
'sqlString = "INSERT INTO [tblExcelNew] (Product, UnitPrice, 
UnitsInStock)" & _
' " SELECT Product, UnitPrice, UnitsInStock from" & _
' "[Excel 8.0;DATABASE=" & strexcelpath & ";HDR=Yes;IMEX=1].[Products$];"

Debug.Print sqlString
dbs.Execute sqlString
Set cnn = Nothing

End Sub

ewaldt at gdls.com wrote:

>This will be a simplified version of what I need. I believe I can expand it
>appropriately, if I can be helped in this simplified version.
>
>Let's say we have an Excel spreadsheet with the following data:
>
>ID    Name  Data_A      Data_B      Data_C
>100   Tom   11    22    33
>101   Mary  44    55    66
>102   John  77    88    99
>
>Now, what I want to do is to import this into Access, where I've already
>normalized tables as follows:
>
>tblMain
>Main_ID     Long integer, autonumber
>Main_Num    Single
>Main_Name   Text
>
>
>tblData
>Data_ID     Long integer, autonumber
>Data_Num    Single
>Data_Value  Single
>
>
>What I need to create from these tables and the appropriate relationship is
>as follows:
>
>Data_Num    Data_Value
>100.01            11
>100.02            22
>100.03            33
>101.01            44
>101.02            55
>etc.
>
>What I am doing is creating a new ID number for each Name-Data combination,
>and entering its given data in that record. For each value in DataA, the
>new ID number is formed by adding .01 to the Main_Num for the corresponding
>Name record.
>
>This is required by business rules, not by logical database rules. Sigh.
>Anyway, I'm looking for logical ways to (1) set this up initially, (2)
>import the Excel data, which is, of course, flat file, and (3) have it
>available afterwords for normal database usage, meaning inputting data
>directly, rather than through importing.
>
>I hope this is clear (I wouldn't place any bets on it, though). Any help
>would be sincerely appreciated. I've been working on it for quite a while,
>but just can't seem to get a handle on it.
>
>TIA,
>
>Thomas F. Ewald
>FCS Database Manager
>General Dynamics Land Systems
>(586) 276-1256
>
>
>
>
>
>This is an e-mail from General Dynamics Land Systems. It is for the intended recipient only and may contain confidential and privileged information.  No one else may read, print, store, copy, forward or act in reliance on it or its attachments.  If you are not the intended recipient, please return this message to the sender and delete the message and any attachments from your computer. Your cooperation is appreciated.
>  
>

-- 
Marty Connelly
Victoria, B.C.
Canada






More information about the AccessD mailing list