| |
| 3D-Druck in der industriellen Produktion, eine Pressemitteilung
|
Autor
|
Thema: VBA: Rangfolge (2651 mal gelesen)
|
Hofe Mitglied Werkzeugmacher
Beiträge: 440 Registriert: 12.01.2008
|
erstellt am: 09. Nov. 2012 16:46 <-- editieren / zitieren --> Unities abgeben:
Tach zusammen! Ich habe einen zusammenhängenden Zellbereich mit ca. 50 Zellen, in denen beliebige Zahlen stehen, veränderlich, nicht sortiert. Wie kann ich per VBA herausfinden, welche Zahl (nicht Zelle) z.B. die fünftgrößte ist? Sortieren scheidet leider aus, da dadurch zuviel durcheinandergewürfelt wird. Hintergrund: In diesem Bereich der Tabelle werden von Teilnehmern erreichte Punkte gelistet; nun soll eine Abfrage anzeigen, wieviele Punkte Teilnehmer X noch erreichen muss, um z.B. auf Platz 10 zu kommen. Grüße Hofe ------------------ Ist mir egal, wer Dein Vater ist; solange ich angle läuft hier keiner übers Wasser! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tobstar79 Mitglied Dipl.-Ing. (Berechnungsing.)
Beiträge: 10 Registriert: 09.11.2012
|
erstellt am: 09. Nov. 2012 19:25 <-- editieren / zitieren --> Unities abgeben: Nur für Hofe
Hallo, vielleicht hilft eine kurzzeitig angelegten Tabelle in der Du die Werte dann sortierst! folgendes Beispiel: Private Sub CommandButton1_click() 'temporäres Tabellenblatt erzeugen Dim WSheet As Worksheet Dim temp As String temp = InputBox("Namen für temporäre Tabelle eingeben") If temp = ("") Then MsgBox ("Sie haben keinen Tabellennamen eingetragen" & vbCrLf & "Der Vorgang wird abgebrochen") Exit Sub End If For Each WSheet In ThisWorkbook.Worksheets If WSheet.Name = temp Then MsgBox "Tabelle mit gleichem Namen bereits vorhanden!" & vbCrLf & "Wählen sie einen anderen Namen" Exit Sub End If Next WSheet Sheets.Add ActiveSheet.Name = temp 'entsprechende Spalte kopieren und in temporärere Tabelle einfügen Worksheets("Tabelle1").Columns(1).Copy Destination:=ActiveSheet.Columns(1) 'Werte im temporärem Sheet sortieren ActiveWorkbook.Worksheets(1).Sort.SortFields.Clear ActiveWorkbook.Worksheets(1).Sort.SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal With ActiveSheet.Sort .SetRange Range("A:A") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With '5 Größten Wert auslesen MsgBox ("der fünft größte Wert lautet " & Val(ActiveSheet.Range("A5"))) 'temporäre Tabelle löschen ActiveSheet.Delete End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hofe Mitglied Werkzeugmacher
Beiträge: 440 Registriert: 12.01.2008 Computer: Aldi Schreibtisch: Ikea Werkbank: Baumarkt Software: 1967-2021, viele Updates und SP's, aber sicher nicht alle, deswegen immer wieder Sicherheitslücken
|
erstellt am: 09. Nov. 2012 22:38 <-- editieren / zitieren --> Unities abgeben:
Servus Tobstar, boah, da hast Du Dich mächtig ins Zeug gelegt, Respekt! Dieser Weg mit "Auslagerung" der Daten in einem separaten Blatt kam mir auch schon den Sinn, nur wollte ich eben dieses Erstellen und wieder löschen eines neuen Blattes incl. kopieren und sortieren der Daten vermeiden, wenn's irgendwie geht. Das Makro selbst ist nicht das Problem, vielmehr fehlt mir jeglicher Ansatz zur Vorgehensweise Erstmal besten Dank für Deinen Einsatz, vielleicht hat ja noch jemand eine Idee ohne Sortierung. Grüße Hofe ------------------ Ist mir egal, wer Dein Vater ist; solange ich angle läuft hier keiner übers Wasser! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 11. Nov. 2012 11:22 <-- editieren / zitieren --> Unities abgeben: Nur für Hofe
Ich mache solche Abfragen indem ich entweder ein lokales Array anlegen lassen (sortieren erfolgt beim Auslesen der Daten) oder über einen temporären RecordSet (ADODB), da spart man sich die Sortierroutine. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
skyzem Mitglied
Beiträge: 400 Registriert: 30.08.2006 Win 7 Enterprise x64 Cornerstone 5.3.0.5 Minitab 16.2.1.0 Excel 2010 Notepad++ 6.3.1 Putty 0.63 Calc.exe
|
erstellt am: 13. Nov. 2012 11:04 <-- editieren / zitieren --> Unities abgeben: Nur für Hofe
Das würde ich auch mit einem Array machen. Beachten musst du aber, dass sowas vorkommen kann: (hier schon sortiert) Code: 99 99 97 97 97 94
Hier wäre derjenige mit 94 Punkten an dritter Stelle - Im sortierten Array jedoch an sechster. Oder er wäre sechster. Dann würde jedoch die 97 gleich darüber auf Platz 3 sein und es würde keinen 2. Platz geben.------------------ MfG skyzem
[Diese Nachricht wurde von skyzem am 13. Nov. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 13. Nov. 2012 12:48 <-- editieren / zitieren --> Unities abgeben: Nur für Hofe
|
Hofe Mitglied Werkzeugmacher
Beiträge: 440 Registriert: 12.01.2008
|
erstellt am: 13. Nov. 2012 15:00 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Thomas Harmening: reicht ein Code:
dblWert = Application.WorksheetFunction.Large(Range("A1:A50"), 5)
?
Und ob das reicht! Genau so eine Funktion habe ich gesucht. Um Längen eleganter als die Sortierfunktion und vor allem wieder viele Codezeilen durch eine einzige ersetzt Besten Dank! Grüße Hofe ------------------ Ist mir egal, wer Dein Vater ist; solange ich angle läuft hier keiner übers Wasser! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |