es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminar filas duplicadas en una matriz 2D en VBA

Encontré en stackoverflow algún código que traté de adaptar a mis necesidades, pero con el clásico error 9. Este error (Subíndice fuera del intervalo) apareció después del segundo bucle en la línea “Dim Preserve” con dupArrIndex = 2. No entiendo realmente por qué.

El código hasta ahora:

Function RemoveDuplicate(ByRef poArr As Variant) As Variant
Dim poArrNoDup() As Variant
Dim dupArrIndex As Integer
Dim i As Integer
Dim j As Integer
Dim dupBool As Boolean
dupArrIndex = 0 '-1
For i = LBound(poArr) To UBound(poArr)
    dupBool = False
    For j = LBound(poArr) To i
        If poArr(i, 1) = poArr(j, 1) And Not i = j Then
            dupBool = True
            Exit For
        End If
    Next j
    If dupBool = False Then
        dupArrIndex = dupArrIndex + 1
        ReDim Preserve poArrNoDup(1 To dupArrIndex, 1 To 5)
        poArrNoDup(dupArrIndex, 1) = poArr(i, 1)
        poArrNoDup(dupArrIndex, 2) = poArr(i, 2)
        poArrNoDup(dupArrIndex, 3) = poArr(i, 3)
        poArrNoDup(dupArrIndex, 4) = poArr(i, 4)
        poArrNoDup(dupArrIndex, 5) = poArr(i, 5)
    End If
Next i
RemoveDuplicate = poArrNoDup
End Function

Lo que quiero lograr es obtener:

arr(1,1) = aaa
arr(1,2) = asdee
arr(1,3) = qwere
arr(2,1) = bbb
arr(2,2) = ghy
arr(2,3) = rfghdf

En otras palabras, eliminar las filas idénticas en una matriz 2D (dimensiones (x,5)).

Gracias – JLuc01

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el error está relacionado con el hecho de que la variable dupArrIndex se establece inicialmente en 0, pero debería establecerse en -1 para poder agregar correctamente el primer elemento al arreglo poArrNoDup. Además, el bucle interno debería comenzar en j = LBound(poArr) + 1 para evitar comparar el mismo elemento consigo mismo.

    Aquí tienes el código corregido:

    Function RemoveDuplicate(ByRef poArr As Variant) As Variant
        Dim poArrNoDup() As Variant
        Dim dupArrIndex As Integer
        Dim i As Integer
        Dim j As Integer
        Dim dupBool As Boolean
        dupArrIndex = -1 ' corrección: debería comenzar en -1
        For i = LBound(poArr) To UBound(poArr)
            dupBool = False
            For j = LBound(poArr) + 1 To i ' corrección: comenzar en j = LBound(poArr) + 1
                If poArr(i, 1) = poArr(j, 1) And Not i = j Then
                    dupBool = True
                    Exit For
                End If
            Next j
            If dupBool = False Then
                dupArrIndex = dupArrIndex + 1
                ReDim Preserve poArrNoDup(1 To dupArrIndex + 1, 1 To 5) ' agregar + 1 al tamaño del arreglo
                poArrNoDup(dupArrIndex, 1) = poArr(i, 1)
                poArrNoDup(dupArrIndex, 2) = poArr(i, 2)
                poArrNoDup(dupArrIndex, 3) = poArr(i, 3)
                poArrNoDup(dupArrIndex, 4) = poArr(i, 4)
                poArrNoDup(dupArrIndex, 5) = poArr(i, 5)
            End If
        Next i
        RemoveDuplicate = poArrNoDup
    End Function
    

    Nota: podría ser más eficiente utilizar un objeto diccionario para almacenar los elementos únicos en lugar de una matriz bidimensional.

Comments are closed.