En la entrada anterior hemos comprobado como podemos añadir registros a nuestra base de datos de Access desde Excel, usando VBA y ADO: AÑADIR REGISTROS EN ACCESS DESDE EXCEL CON VBA.
Hoy vamos tratar la manera de eliminar registros en Access desde Excel utilizando la misma técnica. Si tomamos como referencia el ejemplo anterior donde habíamos añadido a nuestra base de datos 3 registros nuevos (en rojo).
Ahora debemos buscar la forma de eliminarlos usando una macro similar a la anterior, pero antes, para proceder al borrado, necesitamos tener la información que vamos a borrar en nuestra hoja Excel, así:
Y ahora procedemos a escribir este código en nuestro editor de VBA:
Sub DeleteAccess()
Dim conAccess As ADODB.Connection
Dim Destino As String
Dim conExcel As String, obSQL As String
Dim Origen As String
Dim i As Double
'Nombramos las tablas con las que vamos a trabajar
Destino = "[TRABAJADORES]"
Origen = "[EMPLEADOS$]"
Fin = Application.CountA(Range("A:A"))
'iniciamos un bucle que recorra la hoja Empleados (columna A) cada registro que queremos eliminar
For i = 2 To Fin
'Indicamos la conexión Excel
conExcel = "[Excel 8.0;HDR=Yes;DATABASE=F:\COMPAÑIA.xls]." & Origen
'construimos la sentencia SQL, que eliminará cada registro indicado en la variable "i"
obSQL = "DELETE * FROM " & Destino & " WHERE " & Destino & ".Id = " & Cells(i, 1)
'Conectamos con la base de datos de Access y eliminamos
Set conAccess = New ADODB.Connection
With conAccess
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=F:\EMPRESA.accdb;"
.Open
.Execute obSQL
.Close
End With
'iniciamos siguiente bucle
Next i
End Sub
A diferencia de la macro que añadía registros, en esta ocasión he tenido que incorporar un bucle, el motivo es que para eliminar un registro, debemos especificar de cual se trata, en este caso es un Id, pero si se trata de varios no nos serviría el “Where”, a no ser que hagamos referencia a una variable en bucle, de modo que por cada ciclo, identificará el registro a eliminar desde nuestra hoja de excel.
Si solo vais a eliminar un registro, bastaría con que hicieseis referencia a un celda (donde estaría el Id a eliminar) y podríais eliminar el bucle. Pero como creo que lo más normal es que se se tengan que eliminar varios registros, el ejemplo será con bucle.
Una vez que ejecutamos la macro, los registros elegidos se eliminarán
Por último, para la macro funcione, una vez insertada la macro nuestro editor de VBA debéis marcar en la biblioteca de referencias: Microsoft ActiveX Data Objects 2.8 Library
Y con esto ya tenemos nuestra macro para eliminar registros en Access desde Excel 🙂
Descarga el archivo de ejemplo pulsando en: ELIMINAR REGISTROS EN ACCESS DESDE EXCEL CON VBA
Pingback: AÑADIR REGISTROS EN ACCESS DESDE EXCEL CON VBA | Excel Signum
Lo felicito por la explicación y los ejercicios que podemos descargar para ver como funcionan las macros de excel con access, soy nuevo en es programación de excel con access y me gustaria seguir aprendiendo, por ejemplo: que los EMPLEADOS de la hoja en excel se puedan borran con el mismo boton al momento de guardar y mantener un correlativo constante para seguir ingresando empleados en el caso que fuera uno o diez, y por otro lado que el boton ELIMINAR que pueda eliminar el empleado que se digite en la hoja excel y no solamente los ultimos que ingresamos. De antemano muchas gracias una vez mas por lo que enseña.
Saludos
Me gustaMe gusta
Hola Manuel:
Me alegro que te resulte útil la web. Sobre lo que me comentas, la macro eliminará cualquier empleado que se indique en el excel y con el mismo ID que tenga en la base de datos. Esto lo puedes ver en la secuencia SQL:
obSQL = “DELETE * FROM ” & Destino & ” WHERE ” & Destino & “.Id = ” & Cells(i, 1)
Es decir,que si el ID es el del primer empleado, lo eliminará, no solo los últimos.
Sobre lo primero, quizás te sea de mayor utilidad este post, donde precisamente comento la informa de ingresar datos desde Excel a access:
https://excelsignum.com/2016/07/08/anadir-registros-en-access-desde-excel-con-vba/comment-page-1/#comment-1521
Lee detenidamente este último post, es concretamente lo que necesitas.
Saludos.
Me gustaMe gusta
Entonces la secuencia de SQL solo me elimina la cantidad de empleados que tenga agregados en la hoja de excel, pero para borrarlos de la hoja de excel de forma automatica tengo que crear otra macro o puedo agregar alguna secuencia dentro de la macro InsertAccess , o lo debo hacer de forma manual?
Puedo agregar una secuencia a la macro InsertAccess para que el id correlativo sea de forma automatica en access y no sea necesario agregarlo cada vez que ingreso un empleado en la hoja excel?
De antemano gracias
Saludos
Me gustaMe gusta
Hola Manuel:
Claro que puedes incorporar una línea de código para eliminar los datos que tengas en la hoja, algo tipo:
with sheets(1)
Final = .Range(“A” & Rows.Count).End(xlUp).Row
.Range(“A2:F” & Final + 2).Clear
End with
y lo sitúas al finalizar la macro.
Sobre el ID y que sea correlativo tengo que estudiarlo con detenimiento.
Otra alternativa es que exportes a Access la tabla completa directamente
https://excelsignum.com/2016/03/31/exportar-datos-de-excel-a-access-mediante-ado/
Y cuando necesites incorporar un empleado y que sea correlativo
importas el Access:
https://excelsignum.com/2016/12/09/exportar-una-tabla-o-consulta-de-access-a-excel-con-ado/
Saludos
Me gustaMe gusta
Muchas gracias por la ayuda, me podrías indicar como poder dejar un valor negativo en una consulta de acces, ya que estoy creando un balance y cuando resto el DEBE con el HABER en la columna DEUDOR hay valores que me dan negativo, pero esos valores negativos me gustaría que me los dejara en 0, he tratado de agregar varias formulas en la linea de criterio pero no me las acepta. Ej:
DEBE 80
HABER 100
DEUDOR -20
De antemano gracias
Me gustaMe gusta
Hola Manuel, eso que me comentas ya es parte de Access y yo programo en Excel. Una macro que te convierta lo valores negativos de una tabla de access en 0.
En excel sería o bien realizar un condición en formato condicional, o mediante programación, con un loop que recorra todos los valores y cuando sean menores que 0, los convierta en 0.
Saludos.
Me gustaMe gusta