Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Excel vba Codenamen sortieren
#1
Hallo zusammen,

ich versuche in einem Arbeitsblatt alle Blätter nach dem Codename zu sortieren.
Aber irgendwie bekomme ich das nicht hin.

Für das sortieren mit den Blattnamen habe ich diesen Code:
Code:
' Sortieren von Arbeitsblättern
Private Sub Sort_Workbook()
Dim i As Integer, j As Integer, k As Integer
k = ActiveWorkbook.Worksheets.Count
For i = 2 To k
  For j = i To k
     If Worksheets(j).Name < Worksheets(i).Name Then
        Worksheets(j).Move Before:=Worksheets(i)
     End If
  Next j
Next i
' Ende Sortieren von Arbeitsblättern
End Sub

Wie müsste man den Code ändern um die Blätter aufsteigend nach dem Code-Namen zu sortieren?

Vielen Dank für Eure Hilfe!
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#2
Hallo,

wenn ich dein Anliegen richtig verstanden habe, dann reicht einfach

Code:
If Worksheets(j).CodeName < Worksheets(i).CodeName Then
Schöne Grüße
Berni
Antworten Top
#3
Moin!
(28.12.2019, 00:06)MisterBurns schrieb: wenn ich dein Anliegen richtig verstanden habe
Damit habe ich gewisse Probleme. Wink
Der CodeName wird ja automatisch im Projekt-Explorer alphabetisch sortiert.
Welchen Sinn sollte es haben, dies auf die GUI zu spiegeln?

Anyway:
Ich hab das mal nachgestellt.
Bei mir muss die äußere Schleife mit 1 beginnen.

Private Sub Sort_Workbook()
Dim i As Integer, j As Integer, k As Integer
k = ActiveWorkbook.Worksheets.Count
For i = 1 To k
 For j = i To k
    If Worksheets(j).CodeName < Worksheets(i).CodeName Then
       Worksheets(j).Move Before:=Worksheets(i)
    End If
 Next j
Next i
End Sub


Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • Gast 123
Antworten Top
#4
Hallo Ralf,

zunächst, Dein Makro funktioniert, Danke, aber leider nicht so wie ich mir das gedacht hatte.
Dass der Codename im Projekt-Explorer aufsteigend sortiert ist weiß ich ja auch. Die Sortierung ist aber nicht durchgehend und fortlaufend.

Zuerst kommz Tab1..Tab10...Tab11... usw. Tab2...Tab20....usw...

Ich möchte die Sortierung aber aufsteigend, also Tab1 2,3,4,5,6,7,8,9,10,11,12....20,21,22,...fortlaufend bis Tabn.
Wie das im Projekt-Explorer dargestellt wird ist mir eigentlich egal.
Ich möchte egal was auf den Tabellenreitern steht, eine nicht unterbrochene aufsteigende Sortierung angelehnt an die Codebezeichnung.

Ist das überhaupt möglich?
Oder geht die Sortierung nur nach alphabetischer Reihenfolge abhängig von der Beschriftung der Tabellenreiter?
Das wäre auch nicht weiter tragisch, aber ich möchte einige Tabellen halt nicht in der Sortierreihenfolge haben, sondern ans Ende stellen.

Gäbe es da noch Lösungen? Bevorzugen würde ich gerne die Sortierung nach Codename.
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#5
Ist möglich, Erich.
Die derzeitige Sortierung ist jedoch alphabetisch korrekt, denn 12 ist "kleiner" als 2.
Ich hab da was auf der Festplatte, bin aber momentan unterwegs.
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#6
Hallo,

ich habe den Code auch getestet und versucht umzuschreiben. Es ist wirklich so, dass die Tabellenblätter, egal ob es über Codename passiert, falsch sortiert werden.

Gruß
Marcus

Wissen ist Macht - es ist aber nicht schlimm nicht alles zu wissen.
Man muss nicht alles wissen - man muss nur wissen wo es steht, oder wo man Hilfe bekommt.
Antworten Top
#7
Ja, Marcus, wie ich bereits schrieb, sortiert VBA die Texte korrekt!
Wenn man das anders haben will, muss man die enthaltene "Textzahl" mehrstellig formatieren.

Hier mal das versprochene Makro für die CodeNames.
Vorbereitung:
  • Extras, Optionen, Sicherheitscenter
  • Einstellungen für das Sicherheitscenter
  • Einstellungen für Makros
  • "Zugriff auf das VBA-Projektobjektmodell vertrauen" aktivieren
Dann dieses Makro laufen lassen:

Sub MachsZweistellig()

Dim wsBlatt As Worksheet
For Each wsBlatt In ThisWorkbook.Worksheets
   With wsBlatt
      If Not IsNumeric(Right(.CodeName, 2)) Then
         .Parent.VBProject.VBComponents(.CodeName).Properties(5) = _
            Left(.CodeName, 7) & Format(Right(.CodeName, 1), "00")
      End If
   End With
Next
End Sub

Ähnlich (ohne die Sicherheitseinstellungen) funktioniert dies auch mit den Standard-Tabellennamen.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#8
Hallo Erich,

(28.12.2019, 10:41)sharky51 schrieb: Zuerst kommz Tab1..Tab10...Tab11... usw. Tab2...Tab20....usw...

Ich möchte die Sortierung aber aufsteigend, also Tab1 2,3,4,5,6,7,8,9,10,11,12....20,21,22,...fortlaufend bis Tabn.
Wie das im Projekt-Explorer dargestellt wird ist mir eigentlich egal.

Ralf´s Code leicht modifiziert:

Private Sub Sort_Workbook()
Dim i As Integer, j As Integer, k As Integer
Dim lngPos As Long
lngPos = 4 'Zahlbeginn (8 bei Tabelle, 4 bei Tab, ...)
k = ActiveWorkbook.Worksheets.Count
For i = 1 To k
For j = i To k
If Format(Mid(Worksheets(j).CodeName, lngPos), "00000") < Format(Mid(Worksheets(i).CodeName, lngPos), "00000") Then
Worksheets(j).Move Before:=Worksheets(i)
End If
Next j
Next i
End Sub
Gruß Uwe
Antworten Top
#9
Hallo Ralf, hallo Uwe,

wirklich perfekt! Beide Varianten funktionieren Bestens. Genau das habe ich gesucht.

Verstehen tue ich aber trotzdem nicht warum man den Codenamen zur Laufzeit des Makros "aufpeppeln" muss damit die Sortierung so funktioniert wie gewünscht???

Btw. Uwe, die Codezeile mit " lngPos = 4 'Zahlbeginn (8 bei Tabelle, 4 bei Tab, ...)" macht keinen Unterschied aus.
Meine Tabellennamen sind bisher standardmäßig auggebaut, also "Tabellexx!
In Deinem Beispiel war IngPos = 4  definiert. Ich habe beide Varianten getestet. Aber das Makro spukt trotzdem immer die Tabellennamen so aus: Tabelle01 usw.

Vielleicht verstehe ich auch etwas nicht.

Ich danke Euch nochmals herzlich.
Mit freundlichen Grüßen / Best regards
                          //
----------o00o---°(_)°---o00o----------------------

Erich
Antworten Top
#10
   
Hallo,
bei Excel 365 scheint das nicht zu funktionieren:
Was hat sich da geändert?

Gruß
Marcus

Wissen ist Macht - es ist aber nicht schlimm nicht alles zu wissen.
Man muss nicht alles wissen - man muss nur wissen wo es steht, oder wo man Hilfe bekommt.
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste