Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1004to1008
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Sortieren mit Array
23.08.2008 15:58:55
Krämer
Hallo,
Ich habe folgende Frage:
Habe eine Aufgabe bekommen: mit Array (zeilenweises Einlesen) eine Sortierfunktion erstellen mit Schleifen, 2 ineinander geschachtelt, nach Sortieralgorithmen suchend, public sort z.B.
Es ist eine Tabelle mit EMail-Adressen, den dazugehörigen Ländernamen und anderen Angaben.
Es soll nach EMail-Adressen sortiert werden.
Wenn mir jemand mit einem passenden Code helfen könnte, wäre ich sehr dankbar.
Gruß,

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sortieren mit Array
23.08.2008 16:12:06
Daniel
HI
mal ne blöde Frage, warum den Sortieralgorithmus nachprogrammieren, wenn Excel den schon eingbaut hat?
im Zweifelsfall Array in einen Zellbereich schreiben, diesen mit .SORT sortieren und dann den Zellbereich wieder ins Array einlesen.
ansonsten liefert das Archiv mit den Suchbegriffen "Array" und "Sortieren" genügend Codebeispiele.
grundsätzliche Methoden zur Sortierung kann man auch in der Wikipedia finden.
Gruß, Daniel
AW: Sortieren mit Array
23.08.2008 16:29:00
Hajo_Zi
Hallo Nick,
hast Du Dir für Dein Level nicht ein wenig viel vorgenommen?
Mal ein Code von Nepumuk.

Option Explicit
'In der Beispielroutine „prcTest" wird ein Array mit 30 Spalten und 10.000 Zeilen erst mit  _
Zufallszahlen von 1 bis 5 gefüllt
'und anschließend nach 6 Spalten sortiert.
'   1. Nach Spalte 1 aufsteigend.
'   2. Nach Spalte 2 absteigend.
'   3. Nach Spalte 8 aufsteigend.
'   4. Nach Spalte 3 aufsteigend.
'   5. Nach Spalte 4 absteigend.
'   6. Nach Spalte 5 absteigend.
'   Code Max Kaffl 2005
Public Sub prcTest()
Dim intColumn As Integer
Dim lngRow As Long
Dim vntArray(1 To 10000, 1 To 30) As Variant
'die zu sortierenden Spalten
'negative Zahl = Spalte absteigend sortieren
'positive Zahl = Spalte aufsteigend sortieren
Dim vntSortArray As Variant
vntSortArray = Array(1, -2, 8, 3, -4, -5)   ' + aufsteigend sortiert, - absteigend sortiert
'TestArray füllen
Randomize Timer
For lngRow = 1 To 10000
For intColumn = 1 To 30
vntArray(lngRow, intColumn) = Fix((5 * Rnd) + 1)
Next
Next
'Sortierroutine starten
Call prcSort(vntSortArray, vntArray())
'Ausgabe Testarray
Application.ScreenUpdating = False
Range("A1:AD10000").Value = vntArray
Application.ScreenUpdating = True
End Sub
Private Sub prcSort(vntSortArray As Variant, vntArray() As Variant)
Dim intIndex As Integer
Dim lngIndex1 As Long, lngIndex2 As Long, lngRowsArray() As Long
Dim lngRowsCount As Long, lngRangeCount As Long
Dim vntTemp As Variant
ReDim lngRowsArray(0 To 1, 0 To UBound(vntArray) * 2)
'Array für den 1. Sortierlauf
lngRowsArray(0, 0) = LBound(vntArray)
lngRowsArray(0, 1) = UBound(vntArray)
lngRowsCount = 1
For intIndex = LBound(vntSortArray) To UBound(vntSortArray)
'Wenn eine Spalte angegeben
If vntSortArray(intIndex)  0 Then
lngRangeCount = -1
'Schleife zum sortieren der einzelnen Bereiche
For lngIndex1 = 0 To lngRowsCount Step 2
'Sortieren des Bereichs, wenn Zeilenzahl größer 1
If lngRowsArray(0, lngIndex1)  lngRowsArray(0, lngIndex1 + 1) Then
Call prcQuickSort(CLng(lngRowsArray(0, lngIndex1)), _
CLng(lngRowsArray(0, lngIndex1 + 1)), CInt(Abs(vntSortArray(intIndex))), _
_
CBool(vntSortArray(intIndex) > 0), vntArray())
'sortierten Bereich merken
lngRangeCount = lngRangeCount + 2
lngRowsArray(1, lngRangeCount - 1) = lngRowsArray(0, lngIndex1)
lngRowsArray(1, lngRangeCount) = lngRowsArray(0, lngIndex1 + 1)
End If
Next
lngRowsCount = -1
'Durchsuchen der soeben sortierten Spalte nach Wertewechsel
For lngIndex1 = 0 To lngRangeCount Step 2
'1. Zeile des zu sortierenden Bereichs
vntTemp = vntArray(lngRowsArray(1, lngIndex1), Abs(vntSortArray(intIndex)))
lngRowsCount = lngRowsCount + 1
lngRowsArray(0, lngRowsCount) = lngRowsArray(1, lngIndex1)
'Suche nach Wechsel innerhalb des Bereichs
For lngIndex2 = lngRowsArray(1, lngIndex1) To lngRowsArray(1, lngIndex1 + 1)
If vntTemp  vntArray(lngIndex2, Abs(vntSortArray(intIndex))) Then
lngRowsCount = lngRowsCount + 2
lngRowsArray(0, lngRowsCount - 1) = lngIndex2 - 1
lngRowsArray(0, lngRowsCount) = lngIndex2
vntTemp = vntArray(lngIndex2, Abs(vntSortArray(intIndex)))
End If
Next
'letzte Zeile des zu sortierenden Bereichs
lngRowsCount = lngRowsCount + 1
lngRowsArray(0, lngRowsCount) = lngRowsArray(1, lngIndex1 + 1)
Next
End If
Next
End Sub
Private Sub prcQuickSort(lngLbound As Long, lngUbound As Long, _
intSortColumn As Integer, bntSortKey As Boolean, vntArray() As Variant)
Dim intIndex As Integer
Dim lngIndex1 As Long, lngIndex2 As Long
Dim vntTemp As Variant, vntBuffer As Variant
lngIndex1 = lngLbound
lngIndex2 = lngUbound
vntBuffer = vntArray((lngLbound + lngUbound) \ 2, intSortColumn)
Do
If bntSortKey Then
Do While vntArray(lngIndex1, intSortColumn)  vntBuffer
lngIndex1 = lngIndex1 + 1
Loop
Do While vntBuffer > vntArray(lngIndex2, intSortColumn)
lngIndex2 = lngIndex2 - 1
Loop
End If
If lngIndex1  _
vntArray(lngIndex2, intSortColumn) Then
For intIndex = LBound(vntArray, 2) To UBound(vntArray, 2)
vntTemp = vntArray(lngIndex1, intIndex)
vntArray(lngIndex1, intIndex) = _
vntArray(lngIndex2, intIndex)
vntArray(lngIndex2, intIndex) = vntTemp
Next
End If
lngIndex1 = lngIndex1 + 1
lngIndex2 = lngIndex2 - 1
ElseIf lngIndex1 = lngIndex2 Then
lngIndex1 = lngIndex1 + 1
lngIndex2 = lngIndex2 - 1
End If
Loop Until lngIndex1 > lngIndex2
If lngLbound 



Anzeige
AW: Sortieren mit Array
23.08.2008 16:29:00
Tino
Hallo,
hier mal eine recht verständliche Beschreibung der Sortieralgorithmen.
Man braucht ein bisschen um dies zu verstehen (VBA Grundlagen vorausgesetzt), aber man steigt schnell durch wie das Funktioniert.
http://www.kurt-aus-kienitz.de/knowhow/access/Beispiele/Module/ArraySortieren.html
mehrdimensionale Array
http://www.online-excel.de/excel/singsel_vba.php?f=97
Am einfachsten und am Sichersten ist aber Daniel sein Vorschlag.
Viel Spaß damit.
Gruß Tino
Anzeige

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige