** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Importar hoja excel a tabla de access existente
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Importar hoja excel a tabla de access existente

 Responder Responder
Autor
Mensaje
Elenam_80 Ver desplegable
Habitual
Habitual


Unido: 04/Mayo/2015
Localización: Madrid
Estado: Sin conexión
Puntos: 121
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Elenam_80 Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Importar hoja excel a tabla de access existente
    Enviado: 24/Mayo/2023 a las 11:55
Buenas, hace tiempo que no toco VBA y access y he estado más con VBA en excel. Me está costando un poco refrescar...

Estoy tratando de hacer algo que yo creía bastante sencillo pero me da error.

Tengo con un access con un botón en un formulario que al hacer click importa en la tabla PEDIDOS los datos de Hoja1 de un fichero excel. En la tabla PEDIDOS el campo clave es ID y del excel solo quiero que se importen los registros que son nuevos, ya sabes lo que no están cargados en la tabla de Access (es un fichero excel que alguien va actualizando). El caso es que me da error y no sé cómo decirle que solo me importe los registros con ID nuevo que no existen en la tabla.
Este es el código. Podéis echarle un ojo?
Muchas gracias!

Option Compare Database
Private Sub Comando3_Click()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim xlApp As Object
    Dim xlWorkbook As Object
    Dim xlWorksheet As Object
    Dim strFilePath As String
    
    ' Ruta del archivo de Excel que quiero importar
    strFilePath = "C:\Users\miusuario\Desktop\ejemplo\datos.xlsx"
    
    ' Nombre de la tabla de access donde quiero cargar los datos de excel
    Dim strTableName As String
    strTableName = "PEDIDOS"
    
    ' Inicio excel
    Set xlApp = CreateObject("Excel.Application")
    
    ' Abro el archivo excel
    Set xlWorkbook = xlApp.Workbooks.Open(strFilePath)
    
    ' Selecciono la hoja de Excel que contiene los datos a importar
    Set xlWorksheet = xlWorkbook.Sheets("Hoja1")
    
    ' Abro la base de datos de Access
    Set db = CurrentDb
    
    ' Abro la tabla existente en modo de edición
    Set rs = db.OpenRecordset(strTableName, dbOpenDynaset)
    
    ' Importo los datos de Excel a la tabla PEDIDOS (solo quiero importar los registros que por ID clave principal son nuevos)
    rs.MoveFirst
    Do While Not rs.EOF
        ' Leer los valores de cada columna del archivo de Excel
        rs.Fields("ID").Value = xlWorksheet.Cells(rs.AbsolutePosition + 1, 1).Value 'me da error aquí de conversión de tipos y tampoco sé cómo hacer para que solo importe los registros nuevos
        rs.Fields("PRODUCTO").Value = xlWorksheet.Cells(rs.AbsolutePosition + 1, 2).Value 'si borro la columna de arriba también me sale error en esta
        rs.Fields("CANTIDAD").Value = xlWorksheet.Cells(rs.AbsolutePosition + 1, 3).Value
        rs.Fields("PRECIO").Value = xlWorksheet.Cells(rs.AbsolutePosition + 1, 4).Value
        rs.Fields("FECHA").Value = xlWorksheet.Cells(rs.AbsolutePosition + 1, 5).Value
       

        rs.MoveNext
    Loop
    
    ' Cierro lo objetos
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    
    ' Cierro el archivo excel
    xlWorkbook.Close
    Set xlWorkbook = Nothing
    xlApp.Quit
    Set xlApp = Nothing
    
    '
End Sub
Ele
Arriba
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 807
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita 01loko Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 24/Mayo/2023 a las 18:41
Creo que con esto, si no he entendido mal puedes saberlo

if dcount("id",strTableName, "id=" & xlWorksheet.Cells(rs.AbsolutePosition + 1, 1).Value )>0 then repetido

Aunque puede que este equivocado
Recordar de que soy nuevo y estoy aprendiendo.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 24/Mayo/2023 a las 22:47
Yo lo plantearía al revés porque recorrer los registros del recordset de la tabla no lo veo yo.

El bucle lo haría por la hoja de Excel y, en cada fila, buscaría el ID en el recordset de la tabla. Si no existe, se inserta.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
maxpro Ver desplegable
Colaborador
Colaborador


Unido: 04/Marzo/2006
Localización: Argentina
Estado: Sin conexión
Puntos: 1556
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita maxpro Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 25/Mayo/2023 a las 01:01
Hola.

al boleo, sin probarlo

INSERT INTO tabla_destino (campo1, campo2, ...)
SELECT campo1, campo2, ...
FROM tabla_excel
WHERE NOT EXISTS (
   SELECT 1
   FROM tabla_destino
   WHERE tabla_destino.campo_uno = tabla_excel.campo_uno
   -- Agrega otras condiciones para comparar los campos relevantes
)

-------Maxpro-------

San Luis - Argentina
Arriba
maxpro Ver desplegable
Colaborador
Colaborador


Unido: 04/Marzo/2006
Localización: Argentina
Estado: Sin conexión
Puntos: 1556
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita maxpro Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 25/Mayo/2023 a las 05:06
Hola.

probando esto dio el resultado deseado, el libro de excel debe estar vinculado en access.

INSERT INTO TuTabla ( Id, Campo2,...........)
SELECT TuHoja.Id, TuHoja.Campo2,...........
FROM TuHoja LEFT JOIN TuTabla ON TuHoja.Id = TuTabla.Id
WHERE (((TuHoja.Id) Is Not Null) AND ((TuTabla.Id) Is Null));

Saludos

EDITO: Esto lo que hace es importar los registros nuevos del libro de excel sin tocar los demas,                solamente agrega los nuevos que hayas agregado


Editado por maxpro - 25/Mayo/2023 a las 05:08
-------Maxpro-------

San Luis - Argentina
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable