Como opera la lógica en esta súper macro?

En días pasados le diste una respuesta a un usuario, que la encuentro súper genial, ya que navegando por la web no había encontrado algo tan funcional para la vida real en nuestros trabajos, siempre lo que he encontrado había sido cosas como resaltar datos idénticos o cosas similares.

Comparar dos listas y generar un listado único?

Hasta donde he visto se crean dos variables a y b para las listas a comparar, pero luego me pierdo en el uso del objeto diccionary al hacer uso de los "|" & "0"

 'PROCESO
  For i = 1 To UBound(a, 1)
    dic(a(i, 1)) = a(i, 2) & "|" & 0 & "|" & a(i, 2)
  Next i
  For i = 1 To UBound(b, 1)
    If dic.exists(b(i, 1)) Then
      v1 = Split(dic(b(i, 1)), "|")(0)
      v2 = b(i, 2)
      v3 = v1 - v2
      dic(b(i, 1)) = v1 & "|" & v2 & "|" & v3
    Else
      dic(b(i, 1)) = 0 & "|" & b(i, 2) & "|" & -b(i, 2)
    End If

Sería mucho abusar de su genorisidad y me da unas luces su proceso, para aumentar el conocimiento en vba.

1 respuesta

Respuesta
2

Con todo gusto, te anexo una breve explicación:

 'PROCESO
  'recorre cada uno de los elementos del arreglo 'a'
  For i = 1 To UBound(a, 1)
    'almacena en un diccionario. Pone como llave el ID
 'y "dentro" de la llave almacena el item, el item está formado por:
    '(prepara la salida del resultado, en cual contiene, valor1, valor2 y diferencia
    'el valor de la lista1, 0 (cero) porque en este punto el valor2 todavía no lee
    'el valor2, por eso pone un 0 y por último la diferencia de valor1 - 0 = valor1
    'por eso se repite el valor1
    dic(a(i, 1)) = a(i, 2) & "|" & 0 & "|" & a(i, 2)
  Next i
  '
  'recorre cada uno de los elementos del arreglo 'b'
  For i = 1 To UBound(b, 1)
    'revisa en el índice 'dic' si existe el ID de la lista2.
    If dic.exists(b(i, 1)) Then
      'si existe, entonces con Split obtiene el valor1
      v1 = Split(dic(b(i, 1)), "|")(0)
      'v2 es el valor2 de la lista2
      v2 = b(i, 2)
      'v3 es la diferencia de v1 - v2
      v3 = v1 - v2
      'almacena en la misma llave el valor1, el valor2 y la diferencia
      dic(b(i, 1)) = v1 & "|" & v2 & "|" & v3
    Else
      'si no existe, entonces almacena en el dicionario
 'el ID de la lista2, un cero como valor1 (porque no existe el ID en la lista1)
      'el valor2 y la diferencia es 0 - valor2 por eso es -valor2
      dic(b(i, 1)) = 0 & "|" & b(i, 2) & "|" & -b(i, 2)
    End If
  Next i

¡Gracias! 

Voy a practicar para ponerlo en práctica con unos procesos que hago y si me atasco espero como contar con su ayuda.  Mil gracias a todos y a la existencia de esta página.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas