Daten sortieren

  • Excel

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Terbal.

    Daten sortieren

    Hallo,
    ich habe in Spalte A sechsstellige Zahlen, die ein Datum darstellen. Beispiel:
    100489
    101124
    240100
    050112
    311009
    .
    Wie kann ich die sortieren, nach den letzten beiden Ziffern(89,24,00,12,09....), also nach der Jahreszahl?
    Dank im Voraus
    Terbal
    Da wird es bald mehrere Schritte brauchen. Rein nur die rechten 2 Stellen zu beachten reicht da nicht. 89 sollte kleiner als 00 sein. Dafür die 12 und die 09 größer als 0. Da allerdings auch eine 24 vorkommt, muss man sehen, wo man da trennt. Nicht, dass noch eine 13 oder 14 die Sortierung nächtes Jahr durcheinander bringt. Über eine Hilfsspalte kannst du mit =RECHTS(Ax;2) schonmal die 2 rechten Ziffern auslesen. Darüber dann die Trennung größer / kleiner 00 laufen lassen und dann sortieren. Geht auch alles ohne Makro. Mit Makro würde es ähnlich aussehen.

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub JahrLesen()
    2. Dim i As Long
    3. Dim jahr As Integer
    4. For i = 2 To 6
    5. jahr = 1900 + Val(Right$(Cells(i, 1), 2))
    6. If jahr < 1920 Then
    7. jahr = 100 + jahr
    8. End If
    9. Cells(i, 2) = jahr
    10. Next i
    11. End Sub
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Hallo peterfido,
    genau genommen gibt es 12 Endungen.(00,01,04,09,21,24,25,44,49,69,81,89). Diese Zeile :
    If Right$(Cells(z, 1), 2) <> "21" Then .Cells(z, 1).Delete

    bewirkt, dass alles gelöscht wird, außer den Zahlen mit Endung "21". Anstelle von "Delete" müsste ein
    Befehl ("Ausschneiden") erfolgen und anschließend "Einfügen" in Spalte D. Der Wert "21" als Variable. Vielleicht mit Select Case. So etwas schwebt mir vor. Habe jedoch zu wenig Erfahrung, um das umzusetzen.
    Gruß, Terbal
    cells.delete müsste diese doch löschen und die Zellen darunter eine nach oben verschieben. Also alles durcheinander bringen.
    wie du einen Wert in eine Zelle schreibt, steht ja schon in meinem Beispiel

    Visual Basic-Quellcode

    1. cells(zeile,spalte)=text


    leeren geht mit

    Visual Basic-Quellcode

    1. cells(zeile,spalte).clear


    Kopieren mit

    Visual Basic-Quellcode

    1. cells(zeile,spalte)=cells(zeile,spalte)


    Also für Dein Beispiel

    Visual Basic-Quellcode

    1. If Right$(Cells(Z, 1), 2) <> "21" Then
    2. Cells(Z, 4) = Cells(Z, 1)
    3. Cells(Z, 1).Clear
    4. End If
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    die angehängte Datei, zeigt meine Aufgabe vielleicht etwas klarer. So wie in Tabelle 2 sollte es nach dem Sortieren in etwa aussehen. Die erste Sub generiert die 28 Zahlen. Die Zweite sollte sortieren, tut dies leider nicht. Trotzdem habe ich sie dabei gelassen. ich musste, um hochladen zu können, die Dateiendung von .xlsm in xls ändern!
    Gruß, Terbal
    Dateien
    • QuadratDaten.xls

      (18,46 kB, 194 mal heruntergeladen, zuletzt: )
    Den Sinn verstehe ich jetzt nicht. Wenn Du die Datumsangaben selbst erstellst, wieso sortierst Du diese nicht gleich vor dem Einfügen in die Tabelle? Da sind aber noch einige Fehler auszubügeln. Den 31.02.1949 gabe so wohl nicht wirklich. Soviele "Or" sind da auch nicht nötig. Formatiert lässt sich besser durch ein Makro lesen. Wozu wird die Zeit genommen? Geht es um einen Wettbewerb?

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub Datum()
    3. Dim d1 As Date
    4. Dim d2 As Date
    5. Dim i As Integer
    6. Dim t As single
    7. Dim werte(28) As Date
    8. t = Timer
    9. d1 = "01.01.1920"
    10. d2 = "31.12.2019"
    11. For i = 1 To 28
    12. Randomize Timer
    13. werte(i) = Int((CLng(d2) - CLng(d1) + 1) * Rnd + CLng(d1))
    14. Cells(i, 1).NumberFormat = "@"
    15. Cells(i, 1) = Format(werte(i), "ddmmyy")
    16. Next i
    17. QuickSort werte, 1, 28
    18. For i = 1 To 28
    19. Cells(i, 4).NumberFormat = "@"
    20. Cells(i, 4) = Format(werte(i), "ddmmyy")
    21. Next i
    22. MsgBox Round(Timer - t, 3) 'bei mir 0,043
    23. End Sub
    24. Private Sub QuickSort(ByRef sArray As Variant, ByVal MinElem As Long, MaxElem As Long) 'Quelle: http://www.kurt-aus-kienitz.de/knowhow/access/Beispiele/Module/ArraySortieren.html
    25. Dim Mitte As Long
    26. Dim vDummy As Variant
    27. Dim vMitte As Variant
    28. Dim i As Long, j As Long
    29. If MinElem > MaxElem Then
    30. Exit Sub
    31. End If
    32. Mitte = (MinElem + MaxElem) \ 2
    33. vMitte = sArray(Mitte)
    34. '
    35. ' Für die Prüfung der linken und rechten
    36. ' Seite die Zähler initialisieren
    37. '
    38. i = MinElem
    39. j = MaxElem
    40. Do
    41. '
    42. ' Von links bis zur Mitte prüfen
    43. '
    44. Do While sArray(i) < vMitte
    45. i = i + 1
    46. Loop
    47. '
    48. ' Von rechts bis zur Mitte prüfen
    49. '
    50. Do While sArray(j) > vMitte
    51. j = j - 1
    52. Loop
    53. If i <= j Then
    54. '
    55. ' Die beiden gefundenen, falsch einsortierten
    56. ' Elemente vertauschen
    57. '
    58. vDummy = sArray(j)
    59. sArray(j) = sArray(i)
    60. sArray(i) = vDummy
    61. '
    62. ' Prüfung bei der nächsten Position fortsetzen
    63. '
    64. i = i + 1
    65. j = j - 1
    66. End If
    67. Loop Until i > j
    68. '
    69. ' Rekursiver Aufruf mit den Teil-Arrays
    70. '
    71. QuickSort sArray, MinElem, j
    72. QuickSort sArray, i, MaxElem
    73. End Sub
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „peterfido“ ()

    Es geht nicht um Wettbewerb. Bei mir ist das Routine. Das war Thema eines Rätsels aus dem Netz. Man sollte alle Paare von
    "Datumsquadraten" suchen, die es gibt. Beispiel:100489 ist eine Quadratzahl. Es gibt insgesamt nur 27 solcher Zahlen(hier ist der 31. Februar ausgeschlossen). Deswegen habe ich das Zahlenformat mit 0 am Anfang ausgeschlossen. Eine zusätzliche Bedingung war, zwei nebeneinander liegende Daten zu finden. also 100489 und 110489. Leider ist 110489 keine Quadratzahl.
    Mittlerweile habe ich die Aufgabe lösen können. Eigentlich war die Lösung nicht so wichtig für mich, wie das Makro.
    Vielen Dank!
    Wenn Dir das Thema interessant erscheint, vielleicht änderst Du das Makro in diesem Sinne. :)
    Viele Grüße, Terbal