2.4k Aufrufe
Gefragt in Tabellenkalkulation von
Guten Abend,

ich habe ca. 84 Tabellenblätter.
Wie kann ich die Tabellenblätter nach sortieren.

bsp.

Tabellenblatt name [Monat Jahr]
Januar 2005-Dezember 2005
Januar 2006 -Dezember 2006
Januar 2007-Dezember 2007
usw.


Bitte den Code in VBA :-)

LG Julia

8 Antworten

0 Punkte
Beantwortet von hajo_zi Experte (9.1k Punkte)
Hallo Julia,

vielleicht ein Ansatz
Tabelle sortieren

Gruß Hajo
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^^

wie gewuenscht

gruss nighty

Sub WksNanenSort()
ReDim ArraySort(0 To Worksheets.Count) As Variant
ReDim ArrayIndex(0 To Worksheets.Count) As Variant
Dim WksIndex As Long
Dim Suchindex As Long
For WksIndex = 0 To Worksheets.Count - 1
ArraySort(WksIndex) = ZahlenBlockIsolierung(Worksheets(WksIndex + 1).Name, 1)
Next WksIndex
ArrayIndex = ArraySort
QuickSort_Feld ArraySort, 0, Worksheets.Count - 1, False
For WksIndex = 0 To Worksheets.Count - 1
For Suchindex = 0 To Worksheets.Count - 1
If ArraySort(WksIndex) = ZahlenBlockIsolierung(ArrayIndex(Suchindex), 1) Then
Worksheets(Suchindex + 1).Move Before:=Worksheets(WksIndex + 1)
End If
Next Suchindex
Next
End Sub


Function ZahlenBlockIsolierung(Zellen As Variant, ZahlenBlock As Integer) As String
Dim Zelle As Range
Dim Zeichen As Integer
Dim schalter As Boolean
Dim BlockIndex As Integer
ReDim AnzZahlenBlock(Len([Zellen])) As String
BlockIndex = 1
If ZahlenBlock > Len([Zellen]) Then ZahlenBlock = Len([Zellen])
For Zeichen = 1 To Len([Zellen])
If Mid([Zellen], Zeichen, 1) Like "[0-9]" = True Then
AnzZahlenBlock(BlockIndex) = AnzZahlenBlock(BlockIndex) & Mid([Zellen], Zeichen, 1)
schalter = True
End If
If schalter = True And Mid([Zellen], Zeichen, 1) Like "[0-9]" = False Then
BlockIndex = BlockIndex + 1
schalter = False
End If
Next Zeichen
ZahlenBlockIsolierung = AnzZahlenBlock(ZahlenBlock)
End Function


Private Sub QuickSort_Feld(DasFeld, StartUnten, EndeOben, Absteigend As Boolean)
Dim iUnten As Long, iOben, iMitte, y
iUnten = StartUnten
iOben = EndeOben
iMitte = DasFeld((StartUnten + EndeOben) / 2)
While (iUnten <= iOben)
If Not Absteigend Then
While (DasFeld(iUnten) < iMitte And iUnten < EndeOben)
iUnten = iUnten + 1
Wend
While (iMitte < DasFeld(iOben) And iOben > StartUnten)
iOben = iOben - 1
Wend
Else
While (DasFeld(iUnten) > iMitte And iUnten < EndeOben)
iUnten = iUnten + 1
Wend
While (iMitte > DasFeld(iOben) And iOben > StartUnten)
iOben = iOben - 1
Wend
End If
If (iUnten <= iOben) Then
y = DasFeld(iUnten)
DasFeld(iUnten) = DasFeld(iOben)
DasFeld(iOben) = y
iUnten = iUnten + 1
iOben = iOben - 1
End If
Wend
If (StartUnten < iOben) Then Call QuickSort_Feld(DasFeld, StartUnten, iOben, Absteigend)
If (iUnten < EndeOben) Then Call QuickSort_Feld(DasFeld, iUnten, EndeOben, Absteigend)
End Sub
0 Punkte
Beantwortet von
Hallo nighty,

danke für deine Mühe, leider funktioniert der Code nicht.

Er sortiert, aber nicht in der Reihenfolge.

[Monat Jahr]

Hast du
LG Julia
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi :-)

jo die monate fehlen noch ^^

ich mach mir gedanken darueber

gruss nighty
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi :-)

bin nun einen anderen weg gegangen ^^

gruss nighty

Sub WksNanenSort()
Call EventsOff
On Error Resume Next
Dim WksIndex As Long
Worksheets.Add after:=Worksheets(Worksheets.Count)
Columns("B:C").NumberFormat = "@"
ActiveSheet.Name = "temp"
For WksIndex = 1 To Worksheets.Count - 1
Cells(WksIndex, 1) = ZahlenBlockIsolierung(Worksheets(WksIndex).Name, 1)
Cells(WksIndex, 2) = ZeichenBlockIsolierung(Worksheets(WksIndex).Name, 1)
Cells(WksIndex, 3) = Worksheets(WksIndex).Name
Cells(WksIndex, 4) = Month("1 " & Cells(WksIndex, 2))
Next WksIndex
Columns("A:D").Sort Key1:=Range("A1"), Order1:=xlAscending, Key2:=Range("D1") _
, Order2:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom
For WksIndex = 1 To Worksheets.Count - 1
Worksheets("" & Worksheets("temp").Cells(WksIndex, 3)).Move after:=Worksheets(WksIndex)
Next WksIndex
Worksheets("temp").Delete
Call EventsOn
End Sub


Function ZahlenBlockIsolierung(Zellen As Variant, ZahlenBlock As Integer) As String
Dim Zelle As Range
Dim Zeichen As Integer
Dim schalter As Boolean
Dim BlockIndex As Integer
ReDim AnzZahlenBlock(Len([Zellen])) As String
BlockIndex = 1
If ZahlenBlock > Len([Zellen]) Then ZahlenBlock = Len([Zellen])
For Zeichen = 1 To Len([Zellen])
If Mid([Zellen], Zeichen, 1) Like "[0-9]" = True Then
AnzZahlenBlock(BlockIndex) = AnzZahlenBlock(BlockIndex) & Mid([Zellen], Zeichen, 1)
schalter = True
End If
If schalter = True And Mid([Zellen], Zeichen, 1) Like "[0-9]" = False Then
BlockIndex = BlockIndex + 1
schalter = False
End If
Next Zeichen
ZahlenBlockIsolierung = AnzZahlenBlock(ZahlenBlock)
End Function


Function ZeichenBlockIsolierung(Zellen As Variant, ZahlenBlock As Integer) As String
Dim Zelle As Range
Dim Zeichen As Integer
Dim schalter As Boolean
Dim BlockIndex As Integer
ReDim AnzZahlenBlock(Len([Zellen])) As String
BlockIndex = 1
If ZahlenBlock > Len([Zellen]) Then ZahlenBlock = Len([Zellen])
For Zeichen = 1 To Len([Zellen])
If Mid([Zellen], Zeichen, 1) Like "[a-z,A-Z,ö,ä,ü,Ö,Ä,Ü]" = True Then
AnzZahlenBlock(BlockIndex) = AnzZahlenBlock(BlockIndex) & Mid([Zellen], Zeichen, 1)
schalter = True
End If
If schalter = True And Mid([Zellen], Zeichen, 1) Like "[a-z,A-Z,ö,ä,ü,Ö,Ä,Ü]" = False Then
BlockIndex = BlockIndex + 1
schalter = False
End If
Next Zeichen
ZeichenBlockIsolierung = AnzZahlenBlock(ZahlenBlock)
End Function


Public Sub EventsOff()
With Application
.DisplayAlerts = False
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
End Sub


Public Sub EventsOn()
With Application
.DisplayAlerts = True
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub


handicap
monatsnamen muessen richtig geschrieben sein,da ich ueber month auf den jeweiligen index zurueckgreife
0 Punkte
Beantwortet von
Hallo nighty,

sorry, aber leider funktioniert es nicht.

Alle Monatsnamen sind richtig geschrieben

Alle Tabellennamen lauten [Monatsname Jahr]

Gruß, Julia
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi :-)

dann schick mir mal eine dummydatei ^^

gruss nighty

oberley@t-online.de

bitte mit eindeutigen betreff
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi :-)

noch nix angekommen ^^

gruss nighty

blattschutz sollte ausgeschaltet sein zur laufzeit ^^

noch ein wenig eigenkritik ^^

on error
ist recht ungluecklich getroffen auch wenn das makro relativ kurz ist,sollten doch fehler vermieden werden bzw eine entsprechende err verzweigung vorhanden sein

die monatsabfrage leider auch
eine korrekte schreibweise zu fordern sehe ich als ungenuegend an,hier waere eine 3 zeichen abfrage eher sinnvoll

hab aber leider nicht mehr soviel zeit zum testen und ideen zu entwickeln

da ist dann der nachwuchs gefragt hihi
...