Buenas tardes, Me gustaría saber como hacer en macro alguna macro para que verifique todos los valores de la columna A. Si aparecen valores duplicados elimine TODA LA FILA. Espero que me puedan ayudar, he estado buscando como hacerlo y no lo he encontrado. Un saludo, y gracias
1 respuesta
Respuesta de santiagomf
1
1
santiagomf, Más de 35 años en la informática y más de 20 trabajando con...
Con este procedimiento haces lo que quieres. Un saludo Option Explicit Sub eliminaLineasDuplicadasColumnaA() ReDim matValoresA(1 To 65536) As Variant Dim nValoresA As Long Dim aux As Variant Dim i As Integer Dim nLin As Long nLin = 1 nValoresA = 0 ' Hacemos un bucle que dejará de dar vueltas cuando haya 10 celdas seguidas en ' la columna A que estén en blanco Do While Not hay10lineasEnBlanco(nLin) ' Leemos el contenido de la columna A aux = Cells(nLin, 1) ' Y lo buscamos entre los leidos hasta el momento For i = 1 To nValoresA If aux = matValoresA(i) Then Exit For Next i If i <= nValoresA Then ' El valor ya existe, tenemos que borrar la línea y probar ' de nuevo con el mismo número de línea Rows(Format$(nLin) & ":" & Format$(nLin)).Delete Else ' La celda no está repetida. Guardamos el valor y pasamos a la siguiente nValoresA = nValoresA + 1 matValoresA(nValoresA) = aux nLin = nLin + 1 End If Loop MsgBox "Proceso terminado" End Sub Private Function hay10lineasEnBlanco(ByVal nLin As Long) As Boolean ' Devuelve TRUE cuando hay 10 líneas que no tienen nada en la columna A ' y FALSE cuando alguna de las 10 líneas tiene algo hay10lineasEnBlanco = (Cells(nLin, 1) = "") And _ (Cells(nLin + 1, 1) = "") And _ (Cells(nLin + 2, 1) = "") And _ (Cells(nLin + 3, 1) = "") And _ (Cells(nLin + 4, 1) = "") And _ (Cells(nLin + 5, 1) = "") And _ (Cells(nLin + 6, 1) = "") And _ (Cells(nLin + 7, 1) = "") And _ (Cells(nLin + 8, 1) = "") And _ (Cells(nLin + 9, 1) = "") End Function
Funciona perfecto! Muchas gracias, y gracias por la rapidez. Abusando un poco más de ti me gustaría que me dijera como podría incluir ese código en la macro que ya tengo hecha. No soy capaz de integrarla sin que me de error...
Al final de tu macro, delante de la instrucción "End Sub" incluye una línea que ponga "eliminaLineasDuplicadasColumnaA".
Disculpa, tal vez no me expliqué bien. Quiero que realice la macro que tengo y que al finalizar realice esta, pero todo en la misma macro. Tal y como tu me has dicho da múltiples fallos. Si es demasiado complejo de hacer o lo que sea no importa, lo pondré en dos macros distintas, aunque ese no es el objetivo. Si es así dímelo para finalizar la pregunta. Un saludo, y muchas gracias
Si quieres añadir el código del procedimiento a otro, lo que tienes que copiar son las instrucciones que van entre 'Sub eliminaLineasDuplicadasColumnaA()' y el 'End Sub'. Estas líneas las tendrías que copiar delante de la instrucción 'End Sub' de tu procedimiento. De todas formas, pienso que lo que buscas es que no aparezca este procedimiento en la lista de macros. Si se trata de eso, es tan sencillo como poner 'Private Sub eliminaLineasDuplicadasColumnaA()' (poner la palabra private delante de la declaración). Poniendo esa palabra, el procedimiento se declara como privado y sólo es visible desde el módulo donde esté escrito. Eso sí, el código del procedimiento 'eliminaLineasDuplicadasColumnaA' y de la función 'hay10lineasEnBlanco' tendrían que estar escritos en el mismo módulo que esté tu macro. Supongo que es eso lo que quieres. Si no te queda exactamente como quieres no dudes en comentármelo y lo arreglamos (incluso si hace falta me lo envías por correo).