Seiten NACH fortlaufendem Index einfügen
#1
Liebe Forum-Nutzer,

ich bin an eine (vorübergehende) Grenze gestoßen, und hoffe auf Euren Rat.
An sich ist es simpel; ich möchte blätter (Sheets) immer *hinter die letzte Seite* einfügen;
ohne die Reihenfolge des Index zu beeinflussen oder die ersten drei Seiten zu verändern (da läuft meine Datenauswertung).

so sieht mein Ansatz aus:


Dim j As Integer 'file counter
Dim k As Integer 'sheet counter
j = 1
k = 1
    For Each f In fso.getfolder(CSVPFAD).Files 'hier greift er auf die CSV Sheets in einem Ordner auf dem System zu
        Workbooks.OpenText Filename:=f.Path
        Set wbCSV = ActiveWorkbook
       
        If j = 1 Then
            Set ws = wbAUSWERTUNG.Worksheets.Add(after:=Sheets("Langzeitauswertung")) 'Idee dahinter: der erste wird direkt hinter sheet 3 eingefügt
            j = j + 1
        Else
            Set ws = wbAUSWERTUNG.Worksheets.Add(after:=Sheets(3 + k)) 'jedes weitere Profil mit Laufindex (wäre dann Position 5+)
            k = k + 1
        End If
       
        ws.Name = f.Name
        wbCSV.Worksheets(1).Range("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Semicolon:=True, TrailingMinusNumbers:=True
        wbCSV.Worksheets(1).Range("A:ZZ").Copy Destination:=ws.Range("A1")
        wbCSV.Close False
    Next
    Application.DisplayAlerts = True
    Set fso = Nothing
 

End Sub
-----------------------------
Das Ergebnis ist, dass er mir Sheets *Davor* ausgibt, und teils die Seiten mit Index 1-3 überschreibt, teils ganz nach hinten schiebt.
Ich sitze schon ein bisschen und hab so einiges probiert.

Vielen vielen Dank

Hannes
Top
#2
Hallo,

ein Blick in die Online Hilfe zeigt, dass mit

Code:
 Worksheets.Add After:=Sheets(Sheets.Count)
das Blatt immer an letzter Stelle eingefügt wird. Ich kann mir nicht vorstellen, das das Einfluss auf die bereits vorhandenen Blätter hat.
Beantwortet das die Frage?
vg, MM
[-] Folgende(r) 1 Nutzer sagt Danke an mmat für diesen Beitrag:
  • Hannes_Ulbricht
Top
#3
Vielen Dank, MM.
Diesen Code habe ich schon gesehen, und noch einmal getestet.
Er bewirkt, dass die neuen Seiten auf Platz 2 eingefügt werden,
nicht auf 4+ wie geplant (vor dem Generieren habe ich 3 Seiten).

Plan: 1) Auswertung 2) Angezeigt 3) Langzeitauswertung 4+) neue Profile
Tatsächlich: 1) Auswertung 2) neue Profile .... und Angezeigt und Langzeitauswertung

Möglicherweise weil ich den Index durch "Herumschieben der Seiten" beim Erstellen der
Arbeitsmappe verändert habe, und "Add Sheet" sich auf die "jüngste" Tabelle bezieht,
nicht auf dessen Indexrangnummer ?

Immerhin habe ich Tabelle 1 auf Position eins, jetzt muss ich noch die anderen beiden "vorn halten".
Im Vergleich zur letzten Methode, bei der alle 3 nach hinten ans Ende geschoben wurden, schon eine Verbesserung.


Dateien bitte im Forum hochladen: https://www.clever-excel-forum.de/thread-326.html
Top
#4
Dieser Code hat schonmal die neuen Seiten *hinter* den ersten 3 eingefügt, nur sind die ersten drei noch vertauscht.
https://www.excelforum.com/excel-program...kbook.html
Top
#5
Ansatz 1)
Dim ORDNUNG As Variant
Dim u As Long
Sheet1.Activate
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ORDNUNG = Array("AUSWERTUNG", "ANGEZEIGT", "LANGZEITAUSWERTUNG")
On Error Resume Next
    For u = UBound(ORDNUNG) To LBound(ORDNUNG) Step -1
        Worksheets(ORDNUNG(u).Move(Before:=Worksheets(1))
    Next u
On Error GoTo 0
Application.DisplayAlerts = True
Application.ScreenUpdating = True
____________________________________________________________________
Ansatz 2)
    For u = reihenfolge.Count To 1 Step -1
        Sheets(reihenfolge(u).Value).Move after:=reihenfolge.Parent)
    Next
   reihenfolge.Parent.Select
    Set reihenfolge = Nothing
_____________________________________________________________________
Ansatz 3)
 Dim N As Integer
 Dim M As Integer
 Dim FirstWSToSort As Integer
 Dim LastWSToSort As Integer
 Dim SortDescending As Boolean
'Sheet1 = "AUSWERTUNG" !
'Sheet2 = "ANGEZEIGT" !
'Sheet3 = "LANGZEITAUSWERTUNG" !
    SortDescending = False
        If ActiveWindow.SelectedSheets.Count = 1 Then
            FirstWSToSort = 1                           'Vielleicht der Grund, das "AUSWERTUNG" bereits vorn steht
            LastWSToSort = Worksheets.Count
        Else
            With ActiveWindow.SelectedSheets            'Mehrfachselektion sollte eigentlich nicht vorliegen
                For N = 2 To .Count
                    If .Item(N - 1).Index <> .Item(N).Index - 1 Then
                        MsgBox "You cannot sort non-adjacent sheets"
                        Exit Sub
                    End If
                Next N
                FirstWSToSort = .Item(1).Index
                LastWSToSort = .Item(.Count).Index
            End With
        End If
        For M = FirstWSToSort To LastWSToSort
            For N = M To LastWSToSort
                If SortDescending = True Then
                    If CInt(Mid(Worksheets(N).Name, 6)) > CInt(Mid(Worksheets(M).Name, 6)) Then
                        Worksheets(N).Move Before:=Worksheets(M)
                    End If
                Else
                    If CInt(Mid(Worksheets(N).Name, 6)) < CInt(Mid(Worksheets(M).Name, 6)) Then
                        Worksheets(N).Move Before:=Worksheets(M)
                    End If
                End If
            Next N
        Next M
End Sub
________________________________________________________
Alle drei Ansätze können leider nicht die ersten 3 Sheets einsortieren, und gleichzeitig die dynamisch eingelesenen anderen Sheets ignorieren.
Danke für Feedback!


MfG
HU
Top
#6
Dim ORDNUNG As Variant
Dim u As Long
Sheet1.Activate
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ORDNUNG = Array("AUSWERTUNG", "ANGEZEIGT", "LANGZEITAUSWERTUNG")
On Error Resume Next
    For u = UBound(ORDNUNG) To LBound(ORDNUNG) Step -1
        Worksheets(ORDNUNG(u)).Move(Before:=Worksheets(1)) = True
    Next u
On Error GoTo 0
Application.DisplayAlerts = True
Application.ScreenUpdating = True

Hat funktioniert ;)
Top
#7
Hallo,

Ich hab mich mal mit dem ursprünglichen Code aus dem ersten posting befasst (heute hab ich etwas mehr Zeit), ich verstehe garnicht wie da irgendwas funktioniert.

anstelle

Code:
Set ws = wbAUSWERTUNG.Worksheets.Add(after:=Sheets(3 + k))
muss es heissen
Code:
Set ws = wbAUSWERTUNG.Worksheets.Add(after:=wbAUSWERTUNG.Sheets(3 + k))

Oder in meiner Variante (wba = wbAUSWERTUNG)

Code:
 Set ws = wba.Worksheets.Add(after:=wba.Sheets(wba.Sheets.Count))
Hast du irgendwo Fehlermeldung, Alerts etc ausgeschaltet??
vg, MM
[-] Folgende(r) 1 Nutzer sagt Danke an mmat für diesen Beitrag:
  • Hannes_Ulbricht
Top
#8
Ja, danke für den Tipp, dass habe ich. Der Vollständigkeit halber:
____________________________________________________
Dim ORDNUNG As Variant
Dim u As Long
Sheet1.Activate
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ORDNUNG = Array("AUSWERTUNG", "ANGEZEIGT", "LANGZEITAUSWERTUNG")
On Error Resume Next
    For u = UBound(ORDNUNG) To LBound(ORDNUNG) Step -1
        Worksheets(ORDNUNG(u)).Move(Before:=Worksheets(1)) = True
    Next u
On Error GoTo 0
Application.DisplayAlerts = True
Application.ScreenUpdating = True
_________________________________________________________

Damit sortiere ich zwar die folgenden Seiten nicht, aber ich habe die ersten Drei in Position, darauf kam es mir an.
Top


Gehe zu:


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