** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Tus Funciones Favoritas & Aportaciones & Artí­culos
  Mensajes nuevos Mensajes nuevos RSS - VBA: Access - Excel. Importación Normalizada
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoVBA: Access - Excel. Importación Normalizada

 Responder Responder
Autor
Mensaje
genoma111 Ver desplegable
Administrador
Administrador
Avatar

Unido: 28/Marzo/2011
Localización: ...
Estado: Sin conexión
Puntos: 3248
Enlace directo a este mensaje Tema: VBA: Access - Excel. Importación Normalizada
    Enviado: 21/Agosto/2013 a las 09:25
Muchas veces en que nos encontramos trasteando datos entre Excel y Access, necesitamos importar una hoja de datos a Access repartiendo los datos según la estuctura de nuestra base de datos, usualmente normalizada.

Para ello creé el siguiente código que me ha resultado de utilidad.

La cadena de conexión se debe adaptar a la versión que cada cuál maneje.

En este caso uso Access 2010.

El campo ID debe estar indexado. Este campo es diferente al autonumérico de Access, por supuesto.

Este es el código:


Private Sub Command0_Click()

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1

Dim cn          As New ADODB.Connection
Dim rst         As New ADODB.Recordset
Dim rstTabla1   As DAO.Recordset
Dim rstTabla2   As DAO.Recordset
Dim dbs         As DAO.Database

cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=C:\Ruta\Libro de Excel.xlsx;" & _
        "Extended Properties=""Excel 12.0;HDR=Yes;"";"

rst.Open "Select ID, campo1, campo2 FROM [Hoja de datos de Excel$]", _
          cn, adOpenStatic, adLockOptimistic, adCmdText

Set dbs = CurrentDb

Set rstTabla1 = dbs.OpenRecordset("Tabla1")
Set rstTabla2 = dbs.OpenRecordset("Tabla2")

With rst
   If Not .EOF And Not .BOF Then
       Do Until .EOF
           rstTabla1.Index = "ID"
           rstTabla1.Seek "=", .Fields.Item("ID")
           
           If rstTabla1.NoMatch Then
       
               rstTabla1.AddNew
               rstTabla1!ID = .Fields.Item("ID")
               rstTabla1.Update
       
               rstTabla2.AddNew
               rstTabla2!campo1 = .Fields.Item("campo1")
               rstTabla2!campo2 = .Fields.Item("campo2")
               rstTabla2!ID = .Fields.Item("ID")
               rstTabla2.Update

           Else
       
               rstTabla2.AddNew
               rstTabla2!campo1 = .Fields.Item("campo1")
               rstTabla2!campo2 = .Fields.Item("campo2")
               rstTabla2!ID = .Fields.Item("ID")
               rstTabla2.Update

           End If
           .MoveNext
       Loop
   End If
End With

rstTabla1.Close
rstTabla2.Close

Set rstTabla1 = Nothing
Set rstTabla2 = Nothing
Set dbs = Nothing

MsgBox "Ok"

End Sub
"To VBA or not to VBA... that's the question" DFP
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable