Excel visual basic se puede filtrar por una columna pero diciéndole que lo haga al revés? Criterial ? O un no coincidentes?

Estoy intentando hacer una consulta de No coincidentes con excel (algo así como lo que hago con Access). Pero no encuentro ningún ejemplo por ahí. Es decir, quiero que me borre de la hoja1 todos los registros que en mi columna 1 coincidan con los datos de la columna 1 de hoja2.

O por otro lado (y porque no encuentro el modo)

He pensado en hacer un filtro pero diciéndole que me filtre x columna por lo que sea "diferente a"

En vez de poner criterial:= poner criterial <>, tampoco he encontrado nada por ahí y me dice que eso no se puede hacer.

¿Alguna sugerencia?

2 respuestas

Respuesta
2

Quiero que me borre de la hoja1 todos los registros que en mi columna 1 coincidan con los datos de la columna 1 de hoja2.

La siguiente macro supone que, en ambas hojas, los registros empiezan en A2 y tienes los encabezados en la fila 1.

Realiza una prueba en una copia de tu libro.

Sub filtrar_diferentes()
  Dim b As Variant, dic As Object, i As Long
  '
  b = Sheets("Hoja2").Range("A2", Sheets("Hoja2").Range("A" & Rows.Count).End(3))
  Set dic = CreateObject("Scripting.Dictionary")
  '
  For i = 1 To UBound(b)
    dic(b(i, 1)) = Empty
  Next
  '
  With Sheets("Hoja1")
    .Range("A1").AutoFilter 1, dic.keys, Operator:=xlFilterValues
    .AutoFilter.Range.Offset(1).EntireRow.Delete
    .ShowAllData
  End With
End Sub

Me ha ido de lujo, tengo que mirar bien qué significa eso de (Scripting... es lo único que no entendí). Pero me funcionó! Como siempre, gracias por todo ;).

Scripting.Dictionary

Revisa esta documentación:

https://excelmacromastery.com/vba-dictionary/

Como siempre, me agrada ayudarte ¡G racias! Por comentar.

Hola, Dante. Estoy con esta macro, me funcionó perfecto en su día y a veces se me para en este punto:

For i = 1 To UBound(b)
   

Error 13 en tiempo de ejecución. No coinciden los tipos. La macro es tal cual la tuya. No consigo ver dónde está el error. Qué me sugieres que revise? el proceso como tal lo hace bien, aunque se pare ahí. gracias!

No Dante, no lo hace bien. No borra el registro coincidente. LO hace por la primera columna, he mirado y las celdas tienen todas el mismo formato...

Error 13 en tiempo de ejecución. No coinciden los tipos.

¿Qué modificaste en la macro? Puedes poner aquí la macro con los cambios que hiciste.



LO hace por la primera columna

Los datos empiezan en la columna A, ¿en cuál columna terminan?

Cambia la Z en .Range("A1:Z" & lr) por la columna en donde terminan.

Sub filtrar_diferentes()
  Dim b As Variant, dic As Object, i As Long, lr As Long
  '
  b = Sheets("Hoja2").Range("A2", Sheets("Hoja2").Range("A" & Rows.Count).End(3))
  Set dic = CreateObject("Scripting.Dictionary")
  '
  For i = 1 To UBound(b)
    dic(b(i, 1)) = Empty
  Next
  '
  With Sheets("Hoja1")
    lr = .Range("A" & Rows.Count).End(3).Row
    .Range("A1:Z" & lr).AutoFilter 1, dic.keys, Operator:=xlFilterValues
    .AutoFilter.Range.Offset(1).EntireRow.Delete
    .ShowAllData
  End With
End Sub

O tal vez no entendí qué necesitas. Explica con ejemplos lo que tienes en la hoja1 y en la hoja2 y pon el resultado esperado.

Es decir, debes poner 3 imágenes, hoja1 antes del proces, hoja2 y nuevamente la hoja1 con el resultado esperado.

Hola, Dante. No modifiqué nada. Pero el contenido de los registros es distinto... Aunque he comprobado la primera columna en el fichero que funciona y en el que no y el formato es el mismo... 

No pusiste las imágenes con ejemplos. Me es difícil imaginar lo que tú tienes. En mis pruebas funciona correctamente la macro.

Tal vez puedas compartir tu archivo, si tienes datos confidenciales, entonces cámbialos por datos genéricos, en las hojas me explicas qué debe suceder. Si no pones la explicación de lo que necesitas como resultado, también será difícil entender.

Y en la prueba que yo hice con los primeros ficheros también, pero hay algo en uno nuevo que me han pasado que no sé qué es... de momento no he podido saber qué problema hay en el formato y porqué me da error... pero no puedo compartir la información. Voy a cerrar el tema y tratar de investigar por otro lado. Mil gracias por todo!

Dante, te paso la solución al problema:

Archivo / Opciones / panel de la izquierda / Fórmulas y a la derecha dejar seleccionado Automático. en algunos ficheros que me pasan, en esa opción dice cálculo manual y es cuando me da error. ;). 

Me alegra saber que encontraste una solución, g racias por comentar.

Hola, Dante. Me volvió a fallar de nuevo y descubrí que el problema no está en los datos. Fue un caso puntual, el problema está cuando en la hoja por la que compara solo hay un registro, si pongo dos funciona perfecto. No sé cómo cambiarlo dentro del código y se para en 

  For i = 1 To UBound(b)

Prueba así:

Sub filtrar_diferentes()
  Dim b As Variant, dic As Object, i As Long, lr As Long
  '
  lr = Sheets("Hoja2").Range("A" & Rows.Count).End(3).Row
  If lr <= 2 Then
    MsgBox "No hay datos"
    Exit Sub
  End If
  b = Sheets("Hoja2").Range("A2", Sheets("Hoja2").Range("A" & Rows.Count).End(3))
  Set dic = CreateObject("Scripting.Dictionary")
  '
  For i = 1 To UBound(b)
    dic(b(i, 1)) = Empty
  Next
  '
  With Sheets("Hoja1")
    lr = .Range("A" & Rows.Count).End(3).Row
    .Range("A1:Z" & lr).AutoFilter 1, dic.keys, Operator:=xlFilterValues
    .AutoFilter.Range.Offset(1).EntireRow.Delete
    .ShowAllData
  End With
End Sub

Hola, Dante! 

Lo he probado y lo voy a incluir para cuando se de ese caso, el problema es que sí que hay datos en hoja2, hay un registro. Me sale ese error cuando solo hay un registro, si le meto dos, funciona perfecto.

Hola, Dante. Lo solucioné haciendo un cambio, necesito tu bendición porque no entendí muy bien si lo que hice es correcto y puede ocasionarme problemas en el futuro:

 b = Sheets("Hoja2").Range("A2", Sheets("Hoja2").Range("A" & Rows.Count).End(3))
  Set dic = CreateObject("Scripting.Dictionary")
'he sustituido A2 por A1, de esta manera funciona cuando solo hay un registro
 b = Sheets("Hoja2").Range("A1", Sheets("Hoja2").Range("A" & Rows.Count).End(3))
  Set dic = CreateObject("Scripting.Dictionary")

No le veo problema y sí te funciona, entonces no tendrás problemas.

Esa es la manera de aprender esto de la programación, a ensayo y error.

Respuesta
1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas