Excel VBA - Range inlezen in array en sorteren

Status
Niet open voor verdere reacties.

mrbombastic

Gebruiker
Lid geworden
19 feb 2003
Berichten
38
Ik wil het percentiel van een bereik goed bepalen, dus niet met de functie percentiel.
Hiervoor moet ik een dataset sorteren (in VBA, ik wil de oorspronkelijke volgorde aanhouden in Excel).
Dit lukt echter niet.

Ik heb de volgende voorbeelcode.
Code:
Sub Main()
   Dim myArray(4) As Variant
    
   myArray(0) = 9
   myArray(1) = 11
   myArray(2) = 7
   myArray(3) = 4
   
   Call QSort(myArray, 0, 3)

   Range("A1:A4") = Application.WorksheetFunction.Transpose(myArray)

End Sub

Sub QSort(sortArray() As Variant, ByVal leftIndex As Integer, ByVal rightIndex As Integer)
    Dim compValue As Double
    Dim I As Integer
    Dim J As Integer
    Dim tempNum As Double
    
    I = leftIndex
    J = rightIndex
    compValue = sortArray(Int((I + J) / 2))

    Do
        Do While (sortArray(I) < compValue And I < rightIndex)
            I = I + 1
        Loop
        Do While (compValue < sortArray(J) And J > leftIndex)
            J = J - 1
        Loop
        If I <= J Then
            tempNum = sortArray(I)
            sortArray(I) = sortArray(J)
            sortArray(J) = tempNum
            I = I + 1
            J = J - 1
        End If
    Loop While I <= J

    If leftIndex < J Then QSort sortArray(), leftIndex, J
    If I < rightIndex Then QSort sortArray(), I, rightIndex
End Sub

Nu wil ik het eerste stukje code aanpassen in
Code:
Sub Main()
   Dim myArray(4) As Variant
   
   myArray = Range("C1:C4").Value
...

Dan krijg ik echter de foutmelding. Compileerfout: toewijzen aan een matrix is niet mogelijk.

En als ik de code aanpas in
Code:
Sub Main()
   Dim myArray As Variant
   
   myArray = Range("C1:C4").Value
...
dan krijg ik een andere foutmelding. Typen komen niet overeen. Er wordt een matrix of door de gebruiker gedefinieerd type verwacht.
 
Code:
Private Sub tst()

Dim MyArr   As Variant

    MyArr = Range("C1:C4").Value
    
End Sub
Werkt perfect bij mij hoor.

Wanneer je de array wil uitlezen moet je wel steeds een 2D array zien.

Stel dat je het 2de element wil toewijzen aan een variabel "MyVar"
dan werkt volgende code perfect :
Code:
MyVar= MyArr(2,1)
maar deze code werkt NIET :
Code:
MyVar= MyArr(2)
Is je 2de foutmelding hier niet aan te wijten??
 
Eigenlijk wil ik dit doen. Ik snap alleen niet helemaal waarom ik niet rechtstreeks inArray kan meegeven aan QSort.

Code:
Function matlabPercentile(inArray As Variant, percentile As Double)
    Dim myArray() As Variant
    Dim n As Integer
    n = inArray.Rows.Count
    ReDim myArray(n)
   
    For ii = 1 To n
        myArray(ii) = inArray(ii)
    Next ii
   
    Call QSort(myArray, 1, n)
 
In je voorbeeld code van post #1 is MyArray een 1D array.
In je aangepaste code van post #1 is MyArray een 2D array.
En QSort verwacht waarschijnlijk een 1D array.
Daarom lukt het met de voorbeeldcode maar niet met je aangepaste code.
 
Laatst bewerkt:
Code:
Function Main(inArray As Range)
    Dim myArray(), n As Integer
    n = inArray.Rows.Count
    ReDim myArray(n)
   
    For ii = 0 To n - 1
        myArray(ii) = inArray(ii + 1)
    Next ii
   
    Call QSort(myArray, 0, n - 1)

    Main = Application.WorksheetFunction.Transpose(myArray)

End Function

Sub tst()
    Range("a1:a4") = Main(Range("c1:c4"))
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan