Comparar 2 Arrays y Mostrar Mensaje Excel Macros

Estoy tratando de comparar 3 tablas (INGRESOS, GASTOS, ROST):

INGRESOS: es una hoja dentro del libro del formulario que tiene códigos de ingresos.

GASTOS: es una hoja dentro del libro del formulario que tiene códigos de gastos.

ROST: es una hoja que yo tengo en otro libro que cargo a mi formulario, que tiene códigos de INGRESOS Y GASTOS.

Lo que intento hacer es validar si el archivo cargado tiene todos los códigos que figuran en la tabla ingresos y gastos. Estoy con el objetivo de advertir al usuario a través de un msgbox los códigos que no se han encontrado y pueda resolverlo.

Entonces, lo que yo he hecho es capturar las columnas de los códigos de cada tabla para compararlos. Esto lo hice así, porque no se me ocurre como puedo hacer un buscarv entre 2 libros y con macros.

Básicamente, quisiera que me apoyen en el código para comparar las matrices y si falta algun datos, me muestre un mensaje con todos los códigos faltantes separados por Ingresos y Gastos.

Muchas Gracias. Aquí les dejo mi código

Private Sub btnprocesar_Click()
On Error Resume Next
Application.DisplayAlerts = False
Application.ScreenUpdating = False
'Prueba 3
Dim Anio, Mes, RutaReporte As String
Dim Ufi, Ufg As Long
Dim MatrizIngresos(), MatrizGastos(), MatrizOST() As Variant
Anio = Me.cboanio
Mes = Me.cbomes
RutaReporte = Me.txtreporte
Ufi = Sheets("INGRESOS").Range("B5").End(xlDown).Row 'Ultima Fila Tabla Ingresos
Ufg = Sheets("GASTOS").Range("B5").End(xlDown).Row 'Ultima Fila Tabla Gastos
MatrizIngresos = Sheets("INGRESOS").Range("E5:E" & Ufi) 'Definiendo mi Matriz Ingresos
MatrizGastos = Sheets("INGRESOS").Range("E5:E" & Ufg) 'Definiendo mi Matriz Gastos
If RutaReporte = "" Then
        MsgBox ("Debe Seleccionar primero el REPORTE_OST"), vbExclamation, "ADVERTENCIA"
    Exit Sub
    Else
        Workbooks.Open Filename:=RutaReporte
        RutaReporte = ActiveWorkbook.Name
        MatrizOST = Sheets("ROST").Range("A14:A430" & Ufg) 'Definiendo mi Matriz ROST
        'BuscarV Array MatrizIngresos vs MatrizOST
         '(Debo verificar si los codigos de la matrizIngresos estan en la Matriz ROST)
        'BuscarV Array MatrizGastos vs MatrizOST
         '(Debo verificar si los codigos de la matrizGastos estan en la Matriz ROST)
        'Mensaje Consolidado
         'Si se encontraron todos los codigos de Ingresos y Gastos:
            'MsgBox ("La Estructura del Reporte ROST es correcta. Se encontraron todos los codigos"), vbInformation, "VALIDACION"
         'Si NO encontraron todos los codigos de Ingresos y Gastos:
            'MsgBox ("La estructura del Reporte ROST no es correcta. Estos son los códigos no encontrados"), vbCritical, "VALIDACION"
End If
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

1 respuesta

Respuesta
2

Prueba el siguiente código.

Utiliza diccionarios para almacenar en un índice la matriz OST.

Private Sub btnprocesar_Click()
  Dim dic As Object
  Dim mIng As Variant, mGas As Variant, mOst As Variant
  Dim i As Long
  Dim cad As String
  Dim validacion As Boolean
  '
  Set dic = CreateObject("Scripting.Dictionary")
  mIng = Sheets("INGRESOS").Range("E5", Sheets("INGRESOS").Range("E" & Rows.Count).End(3)).Value
  mGas = Sheets("GASTOS").Range("E5", Sheets("GASTOS").Range("E" & Rows.Count).End(3)).Value
  mOst = Sheets("ROST").Range("A14", Sheets("ROST").Range("A" & Rows.Count).End(3)).Value
  '
  'carga los datos de OST en el diccionario
  For i = 1 To UBound(mOst)
    dic(mOst(i, 1)) = Empty
  Next
  '
  'verifica si los códigos de la matrizIngresos estan en la Matriz ROST
  cad = "Códigos de INGRESOS que no están en OST: " & vbCr
  For i = 1 To UBound(mIng)
    If Not dic.exists(mIng(i, 1)) Then
      cad = cad & mIng(i, 1) & vbCr
      validacion = True
    End If
  Next
  'verifica si los códigos de la matrizGastos estan en la Matriz ROST
  cad = cad & "Códigos de GASTOS que no están en OST: " & vbCr
  For i = 1 To UBound(mGas)
    If Not dic.exists(mGas(i, 1)) Then
      cad = cad & mGas(i, 1) & vbCr
      validacion = True
    End If
  Next
  '
  If validacion = False Then
    MsgBox "La Estructura del Reporte ROST es correcta. Se encontraron todos los codigos", vbInformation, "VALIDACION"
  Else
    MsgBox "Estos son los códigos no encontrados: " & vbCr & vbCr & cad, vbCritical, "VALIDACION"
  End If
End Sub

Aquí puedes encontrar información del Dictionary

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


[Sal u dos. No olvides la valoración.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas