Avisar si se encuentran coincidencias en un rango
Mi pregunta es bastante sencilla, yo tengo una hoja donde busco en una hoja distinta, datos numéricos, lo que yo deseo es que si efectivamente se encontraron coincidencias se active un mensaje, ya que visualmente es una lista grande de datos dónde verificar (la búsqueda ya está lista) solo me falta el mensaje idealmente con la dirección de las celdas con datos.
1 Respuesta
¿Solamente vas a buscar un dato?
Puedes poner imágenes con ejemplos de lo que tienes en cada hoja.
Ayúdanos a ayudarte, no tengo ni idea de cómo tienes tus datos.
Desde la Fila 8 hay datos en hoja "PENDIENTES" que se comparan con los de la hoja "ANTICIPO" los cuales pueden ser coincidentes con la búsqueda que se genera en la columna k, l o m (eso ya está) lo que me hace falta es que si cualquiera de las celdas de la columna K, L, o M tiene un valor coincidente mayor a 0, se emita un mensaje e idealmente diga en cuáles celdas, ya que como se ve en imagen en las primeras filas no hay coincidencias, pero más abajo pueden haber, y son muchas filas para revisar de forma visual si hay o no coincidentes.
Pero tu ejemplo está vacío.
Revisa lo siguiente para que observes cómo debe ir un buen ejemplo:
Ya con la imagen, la utilizas de apoyo para explicar lo que tú necesitas.
Ah, y algo importante, en tu explicación mencionas 2 hojas.
Entonces pon 2 imágenes, una de cada hoja.
Y utilizas esas imágenes para explicar qué quieres.
Contra esta hoja se compara la hoja PENDIENTES
Luego de "COMPARAR" no hay resultados en las primeras filas
La primera coincidencia está en la fila 161, así como esa pueden haber resultados en cualquier fila hacía abajo, por lo que yo deseo que al encontrar dichas coincidencias (que alguna de las celdas sea mayor a 0) luego de correr la macro con el botón comparar, entonces que aparezca un mensaje, y me aparezca idealmente o las celdas donde está la coincidencia, o bien me diga la cantidad de coincidencias.
La búsqueda en este momento está de este modo:
Private Sub CommandButton1_Click() Range("K8").FormulaR1C1 = _ "=IFNA(IF(RC[-4]>0,VLOOKUP(RC[-4],'ANTICIPO DE CLIENTES'!R14C7:R5022C9,3,FALSE),""""),"""")" Range("K8").AutoFill Destination:=Range("K8:K5000"), Type:=xlFillDefault Range("L8").FormulaR1C1 = _ "=IFNA(IF(RC[-4]>0,VLOOKUP(RC[-4],'ANTICIPO DE CLIENTES'!R14C6:R5023C9,4,FALSE),""""),"""")" Range("L8").AutoFill Destination:=Range("L8:L5000"), Type:=xlFillDefault Range("M8").FormulaR1C1 = _ "=IFNA(IF(RC[-5]<>RC[-4],VLOOKUP(RC[-4],'ANTICIPO DE CLIENTES'!R14C7:R[5010]C9,3,FALSE),""""),"""")" Range("M8").AutoFill Destination:=Range("M8:M5000"), Type:=xlFillDefault Call Texto End Sub
De acuerdo, ya pusiste las imágenes con datos.
Ahora explícame:
¿Cuándo es coincidencia?
Estoy tratando de entender...
Si el débito de la hoja PENDIENTE, existe en la columna de crédito de la hoja ANTICIPO DE CLIENTES
o
Si el crédito de la hoja PENDIENTE existe en la columna de débito de la hoja ANTICIPO DE CLIENTES
¿Entonces eso para ti es una coincidencia?
¿Ya no te interesa la fecha?
Preparo una macro y la pongo aquí.
Prueba la siguiente macro, los resultados con los números-INT los pone en la hoja "pendiente" en las columnas K y L.
Si existe más de una coincidencia, entonces te pone los números-INT separados por una coma.
Sub Comparar() Dim sh1 As Worksheet, sh2 As Worksheet Dim a As Variant, b As Variant, c As Variant Dim i As Long, u2 As Long Dim deb As Object, cre As Object ' Set sh1 = Sheets("PENDIENTE") Set sh2 = Sheets("ANTICIPO DE CLIENTES") Set deb = CreateObject("Scripting.Dictionary") Set cre = CreateObject("Scripting.Dictionary") ' a = sh1.Range("G8", sh1.Range("H" & Rows.Count).End(3)).Value2 u2 = sh2.Range("F" & Rows.Count).End(3).Row b = sh2.Range("F14:I" & u2).Value2 ReDim c(1 To UBound(a, 1), 1 To 2) ' 'Lee los datos de la hoja Anticipo For i = 1 To UBound(b, 1) 'llena los débitos, con sus correspondiente num-int If b(i, 1) <> 0 Then deb(b(i, 1)) = deb(b(i, 1)) & ", " & b(i, 4) End If 'llena los créditos, con sus correspondiente num-int If b(i, 2) <> 0 Then cre(b(i, 2)) = cre(b(i, 2)) & ", " & b(i, 4) End If Next ' For i = 1 To UBound(a, 1) If a(i, 1) <> 0 Then 'busca el débito de pendiente en los créditos de clientes If cre.exists(a(i, 1)) Then c(i, 1) = Mid(cre(a(i, 1)), 3) End If Else 'busca el crédito de pendiente en los débitos de clientes If deb.exists(a(i, 2)) Then c(i, 2) = Mid(deb(a(i, 2)), 3) End If End If Next sh1.Range("K8").Resize(UBound(c, 1), 2).Value = c End Sub
Que genial Dante ¡gracias!, intentaré replicar lo mismo para la búsqueda en la columna M, que busca según el saldo (columna I, que puede no ser igual al débito) en ese caso es saldo contra créditos de la hoja ANTICIPO DE CLIENTES, lo que mencionabas de la fecha en este caso es más diferencia de tiempo porque puede que un anticipo tenga hasta 2 meses de diferencia con la fecha de factura, o de un año, si el anticipo es de los últimos meses de un año.
Lo que aún me faltaría así como de quisquillosa, es el MsgBox de que se encontraron coincidencias, por ejemplo si hay alguna en la columna K, es que entonces hay coincidencias de anticipos y facturas, si hay coincidencias en la columna L, entonces hay coincidencias entre anticipos y NC, y finalmente si hubieran coincidencias en la columna M, entonces existen coincidencias entre los anticipos y saldos de facturas.
También se me ocurre un cuadro combinado como para además de saber las coincidencias muestre un tipo listado, entonces si no hay, pues no pierdo tiempo viendo todaaaa la hoja de pendientes.
:)
¿Y cómo quieres tu msgbox, quieres un msgbox por cada coincidencia, es decir, si existen 100 coincidencias, la macro se va a detener 100 veces?
¿O cómo quieres el msgbox?
Prueba la siguiente macro.
Busca el débito en créditos (clientes), resultado en K
Busca el crédito en débitos (clientes), resultado en L
Y busca el saldo en créditos (clientes), resultado en M
Sub Comparar() Dim sh1 As Worksheet, sh2 As Worksheet Dim a As Variant, b As Variant, c As Variant Dim i As Long, u2 As Long Dim deb As Object, cre As Object Dim cad As String ' Set sh1 = Sheets("PENDIENTE") Set sh2 = Sheets("ANTICIPO DE CLIENTES") Set deb = CreateObject("Scripting.Dictionary") Set cre = CreateObject("Scripting.Dictionary") ' 'carga en a(), las columnas: G(debitos), H(creditos), I(saldos) a = sh1.Range("G8", sh1.Range("I" & Rows.Count).End(3)).Value2 u2 = sh2.Range("F" & Rows.Count).End(3).Row 'carga en b(), cols: F(debitos, G(creditos), H(saldos), I(num-int) b = sh2.Range("F14:I" & u2).Value2 ReDim c(1 To UBound(a, 1), 1 To 3) ' 'Lee los datos de la hoja Anticipo For i = 1 To UBound(b, 1) 'llena los débitos, con sus correspondiente num-int If b(i, 1) <> 0 Then deb(b(i, 1)) = deb(b(i, 1)) & ", " & b(i, 4) End If 'llena los créditos, con sus correspondiente num-int If b(i, 2) <> 0 Then cre(b(i, 2)) = cre(b(i, 2)) & ", " & b(i, 4) End If Next ' For i = 1 To UBound(a, 1) 'busca el débito de pendiente en los créditos de clientes If a(i, 1) <> 0 Then If cre.exists(a(i, 1)) Then c(i, 1) = Mid(cre(a(i, 1)), 3) End If End If 'busca el crédito de pendiente en los débitos de clientes If a(i, 2) <> 0 Then If deb.exists(a(i, 2)) Then c(i, 2) = Mid(deb(a(i, 2)), 3) End If End If 'busca el saldo de pendiente en los créditos de clientes If a(i, 3) <> 0 Then If cre.exists(a(i, 3)) Then c(i, 3) = Mid(cre(a(i, 3)), 3) End If End If Next sh1.Range("K8").Resize(UBound(c, 1), 3).Value = c End Sub
No por coincidencia no, por lo mismo que mencionas, yo creo bien 1 si existe alguna coincidencia, o bien un cuadro combinado que emule un MsgBox y me dé un resumen en caso de que se pueda hacer eso.
Pero en las columnas K, L y M ya tienes el dato si existió una coincidencia.
Si filtras la columna K, L o M por diferente de vacíos, te dará las coincidencias.
¿Ya probaste la nueva macro?
No sé a qué te refieres con esto:
o bien un cuadro combinado que emule un MsgBox y me dé un resumen en caso de que se pueda hacer eso
Debes ser más específica con lo que pides, debes poner ejemplos prácticos y explícitos de lo que quieres. Decir solamente "quiero un mensaje" no ayuda en nada.
Prueba la macro y revisa los resultados y dime si es lo que quieres como coincidencias.
Revisa la siguiente macro comparar_v1, le agregué en msgbox, haber qué te parece. Al final de mi respuesta está el botón para valorar.
Sub Comparar_v1() Dim sh1 As Worksheet, sh2 As Worksheet Dim a As Variant, b As Variant, c As Variant Dim i As Long, u2 As Long Dim deb As Object, cre As Object Dim cad1 As String, cad2 As String, cad3 As String Dim fila As Long ' Set sh1 = Sheets("PENDIENTE") Set sh2 = Sheets("ANTICIPO DE CLIENTES") Set deb = CreateObject("Scripting.Dictionary") Set cre = CreateObject("Scripting.Dictionary") ' 'carga en a(), las columnas: G(debitos), H(creditos), I(saldos) a = sh1.Range("G8", sh1.Range("I" & Rows.Count).End(3)).Value2 fila = 14 u2 = sh2.Range("F" & Rows.Count).End(3).Row 'carga en b(), cols: F(debitos, G(creditos), H(saldos), I(num-int) b = sh2.Range("F" & fila & ":I" & u2).Value2 ReDim c(1 To UBound(a, 1), 1 To 3) ' 'Lee los datos de la hoja Anticipo For i = 1 To UBound(b, 1) 'llena los débitos, con sus correspondiente num-int If b(i, 1) <> 0 Then deb(b(i, 1)) = deb(b(i, 1)) & ", " & b(i, 4) End If 'llena los créditos, con sus correspondiente num-int If b(i, 2) <> 0 Then cre(b(i, 2)) = cre(b(i, 2)) & ", " & b(i, 4) End If Next ' For i = 1 To UBound(a, 1) 'busca el débito de pendiente en los créditos de clientes If a(i, 1) <> 0 Then If cre.exists(a(i, 1)) Then c(i, 1) = Mid(cre(a(i, 1)), 3) cad1 = cad1 & ", " & i + fila End If End If 'busca el crédito de pendiente en los débitos de clientes If a(i, 2) <> 0 Then If deb.exists(a(i, 2)) Then c(i, 2) = Mid(deb(a(i, 2)), 3) cad2 = cad2 & ", " & i + fila End If End If 'busca el saldo de pendiente en los créditos de clientes If a(i, 3) <> 0 Then If cre.exists(a(i, 3)) Then c(i, 3) = Mid(cre(a(i, 3)), 3) cad3 = cad3 & ", " & i + fila End If End If Next sh1.Range("K8").Resize(UBound(c, 1), 3).Value = c MsgBox "Débitos coincidentes en las filas : " & cad1 & vbCr & _ "Créditos coincidentes en las filas: " & cad2 & vbCr & _ "Saldos coincidentes en las filas : " & cad3 End Sub
- Compartir respuesta