Hier mal zwei Ansätze zum "Sortieren". Variante 1 ist mit einer Collection, Variante 2 mit einem Listview Bei der Collection nehme ich die Blattnamen als Key und Value und kann die Namen über die Key's sortiert ansprechen. Beim Listview gibt es eine "integrierte" Sortierfunktion.
Code:
Sub Var1() 'Variablendeklarationen Dim colSheets As New Collection, blaetter As Worksheet Dim arrBlaetter, iCnt%, tmp 'Schleife ueber alle Tabellenblaetter For Each blaetter In Worksheets 'wenn der Name numwerisch ist, dann der collection hinzufuegen If IsNumeric(blaetter.Name) Then colSheets.Add blaetter.Name, blaetter.Name 'Schleife ueber alle Tabellenblaetter Next 'Bei Fehler naechstes Kommando On Error Resume Next 'Schleife ueber eventuelle Blattnamen For iCnt = 100 To 1 Step -1 'Variable fuer Blattname zuruecksetzen tmp = "" 'ermitteln, ob Blattname - Key vorhanden ist tmp = colSheets.Item(Format(iCnt, "00#")) 'Wenn Blattname vorhanden ist, dann im Direktfenster Ausgeben If tmp <> "" Then Debug.Print tmp 'Ende Schleife ueber eventuelle Blattnamen Next End Sub
Code:
Sub Var2() 'Verweis auf 'Microsoft Windows Common Controls 6,0 (SP6) 'Ggf. Userform einfuegen, weitere Steuerelemente, Listview - 'dann ist der Verweis vorhanden, das userform kann wieder 'geloescht werden 'Variablendeklarationen Dim lvBlaetter As ListView Dim blaetter As Worksheet Dim arrBlaetter Set lvBlaetter = New ListView 'Schleife ueber alle Tabellenblaetter For Each blaetter In Worksheets 'wenn der Name numwerisch ist, dann dem ListView hinzufuegen If IsNumeric(blaetter.Name) Then lvBlaetter.ListItems.Add Text:=blaetter.Name 'Schleife ueber alle Tabellenblaetter Next 'ListView sortieren lvBlaetter.SortKey = 0 lvBlaetter.SortOrder = lvBlaetterwAscending lvBlaetter.Sorted = True 'Erstes Element ausgeben MsgBox lvBlaetter.ListItems(1) End Sub
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
ich habe beide Codes ausprobiert und leider funktioniert keiner der beiden. Bei dem ersten passiert garnicht und bei dem zweiten erscheint folgende Fehlermeldung: ,,Benutzerdefinierter Typ nicht definiert."
Ich habe mich mal ein bisschen mit dem Thema befasst und bin darauf gestoßen, dass dies an meiner 64-Bit Version von Office liegen könnte. Kann es das sein und wenn ja, gibt es noch eine andere Möglichkeit das ganze zu realisieren?
30.10.2018, 18:20 (Dieser Beitrag wurde zuletzt bearbeitet: 30.10.2018, 18:20 von schauan.)
Hallo Lukas,
hast Du eventuell in den codes die Kommentare nicht gelesen?
Beim ersten Code steht dass die Blattnamen im Direktfenster ausgegeben werden. Das ist erst mal zur Kontrolle. Da fehlt dann der Part mit dem Sortieren. Den wolltest Du ja mit dem Quicksort erledigen oder habe ich da Deinen Beitrag falsch verstanden? Auf Grund deines Vorschlags hatte ich gedacht, dass Du mit Deinen VBA-Kenntnissen etwas tief stapelst und doch das eine oder andere weist.
Beim zweiten Code musst Du einen Verweis setzen. Wenn das nicht geht, steht auch drin, wie Du dazu kommst. In einer Meldung wird Dir dann der erste Eintrag als Meldung ausgegeben. Das ist nur ein Beispiel, wie Du überhaupt an die Einträge vom Listview herankommst. Wenn Du die dann in einer Schleife "von hinten aufrollst", kannst Du die Blätter wie in meiner vorherigen Antwort "sortieren". Aber wahrscheinlich sollte ich da etwas komplettes liefern?
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Ich muss dir ehrlich gestehen das ich mich nicht so gut in dem ganzen Thema VBA auskenne. Über die Quicksort Funktion bin ich auf einer anderen Website gestolpert und dachte, dass es vielleicht damit funktioniert. Aber wie genau weiß ich leider nicht.
Ich kann verstehen wenn du keine Lust hast mir alles zu ,,erarbeiten", aber denn noch bitte ich dich darum. Anstonsten weiß ich nicht, wie ich weiter vorgehen soll.
wenn ich keine Lust hätte wäre ich wohl nicht in einem Forum Ist nur nicht immer leicht, das Wissen eines Fragestellers einzuschätzen. Anbei habe ich nun die beiden Varianten. Du kannst die Blätter "mischen" und auch weitere hinzufügen. Auf dem Blatt Tabelle2 habe ich zwei Buttons, für die beiden Varianten.
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
vielen Dank das du mir trotzdessen, dass ich nicht so viel Ahnung habe, weiterhilfst. Das ist wirklich nicht Selbstverständlich! Und das stimmt, dass es schwer ist das Wissen andere Benutzer einzuschätzen. Beim nächten mal sage ich von Anfang an, dass ich keine großen Kentnisse habe :32:
Ich habe mir beide Varianten einmal angeschaut und in deiner Tabelle funktionieren diese auch. In meiner Tabelle funktioniert jedoch nur die erste Variante, also die mit der Collection Funktion. Bei der ListView Variante, wird der Fehler ,,Benutzerdefinierter Typ nicht vorhanden", an der Stelle ,,Dim lvBlaetter As Listview", ausgegeben. Weißt du woran dies liegen könnte?
Außerdem habe ich noch die Frage ob es möglich ist, dass ich nach dem Kopiervorgang auf das neu erstelle Blatt zurückspringen kann? Das ist der aktuelle Code:
Code:
Sub TabellenUmbenennen() Dim Sht As String anzahl = ThisWorkbook.Sheets.Count 'Numerische Tabellen auf dreistellig umbenennen For t = 2 To anzahl Sht = ThisWorkbook.Sheets(t).Name If IsNumeric(Sht) Then If IsNumeric(Sht) And Len(Sht) < 3 Then ThisWorkbook.Sheets(t).Name = Format(Sht, "00#") End If Next t Call Sortieren End Sub
Sub Sortieren() 'Verweis auf 'Microsoft Windows Common Controls 6,0 (SP6) 'Ggf. Userform einfuegen, weitere Steuerelemente, Listview - 'dann ist der Verweis vorhanden, das userform kann wieder 'geloescht werden 'Variablendeklarationen Dim lvBlaetter As ListView Dim blaetter As Worksheet Dim arrBlaetter, iCnt% Set lvBlaetter = New ListView 'Schleife ueber alle Tabellenblaetter For Each blaetter In Worksheets 'wenn der Name numwerisch ist, dann dem ListView hinzufuegen If IsNumeric(blaetter.Name) Then lvBlaetter.ListItems.Add Text:=blaetter.Name 'Schleife ueber alle Tabellenblaetter Next 'ListView sortieren lvBlaetter.SortKey = 0 lvBlaetter.SortOrder = lvwAscending lvBlaetter.Sorted = True 'Letztes Blatt ans Ende setzen, wenn es nicht schon dort ist If Sheets(Sheets.Count).Name <> Sheets(CStr(lvBlaetter.ListItems(lvBlaetter.ListItems.Count))).Name Then Sheets(CStr(lvBlaetter.ListItems(lvBlaetter.ListItems.Count))).Move After:=Sheets(Sheets.Count) 'Ende Letztes Blatt ans Ende setzen, wenn es nicht schon dort ist End If 'Schleife ueber alle anderen Blaetter For iCnt = lvBlaetter.ListItems.Count - 1 To 1 Step -1 'Blatt vor das naechste setzen Sheets(CStr(lvBlaetter.ListItems(iCnt))).Move before:=Sheets(CStr(lvBlaetter.ListItems(iCnt + 1))) 'Ende Schleife ?ber alle anderen Blaetter Next End Sub
05.11.2018, 22:20 (Dieser Beitrag wurde zuletzt bearbeitet: 05.11.2018, 22:20 von schauan.)
Hallöchen,
das mit dem Listview steht, wie gesagt, im Kommentar des Codes.
Einen Verweis setzt man im Menü | Extras | Verweise und muss drt in der Liste suchen. Oder eben, wie auch beschrieben, mit dem Umweg über's Einfügen eines UF und dort ein ListViews auswählen. Dazu muss man im "Werkzeugdialog" "weitere Steuerelemente hinzufügen"
Weiteres dann morgen, ich mach jetzt Feierabend, muss 4:40 Uhr raus ...
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
danke, ich habe es nun hinbekommen. Der Verweis zum Listview hat mir noch gefehlt :16: Ich habe den Verweis jetzt über die weiteren Steuerelemente hinzugefügt. Gilt der Verweis von dem ListView dabei nur für meinen PC oder für die Datei? Ich möchte nämlich, dass die Excel Tabelle auch auf anderen Rechnern problemlos läuft.
Ich habe mich jetzt auch für die ListView Variante entschieden, da diese doch bei vielen Tabellenblättern merkbar schneller läuft.
Und dann bleibt noch die Frage von gestern offen. Ob es möglich ist, sich das zuletzt hinzugefügte Tabellenblatt, anzeigen zu lassen?
Ich hoffe deine Nacht war nicht all zu kurz, 4:40 Uhr ist wirklich früh :/
der Verweis ist immer Dateibezogen, Du kannstt sie also beruhiigt weitergeben. Wenn das Blatt mit der höchsten Zahl auch das zuletzt hinzugefügte ist, dann tust DU es einfach aktiveren. Es ist ja in der Listview - Liste
Im Code setze ich ja das letzte Blatt ans Ende - siehe wieder die Kommentare. Es eht also um dieses Baltt:
danke für deine Erklärung. Das habe ich soweit verstanden, allerdings handelt es sich nicht um das Blatt mit der höchsten Zahl, welches ich angezeigt bekommen will. Sondern um das zuletzt hinzugefügte, quasi dass, was neu einsortiert wird. Gibt es dafür auch eine Möglichkeit? Der Code sieht noch genauso aus, wie in meinem vorletzten Beitrag.