Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1176to1180
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Sortieren Tabellenblätter und löschen

Sortieren Tabellenblätter und löschen
jens
Hallo Excel-Spezialisten,
ich habe ein Problem mit Tabellenblättern.
Ich habe 2 tolle Makros die meine Tabellenblätter sortieren:
Sub SortSheetsAufsteigend()
Dim Cnt As Integer, n As Integer, M As Integer
Dim WS As Worksheet
Set WS = ActiveSheet
Cnt = ActiveWorkbook.Worksheets.Count
For M = 1 To Cnt
For n = M To Cnt
If Worksheets(n).Name 
Sub SortSheetsAbsteigend()
Dim Cnt As Integer, n As Integer, M As Integer
Dim WS As Worksheet
Set WS = ActiveSheet
Cnt = ActiveWorkbook.Worksheets.Count
For M = 1 To Cnt
For n = M To Cnt
If Worksheets(n).Name > Worksheets(M).Name Then
Worksheets(n).Move before:=Worksheets(M)
End If
Next n
Next M
End Sub

Geht auch immer ganz toll.
Jetzt erzeuge ich aber über Pivotauswertungen und Seiten anzeigen automatisch Tabellen für jeden Kunden.
Meistens von 1 - 300.
Er sortiert jetzt aber falsch 1,10,11...2,20,21....
Wie bekomme ich das hin, dass die Blätter richtig sortiert sind?
Und danach sollen diese Blätter einmal alle gedruckt werden also 1:n
Und am Ende dann gelösch 1:n
Weiß jemand Rat?
Vielen Dank viele Grüße
Jens
AW: Sortieren Tabellenblätter und löschen
22.09.2010 14:19:24
robert
Hi,
benenne die blätter nicht 1,2,3..usw
sondern 001,002,003 usw also dreistellig
gruß
robert
AW: Sortieren Tabellenblätter und löschen
22.09.2010 14:54:22
jens
Hallo Robert,
vielen Dank - kann ich leider nicht, die Kundennummern fangen bei 1 an und kommen aus dem System.
Daraus wird die Pivottabelle und die Seiten werden automatisch erzeigt.
Viele Grüße Jens
AW: Sortieren Tabellenblätter und löschen
22.09.2010 16:30:59
Tino
Hallo,
versuch es mal so.
Option Explicit

Sub SortTabelle()
Dim meAr(), i As Integer

'absteigend = True, aufsteigend = False 
Const SortAbsteigend As Boolean = True
 
With ThisWorkbook
    Redim meAr(.Sheets.Count - 1)
     
    For i = 1 To ThisWorkbook.Sheets.Count
        meAr(i - 1) = .Sheets(i).Name
        If IsNumeric(meAr(i - 1)) Then meAr(i - 1) = meAr(i - 1) * 1
    Next i
     
    QuickSort meAr, Lbound(meAr), Ubound(meAr)
     
    Application.ScreenUpdating = False
        If SortAbsteigend Then
            'sortiere absteigend 
            For i = Ubound(meAr) To Lbound(meAr) + 1 Step -1
                .Sheets(CStr(meAr(i))).Move Before:=.Sheets(Ubound(meAr) - i + 1)
            Next i
        Else
            'sortiere aufsteigend 
            For i = Ubound(meAr) To Lbound(meAr) Step -1
                .Sheets(CStr(meAr(i))).Move After:=.Sheets(i + 1)
            Next i
        End If
    Application.ScreenUpdating = True
 
End With
End Sub

Sub QuickSort(ByRef sArray As Variant, ByVal MinElem As Long, MaxElem As Long)
Dim Mitte As Long
Dim vDummy As Variant
Dim i As Long, j As Long
 
    If MinElem > MaxElem Then
        Exit Sub
    End If
 
    Mitte = (MinElem + MaxElem) \ 2
 
    i = MinElem
    j = MaxElem
    Do
 
        Do While sArray(i) < sArray(Mitte)
            i = i + 1
        Loop
 
        Do While sArray(j) > sArray(Mitte)
            j = j - 1
        Loop
  
        If i <= j Then
 
            vDummy = sArray(j)
            sArray(j) = sArray(i)
            sArray(i) = vDummy
 
            i = i + 1
            j = j - 1
        End If
  
    Loop Until i > j
    QuickSort sArray, MinElem, j
    QuickSort sArray, i, MaxElem
End Sub
Gruß Tino
Anzeige
AW: Sortieren Tabellenblätter und löschen
22.09.2010 16:42:07
jens
Hallo Tino,
vielen Dank, ich versuche das zu testen aber er will das nicht ausführen.
Es steht so in einem eigenen Modul:
Option Explicit
Sub QuickSort(ByRef sArray As Variant, ByVal MinElem As Long, MaxElem As Long)
Dim Mitte As Long
Dim vDummy As Variant
Dim i As Long, j As Long
If MinElem > MaxElem Then
Exit Sub
End If
Mitte = (MinElem + MaxElem) \ 2
i = MinElem
j = MaxElem
Do
Do While sArray(i)  sArray(Mitte)
j = j - 1
Loop
If i  j
QuickSort sArray, MinElem, j
QuickSort sArray, i, MaxElem
End Sub

Warum führt er das nicht aus und zeigt es auch bei den Makros nicht an?
LG Jens
Anzeige
da fehlt die Sub SortTabelle oT.
22.09.2010 16:59:16
Tino
AW: da fehlt die Sub SortTabelle oT.
22.09.2010 17:22:29
jens
Hallo Tino,
vielen Dank.
Irgendwie blicke ich es aber nicht.
Das sind doch 2 völlig eigenständige Makros - oder?
Kannst Du den Code mal in der Form posten wie er im Modul steht? Dieses ganz breite ist nicht wirklich gut zu lesen.
Wenn ich das SortTabelle ausführe, dann sortiert er nach den internen Tabellennamen also (name) und nicht name.
Aber selbst bei diesen hat er 39,4,40,41,42...5,50
Der Tip von vorhin mit den 3stelligen Kundennummern geht, ich muß mal sehen, wie ich das umsetzen kann...
Falls diese hier gehen würde, wäre es natürlich schöner.
Hast Du eine Idee, wie man nachher die Tabellen 1:9999 oder 100-9999 wieder alle auf einen Schlag löschen/drucken kann?
Vielen Dank und viele Grüße Jens
Anzeige
AW: da fehlt die Sub SortTabelle oT.
22.09.2010 17:57:25
Tino
Hallo,
habe Dir ein Beispiel aufgebaut, zuerst Tabellen erstellen (Button drücken)
absteigend ist Sub Test1_Ab
aufsteigend ist Sub Test2_Auf
Diese befinden sich im Modul1.
Der Code zm sortieren befindet sich im Modul Modul1_Sortier_Code,
für dieses Beispiel etwas umgebaut.
https://www.herber.de/bbs/user/71634.xls
Gruß Tino
AW: da fehlt die Sub SortTabelle oT.
22.09.2010 22:00:59
jens
Hallo Tino,
vielen Dank, komischerweise geht es in Deiner Datei und in meiner nicht.
Ich glaube er sortiert nach (Namen) und nicht nach Namen wenn man in die VBA Umgebung sieht gibt es ja 2 Tabellennamen.
Hast Du da eine Idee?
Viele Grüße Jens
Anzeige
was geht nicht, und was glaubst du...
23.09.2010 07:49:48
robert
Hi,
bitte um konkrete angaben, denn Tinos beispiel funkt doch.
gruß
robert
AW: was geht nicht, und was glaubst du...
23.09.2010 11:20:47
jens
Hallo Robert/Tino,
stimmt in der Beispieldatei geht es.
Hier mal mein Beispiel als Screenshot.
https://www.herber.de/bbs/user/71636.xls
Die Reihenfolge stimmt nicht, bei den Eigenschaften sieht man ja, dass es 2 Namen gibt einmal (Name) und einmal Name.
Kann es daran liegen, dass ich ein paar Blätter ausgeblendet habe?
Es wäre zwar nett wenn das geht, ist aber nicht mehr so lebenswichtig weil ich jetzt die Kundennummern manipuliere (jetzt nur noch von 100-...).
Wichtig wäre für mich alle Tabellenblätter von 100-... markieren und drucken und anschließend löschen zu können - habt ihr da eine Idee?
Ich habe es mal mit
ActiveWorkbook.Sheets.Select versucht und würde sonst alle andern Blätter dektivieren, geht aber in meiner Datei auch nicht, wahrscheinlich wegen der ausgeblendeten Blätter.
Ich habe auch keinen Befehl gefunden mit dem man ein Blatt aus der Selection nehmen kann - kennt Ihr was?
Also braucht man wohl eine Schleife die alle Tabellenblätter von 1-99999 selektiert. Das kann ich dann drucken und anschliessend löschen...
Viele Grüße Jens
Anzeige
AW: was geht nicht, und was glaubst du...
23.09.2010 17:47:54
Tino
Hallo,
der Name in Klammern ist der Registername den Du auch in Excel sehen kannst.
Der Name außerhalb der Klammern ist der Code- Name oder das Objekt.
Was Du aber schließlich erreichen willst ist mir immer noch nicht klar geworden.
Habe mal die beiden Tabellen von Dir mit ins Beispiel eingebaut.
Beim sortieren aufsteigend, stehen diese am Ende der Datei,
beim sortieren absteigend stehen diese am Anfang.
Wenn ich Dich richtig verstehe, willst Du nur die Tabellen die eine Nummer als Namen haben
Drucken und danach löschen.
Versuche es mal mit diesem Code.
Sub Suchen_Drucken_Loeschen()
Dim i As Integer
With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
        
        With ThisWorkbook
            For i = .Sheets.Count To 1 Step -1
                 'Ist Tabellenname eine Zahl? 
                 If IsNumeric(.Sheets(i).Name) Then
                    'Tabelle ausdrucken 
'                    .Sheets(i).PrintOut 
                     'kurz warten, damit Druckauftrag verarbeitet werden kann 
                     'eventuell Zeit anpassen 
                     Application.Wait Now + TimeSerial(0, 0, 2)
                     DoEvents
                     'Tabelle löschen 
                    .Sheets(i).Delete
                 End If
            Next i
        End With
    
    .Calculation = xlCalculationAutomatic
    .EnableEvents = True
    .DisplayAlerts = True
    .ScreenUpdating = True
End With
End Sub
Bitte erst testen, nicht gleich 300 Seiten Drucken.
Gruß Tino
Anzeige
AW: was geht nicht, und was glaubst du...
23.09.2010 17:49:34
Tino
Hallo,
die Zeile
'                    .Sheets(i).PrintOut 
musst Du nach erfolgreichen Test aktivieren damit auch gedruckt wird.
Gruß Tino
AW: was geht nicht, und was glaubst du...
23.09.2010 18:03:20
jens
Hallo Tino,
das geht perfekt!!!!!!!!!!!!!!!!!!!!!!!!!!
Ich habe vor einer halben Stunde etwas zusammenbekommen:
Sub aaaaaTabellenLöschenZahl()
Dim wksWS As Worksheet
Application.DisplayAlerts = False
For Each wksWS In ActiveWorkbook.Worksheets
If Val(wksWS.Name) > 0 Then
wksWS.Delete
End If
Next wksWS
Sheets("(Leer)").Select
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True
End Sub
Das klappte zumindest mit dem Löschen - das (Leer)-Blatt würde sonst stehen bleiben.
Deine Geschichte ist natürlich eleganter - und man kann beides in einem machen - mit dem PDF-Creator ist es beim drucken auch kein Risiko.
In jedem Fall tausend Dank - ich bewundere es immer, wenn jemand wirklich programmieren kann.
Vielen Dank auch an Robert falls er reinsieht.
Ich wünsche noch einen schönen und sonnigen Abend.
Viele Grüße Jens
Anzeige
Danke,hab reingeschaut
23.09.2010 19:22:04
robert
Hi,
aber gegen Tino - keine Chance ;-))
gruß
robert

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige