Imprimir página | Cerrar ventana

Importar hoja excel a tabla de access existente

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86699
Fecha de impresión: 23/Abril/2024 a las 10:21


Tema: Importar hoja excel a tabla de access existente
Publicado por: Elenam_80
Asunto: Importar hoja excel a tabla de access existente
Fecha de publicación: 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



Respuestas:
Publicado por: 01loko
Fecha de publicación: 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.


Publicado por: xavi
Fecha de publicación: 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

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: maxpro
Fecha de publicación: 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


Publicado por: maxpro
Fecha de publicación: 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


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

San Luis - Argentina



Imprimir página | Cerrar ventana