Hallöchen Forum,
Ich habe auf einer Form ein FlexGrid mit max. 10 beschriebenen Spalten.
In der untersten Zeile stehen jeweils Zahlenwerte von 0 bis max 50, die ich nun in eine Rangfolge bringen möchte, wobei bei gleichen Werten auch der gleiche Rang vergeben werden soll, dafür der nächste übersprungen wird (also wie beim Sport in PktTabellen)
Ich habe schon gegoogelt, aber keine passenden Hinweise gefunden, in excel gibts sowas ja mit der RANG-Funktion, ich hab aber kein Ahnung, wie man sowas in VB umsetzt 
Vlt kann mir ja jemand helfen…
lg Micha
Hallo,
In der untersten Zeile stehen jeweils Zahlenwerte von 0 bis
max 50, die ich nun in eine Rangfolge bringen möchte, wobei
bei gleichen Werten auch der gleiche Rang vergeben werden
soll, dafür der nächste übersprungen wird (also wie beim Sport
in PktTabellen)
OK. Und wo soll der Rang hin? In einem Array gemerkt, im Flexgrid angezeigt? Als Überschrift z.B.? Sollen die Daten dann entsprechend dem Rang sortiert werden?
Ich habe schon gegoogelt, aber keine passenden Hinweise
gefunden, in excel gibts sowas ja mit der RANG-Funktion, ich
hab aber kein Ahnung, wie man sowas in VB umsetzt 
In VB kenne ich eine solche Funktion ‚Rang‘ nicht. Das wird man selbst machen müssen. Aber das ist ja kein Problem. Mit der Funktion ‚Quicksort‘ geht das recht schnell.
Gruß Rainer
Hallo Rainer,
Danke für die schnelle Antwort.
Die Platzierung würde ich (nicht wie oben erwähnt) in einer Zeile unterhalb der Werte ablegen, jede Platzierung also unterhalb des dazugehörigen Wertes. Hast Du evtl mal ein Beispiel, wie man Quicksort für eine flexgrid-zeile anwenden kann?
Das Problem ist, das nicht immer alle 10 Spalten gefüllt sind, also mitunter auch nur 4 oder 6…
lg Micha
Hallo,
Hast Du evtl mal ein Beispiel, wie man Quicksort für eine
flexgrid-zeile anwenden kann?
kein Problem. Ich habe mal schnell etwas zusammengebaut und getestet, läuft.
Option Explicit
Private Sub Command1\_Click()
Dim i As Integer
'sortieren
QuickSort 0, 9
'Rang ermitteln und eintragen
MSFlexGrid1.TextMatrix(2, 0) = 1
For i = 1 To 9
If MSFlexGrid1.TextMatrix(1, i - 1) = MSFlexGrid1.TextMatrix(1, i) Then
MSFlexGrid1.TextMatrix(2, i) = MSFlexGrid1.TextMatrix(2, i - 1)
Else
MSFlexGrid1.TextMatrix(2, i) = i + 1
End If
Next
End Sub
Private Sub QuickSort(ByVal LB As Long, ByVal UB As Long)
Dim P1 As Long, P2 As Long, Ref As Integer, TEMP As String, i As Integer
P1 = LB
P2 = UB
Ref = MSFlexGrid1.TextMatrix(1, ((P1 + P2) / 2))
Do
Do While MSFlexGrid1.TextMatrix(1, P1) Ref
P2 = P2 - 1
Loop
If P1 P2)
If LB
> Das Problem ist, das nicht immer alle 10 Spalten gefüllt sind,
> also mitunter auch nur 4 oder 6...
Die leeren stehen dann vorn. :smile:
Die aber vor dem Eintragen des Rangs nach hinten zu schieben, falls das gewünscht ist, bekommst Du selbst hin?
Gruß Rainer
Nachtrag
Hallo,
nun sind im Beispiel auch leere Felder, die nach hinten geschoben werden …
Gruß Rainer
Option Explicit
Private Sub Command1\_Click()
Dim i As Integer
'sortieren
For i = 0 To MSFlexGrid1.Cols - 1
If Trim(MSFlexGrid1.TextMatrix(1, i)) = "" Then
MSFlexGrid1.TextMatrix(1, i) = "99"
End If
Next
QuickSort 0, 9
'Range ermitteln und eintragen
MSFlexGrid1.TextMatrix(2, 0) = 1
For i = 1 To 9
If MSFlexGrid1.TextMatrix(1, i - 1) = MSFlexGrid1.TextMatrix(1, i) Then
MSFlexGrid1.TextMatrix(2, i) = MSFlexGrid1.TextMatrix(2, i - 1)
Else
MSFlexGrid1.TextMatrix(2, i) = i + 1
End If
Next
For i = 0 To MSFlexGrid1.Cols - 1
If MSFlexGrid1.TextMatrix(1, i) = "99" Then
MSFlexGrid1.TextMatrix(1, i) = ""
End If
Next
End Sub
Private Sub QuickSort(ByVal LB As Long, ByVal UB As Long)
Dim P1 As Long, P2 As Long, Ref As Integer, TEMP As String, i As Integer
P1 = LB
P2 = UB
Ref = MSFlexGrid1.TextMatrix(1, ((P1 + P2) / 2))
Do
Do While MSFlexGrid1.TextMatrix(1, P1) Ref
P2 = P2 - 1
Loop
If P1 P2)
If LB 0 Then
MSFlexGrid1.TextMatrix(1, i) = r
Else
MSFlexGrid1.TextMatrix(1, i) = ""
End If
Next
End Sub
Wow, genial!! Klappt!
An der Quicksort-Funktion war ich schon am basteln, aber so ist es besser gelöst…
Vielen Dank!
lg Micha