Manipulando una matriz en Access

Tengo un conjunto de valores numéricos como una matriz, así

100,120,0,100,90 etc

También tengo una variable entera n

Tengo que contar los ceros en la matriz y reemplazar el menor distinto de cero (primera aparición) con un cero, hasta que el recuento de ceros = n

Entonces, dados los datos anteriores, y un n = 3, terminaría con

 0,120,0,100,0 etc

Necesito luego sumar los valores.

No estoy familiarizado con las matrices Access vba, y parece que no hay muchas funciones de manipulación de matrices integradas. ¿Hay alguno capaz de ayudar?

preguntado el 12 de junio de 12 a las 21:06

Solo por curiosidad, ¿por qué usar una matriz en MS Access cuando tiene tablas en las que este tipo de cosas es pan comido? -

Remou - ¿Te refieres a la creación de tablas temporales? Y no, los números no pueden ser negativos.

@HansUp, la matriz puede contener cualquier cantidad de elementos, incluso ninguno:

1 Respuestas

Ordene su matriz Luego recorra su matriz comenzando en N para obtener un total acumulado.

La cosa es que no tienes que convertir los valores más bajos a cero. Todo lo que tiene que hacer es excluirlo de la suma, por lo tanto, comienza su total acumulado en N (suponiendo una matriz basada en 0).

Al leer los comentarios, modifiqué mi respuesta para tratar con matrices vacías y tamaños de matriz inferiores a N.

Function ArrayTotal(MyArray() As Long, N As Long)
    Dim Idx As Long
    Dim Total As Long

    On Error Resume Next
    Idx = UBound(MyArray)
    If Err.Number <> 9 Then
        QuickSort1 MyArray
        If N < UBound(MyArray) Then
            For Idx = N To UBound(MyArray)
                Total = Total + MyArray(Idx)
            Next Idx
        End If
    End If
    ArrayTotal = Total
End Function

' Omit plngLeft & plngRight; they are used internally during recursion
Public Sub QuickSort1(ByRef pvarArray As Variant, Optional ByVal plngLeft As Long, Optional ByVal plngRight As Long)
    Dim lngFirst As Long
    Dim lngLast As Long
    Dim varMid As Variant
    Dim varSwap As Variant

    If plngRight = 0 Then
        plngLeft = LBound(pvarArray)
        plngRight = UBound(pvarArray)
    End If
    lngFirst = plngLeft
    lngLast = plngRight
    varMid = pvarArray((plngLeft + plngRight) \ 2)
    Do
        Do While pvarArray(lngFirst) < varMid And lngFirst < plngRight
            lngFirst = lngFirst + 1
        Loop
        Do While varMid < pvarArray(lngLast) And lngLast > plngLeft
            lngLast = lngLast - 1
        Loop
        If lngFirst <= lngLast Then
            varSwap = pvarArray(lngFirst)
            pvarArray(lngFirst) = pvarArray(lngLast)
            pvarArray(lngLast) = varSwap
            lngFirst = lngFirst + 1
            lngLast = lngLast - 1
        End If
    Loop Until lngFirst > lngLast
    If plngLeft < lngLast Then QuickSort1 pvarArray, plngLeft, lngLast
    If lngFirst < plngRight Then QuickSort1 pvarArray, lngFirst, plngRight
End Sub

Respondido el 17 de junio de 12 a las 15:06

No estoy seguro. Encontré este ejemplo de prueba cuando la matriz está vacía. Lo agregué cuando vi en los comentarios que la matriz puede estar vacía. - Tom Collins

Estás bien. Idx = UBound(MyArray) debería estar después de If Err.Number... No probé este código con una matriz vacía. - Tom Collins

He estado trabajando en un gran proyecto y no he tenido mucho tiempo para entrar aquí. Probé y corregí el código esta mañana. Usted tenía razón. No tengo idea de por qué la persona de la que copié la línea de prueba err estaba probando contra 0, lo que significa que no hay error. Debí haberlo notado de inmediato. El código debería funcionar ahora. - Tom Collins

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.