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

Respuesta
2

¿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

¡Gracias Dante! Funciona perfecto!! 

:) 

Tienes algún canal en Youtube?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas