¿Cómo borrar registros duplicados en un array VBA?

Tengo un Array “ ArrayRepuestosTodasMaquinas” formado por 7 columnas. En la columna 4 están las referencias y en la columna 5 la marca comercial de lo que son repuestos.

Quiero crear otro Array ( o hacerlo en el mismo) evitando todos aquellos registros que aparezcan duplicados por referencia y marca.

Según vemos en la imagen los que están marcados en rojo deberían desaparecer .

Estoy comenzando con los array y no se manejarme aun bien con ellos…así que todo aporte sera bien recibido.

1 Respuesta

Respuesta
3

¿Y cómo cargaste el array?


Si estás trabajando con matrices, la matriz se carga en memoria, puedes hacer un loop a la matriz y cargar en una segunda matriz los datos filtrados. Como ambas matrices están en memoria, la respuesta debe ser inmediata.

Para eliminar los duplicados, hay que crear un índice, esto se crea con un Diccionario (Scripting. Dictionary)

Por ejemplo:

Option Explicit
'
Sub test1()
'Por Dante Amor
'
'Eliminar duplicados en una matriz
'
  'declarar variables
  Dim a As Variant, b As Variant
  Dim sh As Worksheet
  Dim dic As Object
  Dim i As Long, j As Long, k As Long
  Dim llave As String
  '
  'establece en el objeto sh la hoja
  Set sh = Sheets("Hoja1")
  Set dic = CreateObject("Scripting.Dictionary")
  '
  'carga la matriz en 'a'
  a = sh.Range("A2", sh.Range("S" & Rows.Count).End(3)).Value
  'dimensionas la matriz de salida 'b', con las mismas dimensiones de la matriz 'a'
  ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2))
  '
  'recorres la matriz 'a'
  For i = 1 To UBound(a, 1)
    'las columnas en la matriz 'a' que corresponden a "P" y "Q" son: 16 y 17
    llave = a(i, 16) & "|" & a(i, 17)
    'si la llave ya existe, entonces esa fila no se agrega en la matriz 'b'
    If Not dic.exists(llave) Then
      'si la llave 16 y 17 no existe en el índice, entonces se agrega en el índice
      dic(llave) = Empty
      'y también cargas los datos en 'b'
      k = k + 1
      For j = 1 To UBound(a, 2)
        b(k, j) = a(i, j)
      Next
    End If
  Next
  'Puedes poner la salida en otra columna de la hoja
  sh.Range("BA2").Resize(k, UBound(b, 2)).Value = b
End Sub


Si quieres aprender más sobre el objeto Scripting.Dictionary:

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas