Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1332to1336
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
Inhaltsverzeichnis

Sortieren von Datensätzen

Sortieren von Datensätzen
22.10.2013 13:52:20
Datensätzen
Hallo,
ich würde gerne erreichen, dass über ein Makro zunächst die Datensätze nach Hausnamen -SpalteC- sortiert werden, in der Folge sollen aber danach alle Datensätze sortiert werden, die durchgestrichen sind - wie könnte ich da vorgehen? - Danke schon jetzt für die Rückmeldungen.
Gruß - Wolfgang

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sortieren von Datensätzen
22.10.2013 14:30:31
Datensätzen
Hallo,
wenn du irgendwo ein Kennzeichen hättest, wäre es einfacher.
Tabelle beginnt in A1, Zeile 1 = Überschriften
Option Explicit
Sub sortieren()
Dim arrTmp, i As Long, vntArr()
Application.ScreenUpdating = False
With Cells(1, 1).CurrentRegion
arrTmp = .Offset(1).Resize(.Rows.Count - 1, .Columns.Count + 1)
End With
vntArr = arrTmp
For i = 1 To UBound(vntArr)
If Cells(i + 1, 3).Font.Strikethrough Then
vntArr(i, UBound(vntArr, 2)) = "Z"
Else
vntArr(i, UBound(vntArr, 2)) = "A"
End If
Next
prcSort Array(UBound(vntArr, 2), 3), vntArr
Cells(2, 1).Resize(UBound(vntArr), UBound(vntArr, 2) - 1) = vntArr
For i = 1 To UBound(vntArr)
Cells(i + 1, 3).Font.Strikethrough = vntArr(i, UBound(vntArr, 2)) = "Z"
Next
End Sub
Sub prcSort(vntSortKey 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)
Dim i As Integer
'Array für den 1. Sortierlauf
lngRowsArray(0, 0) = LBound(vntArray)
lngRowsArray(0, 1) = UBound(vntArray)
lngRowsCount = 1
For intIndex = LBound(vntSortKey) To UBound(vntSortKey)
'Wenn eine Spalte angegeben
If vntSortKey(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(vntSortKey(intIndex))), _
CBool(vntSortKey(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(vntSortKey(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(vntSortKey(intIndex))) Then
lngRowsCount = lngRowsCount + 2
lngRowsArray(0, lngRowsCount - 1) = lngIndex2 - 1
lngRowsArray(0, lngRowsCount) = lngIndex2
vntTemp = vntArray(lngIndex2, Abs(vntSortKey(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 
Gruß
Rudi

Anzeige
AW: Sortieren von Datensätzen
22.10.2013 20:15:44
Datensätzen
Hallo Rudi,
herzlichen Dank für Deine schnelle Rückmeldung und Übersendung des Codes. Ich versuche ihn mit meinen geringen Kenntnissen zu verstehen bzw. zumindst zu schauen, was er an welcher Stelle macht. In der Umsetzung sortiert er wohl grundsätzlich zunächst die Datensätze ohne Durchstreichung alphabetisch und hängt die durchgestrichenen Datensätze alphabetisch 'dran. Innerhalb der nichtdurchgestrichenen und alphabetisch sortierten Datensätze werden aber durch den Code dann noch Teile eines Datensatzes durchgestrichen, in anderen Zellen wird noch irgendwie in "x" eingebaut. Hättest Du eine Idee, was ich da verändern müßte. Danke schon jetzt wieder für die Rückmeldung.
Gruß - Wolfgang

Anzeige
AW: Sortieren von Datensätzen
23.10.2013 09:10:20
Datensätzen
Hallo,
weiß ich wie deine Liste aussieht?
Ich bin von einer richtigen 'Tabelle' ausgegangen, also ohne leere Zeile/Spalten.
Mehr kann ich nur anhand eines Musters sagen.
Gruß
Rudi

AW: Sortieren von Datensätzen
23.10.2013 09:26:53
Datensätzen
Hallo Rudi,
erneut danke für Deine Rückmeldung. Die Frage mit den "x" hat sich geklärt, da war in der Mappe wohl noch ein anderer Code aktiv, der mir die "x" da eingebaut hat. Werde Deinen Vorschlag aufgreifen und Morgen (komme leider heute nicht dazu) eine Mustermappe hochladen. Danke nochmals.
Gruß - Wolfgang

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige