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