Exportar datos desde Excel a Access actualizando los registros o creando nuevos.

Buenas tardes, llevo un tiempo probando diferentes opciones que he visto por internet pero sigo sin encontrar la solución correcta.

Objetivo: Quiero tener una tabla de campos en una hoja excel, los cuales pueda ir exportando e importando a una Base de datos Access para actualizar la DB. He generado un código VBA para importármelos desde access y otro para exportarlos.

Tengo problemas con la Exportación, no logro que me lo actualice correctamente, estoy empezando con una tabla, pero quisiera después ampliar a/desde varias tablas de Access.

Condiciones: Mi hoja de prueba Excel se llama "Consulta", la cual tiene dos columnas "Label_Num" y "Label_Data". Se conecta con el Access "PreCIG_DB" en la misma carpeta y lo relaciona con la tabla "DatosAccess", en donde esas dos columnas se relacionan con "Acc_Num" (tipo Numero) y "Acc_Data" (tipo Texto).

Lo que quiero que haga es recorrer y comparar el Num y actualizar si ya existe el Data (en caso necesario) o añadir un item nuevo. Posteriormente haría lo mismo para una mayor cantidad de Tablas y Columnas.

Mirando por internet he alcanzado el siguiente código, dándome ahora mismo un error de variable With no establecida en el primero de ellos.

Private Sub Button_ExportAccess_Click()
Dim strArcBD As String
Dim dbDatos As DAO.Database
Dim tblNum As DAO.TableDef
Dim srtNum As DAO.Recordset
Dim strSQL As String
Dim lngNFact As Range
Dim blnNva As Boolean
Dim intInd As Integer
Dim strCampos() As String
Dim strMen As String
Dim varDato As Variant
Dim blnCorrecto As Boolean
lngNFact = Range("Label_Num")
'Si no hay valores, nada que hacer
If lngNFact = 0 Then Exit Sub
'Abre la base de datos. Si no la encuentra, sale. Lee dos subrutinas.
Set dbDatos = Abrir_BD(Carpeta & cstrBaseDatos)
If dbDatos Is Nothing Then Exit Sub
'Buscamos el registro correspondiente o crea uno nuevo
strSQL = "SELECT FROM DatosAccess WHERE =" & lngNFact
With dbDatos
Set srtNum = .OpenRecordset(strSQL)
blnNva = srtNum.RecordCount = 0
Set tblNum = .TableDefs("DatosAccess")
End With
'Creamos y rellenamos una matriz con la dirección de la celda y el nombre del campo que le corresponde
MatrizCorrespondencia strCampos
'Abrimos la tabla
Set srtNum = tblNum.OpenRecordset(dbOpenDynaset)
'Buscamos el registro. Como tiene índice utilizamos seek
[color=#008800]'[/color]Escribimos los datos en el registro o creamos uno nuevo
strMen = ""
With srtNum
.FindFirst " = " & lngNFact
If .NoMatch Then
.AddNew
Else
.Edit
End If
For intInd = 1 To UBound(strCampos, 2)
    varDato = Range(strCampos(1, intInd)).Value
    blnCorrecto = False
    With .Fields(strCampos(2, intInd))
        Select Case .Type
            Case dbText
            .Value = Left(varDato, .Size)
            blnCorrecto = True
        Case dbInteger, dbLong, dbSingle
            If IsNumeric(varDato) Then
            blnCorrecto = True
            Select Case .Type
                Case dbInteger
                    .Value = CInt(varDato)
                Case dbLong
                    .Value = CLng(varDato)
                Case dbSingle
                    .Value = CSng(varDato)
                Case Else
                    blnCorrecto = False
            End Select
            End If
        Case dbDate
            If IsDate(varDato) Then
                .Value = CDate(varDato)
                blnCorrecto = True
            End If
        End Select
    End With
If Not blnCorrecto Then _
    strMen = strMen & "Valor de la celda: " & strCampos(1, intInd) & " no correcto." & vbCrLf
Next
    .Update
End With
If strMen <> "" Then _
MsgBox "No se pudieron grabar todos los datos por: " & vbCrLf & strMen, vbExclamation, "PROBLEMA AL GRABAR"
'cerramos la base de datos
dbDatos.Close
Set srtNum = Nothing
Set tblNum = Nothing
Set dbDatos = Nothing
End Sub
  

Este es uno de los códigos que he visto y me han gustado, si creen que es mejor o más eficiente de otra forma, no duden en sugerirme otros.

Un saludo y muchisimas gracias por vuestro tiempo!!!!, llevo mucho tiempo intentando ajustarlo y probando diversas formas y no lo consigo.

Guille

Añade tu respuesta

Haz clic para o