5.8k Aufrufe
Gefragt in Tabellenkalkulation von ahorn38 Experte (3.3k Punkte)
Hallo,

ich suche einen einfachen VBA Code mit dem ich aus einer Excel-Tabelle Spalte "E1:E20" die drei größten Werte suchen und in F1:F3 separat noch einmal listen kann.
Habe mich bisher immer in diversen Vergleichs-Schleifen verheddert.

20 Antworten

0 Punkte
Beantwortet von ahorn38 Experte (3.3k Punkte)
ok, das klappt! Gibt es noch eine Möglichkeit jeweils die Tabellenzeile auszugeben, in der der jeweils ermittelte Wert steht? Also in welcher Zeile steht der Höchste, zweit- und dritthöchste Wert?
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

das kannst du so lösen:

Sub Wert()
Dim arr() As Byte, i As Byte, Zeile As Long
ReDim arr(3)
For i = 1 To 3
arr(i) = Application.WorksheetFunction.Large(Range(Cells(3, 5), Cells(20, 5)), i)
Cells(0 + i, 6).Value = arr(i)
'erste Übereistimmung mit Zahl in Array suchen, +2 da Bereich mit Zahlen erst ab Zeile 3 anfängt, was Zeile 1 des Sucharrays entspricht
Cells(0 + i, 7).Value = Application.WorksheetFunction.Match(arr(i), Range(Cells(3, 5), Cells(20, 5)), 0) + 2
Next
End Sub


Beachte aber, dass bei mehreren gleichen Werten in deiner Tabelle, der erste gefundene Wert, der mit den größten Zahlen übereinstimmt, zurück gegeben wird.

Gruß

M.O.
0 Punkte
Beantwortet von ahorn38 Experte (3.3k Punkte)
Hallo M.O.,
genial, funktioniert tadellos!
Kann ich mir die Zeilennumern auch in Variablen abspeichern, um sie dann später im Code wieder zu verwenden?
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

natürlich. Das könnte beispielsweise so aussehen

Sub Wert()
Dim arr() As Byte, i As Byte, Zeile As Long
Dim ArrMax(3)

ReDim arr(3)
For i = 1 To 3
arr(i) = Application.WorksheetFunction.Large(Range(Cells(3, 5), Cells(20, 5)), i)
Cells(0 + i, 6).Value = arr(i)
'erste Übereistimmung mit Zahl in Array suchen, +2 da Bereich mit Zahlen erst ab Zeile 3 anfängt, was Zeile 1 des Sucharrays entspricht
ArrMax(i) = Application.WorksheetFunction.Match(arr(i), Range(Cells(3, 5), Cells(20, 5)), 0) + 2
Next

MsgBox "Die größte Zahl befindet sich in Zeile " & ArrMax(1)
Rows(ArrMax(1)).Select

End Sub


Gruß

M.O.
0 Punkte
Beantwortet von ahorn38 Experte (3.3k Punkte)
Hallo M.O.,
danke vielmals!! Musste gestern die Arbeit leider unterbrechen, so das ich erst heute antworten kann. Dein Vorschlag löst genau mein Problem. Einige Befehle kannte ich bis dato noch gar nicht, so dass ich gleich noch ne Menge gelernt habe!!!
0 Punkte
Beantwortet von ahorn38 Experte (3.3k Punkte)
Hallo M.O.

ich muss doch noch mal nachfragen,
Beim Anpassen deines Vorschlages an meine konkrete Dateistruktur

Sub Ranking()

Application.EnableEvents = False
Dim arr() As Byte, i As Byte, Zeile As Long
Dim ArrMax(3)

ReDim arr(3)
For i = 1 To 3
arr(i) = Application.WorksheetFunction.Large(Range(Cells(3, 40), Cells(83, 40)), i)
Cells(87 + i, 40).Value = arr(i)
'erste Übereistimmung mit Zahl in Array suchen, +2 da Bereich mit Zahlen erst ab Zeile 3 anfängt, was Zeile 1 des Sucharrays entspricht
ArrMax(i) = Application.WorksheetFunction.Match(arr(i), Range(Cells(3, 40), Cells(83, 40)), 0) + 2
Cells(87 + i, 37).Value = Cells(ArrMax(i), 2)
Next

End Sub
erhalte ich in der Zeile "ArrMax(i) = Application........" eine Fehlerausschrift "MatchEigenschaft kann nicht zugeordnet werden".
Die auszuwertenden Daten stehen in der Tabelle in der Spalte 40 und beginnen in der 3. Zeile
Wie gesagt im Testlauf hat es noch geklappt ....?
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

bei mir läuft das Makro ohne Probleme durch.
Um welche Art von Daten handelt es sich denn in der Spalte 40: Zahl, Datum, Uhrzeit?

Gruß

M.O.
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

versuch mal folgendes:
Ändere:
Dim arr() As Byte, i As Byte, Zeile As Long

in
Dim arr(), i As Byte, Zeile As Long


Gruß

M.O.
0 Punkte
Beantwortet von ahorn38 Experte (3.3k Punkte)
...ich bin wieder einmal begeistert! Die letzte Änderung hats gebracht!!!!! Ich hoffe, ich habe dich nicht zu sehr genervt! Vielen Dank!!!
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

kein Problem :-).

Gruß

M.O.
...