none
Sortieren von Werten innerhalb eines Datensatzes, die 5 höchsten Werte und deren Summe RRS feed

  • Frage

  • Hallo,

    ich möchte in jedem Datensatz einer Tabelle von 10 Feldern/Werten die 5 höchsten Werte als Summe einem weiteren Datenfeld (beste5) des Datensatzes übergeben. Ich suche nach einer Routine/Sub in VBA. Bin blutiger VBA-Anfänger, komme aber mit Access(2016) grundsätzlich gut zurecht.

    Kann mir bitte jemand einen Tipp geben, wie ich das programmiere? Vielen Dank

    Freitag, 14. Oktober 2016 14:40

Alle Antworten

  • Hallo

    du könntest...

    1. Für jeden Datensatz
    2. ... Lese die 10 Werte in ein Array
    3. ... Sortiere dieses Array
    4. ... Addiere die höchsten 5 Werte
    5. ... Schreibe das Ergebnis in das Zielfeld


    Beispiel: Eine Methode könnte so aussehen:

    Public Sub SetBestOf(anzahl As Integer)
      Dim db As DAO.Database
      Set db = CurrentDb
      
      Dim rs As DAO.Recordset
      Set rs = db.OpenRecordset("select * from Tabelle1")
    
      Do While Not rs.EOF
        Dim summeBeste As Integer
        Dim values(9) As Integer
        values(0) = rs!Feld1
        values(1) = rs!Feld2
        values(2) = rs!Feld3
        values(3) = rs!Feld4
        values(4) = rs!Feld5
        values(5) = rs!Feld6
        values(6) = rs!Feld7
        values(7) = rs!Feld8
        values(8) = rs!Feld9
        values(9) = rs!Feld10
        summeBeste = Sortiere(values, anzahl)
        rs.Edit
        rs!Bester = summeBeste
        rs.Update
        rs.MoveNext
      Loop
    
      rs.Close
      Set rs = Nothing
      Set db = Nothing
    End Sub

    Das Beispiel bezieht sich auf eine Tabelle mit dem Namen "Tabelle1" und mit den numerischen Spalten "Feld1" bis "Feld10" und "Bester" für die Ergebnisse. Namen und den konkreten Spalten-Typ müsstest du also ggf. anpassen.

    Da bliebe noch die Frage nach der Sortierung. Hier könnte man einen an den Bubble-Sort angelehnten Algorithmus nehmen, andere gehen bestimmt auch (bei 10 Datenpunkten ist dieser aber ok):

    Function Sortiere(ByRef werte() As Integer, anzahl As Integer) As Integer Dim tmp As Integer Dim n As Integer Dim i As Integer n = UBound(werte) For i = 0 To anzahl - 1 For j = i + 1 To n If werte(i) < werte(j) Then tmp = werte(j) werte(j) = werte(i) werte(i) = tmp End If Next j Next i
    ' Summe der "bestOf" bilden: n = 0 For i = 0 To anzahl - 1 n = n + werte(i) Next
    ' Ergebnis zurückgeben... Sortiere = n End Function

    Der erste Parameter übernimmt (byref) das Zahlenarray, der zweite Parameter ist die Anzahl der besten Zahlen, die verwendet werden sollen, in deinem Fall also die 5.

    Der Aufruf wäre dann:

    Call SetBestOf(5)

    Gruß



    • Bearbeitet K. Pater Samstag, 15. Oktober 2016 16:24 Variablennamen verbessert...
    • Als Antwort vorgeschlagen Guido Franzke Mittwoch, 25. Januar 2017 10:24
    Freitag, 14. Oktober 2016 23:12
  • Vielen und herzlichen Dank, K. Pater, ich werde mich bemühen, das umzusetzen und melde mich dann gerne wieder. Einen schönen Sonntag, K. Klöpfer
    Sonntag, 16. Oktober 2016 09:04