Registriert seit: 22.02.2019
Version(en): 19
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
Registriert seit: 27.12.2018
Version(en): 2003,2010
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:1 Nutzer sagt Danke an mmat für diesen Beitrag 28
• Hannes_Ulbricht
Registriert seit: 22.02.2019
Version(en): 19
08.03.2019, 10:34
(Dieser Beitrag wurde zuletzt bearbeitet: 08.03.2019, 10:36 von WillWissen.
Bearbeitungsgrund: Link zum Fremdhoster entfernt
)
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
Registriert seit: 22.02.2019
Version(en): 19
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
Registriert seit: 22.02.2019
Version(en): 19
08.03.2019, 11:36
(Dieser Beitrag wurde zuletzt bearbeitet: 08.03.2019, 11:46 von Hannes_Ulbricht.)
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
Registriert seit: 22.02.2019
Version(en): 19
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 ;)
Registriert seit: 27.12.2018
Version(en): 2003,2010
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:1 Nutzer sagt Danke an mmat für diesen Beitrag 28
• Hannes_Ulbricht
Registriert seit: 22.02.2019
Version(en): 19
11.03.2019, 11:45
(Dieser Beitrag wurde zuletzt bearbeitet: 11.03.2019, 11:46 von Hannes_Ulbricht.)
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.