Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1772to1776
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

3 Worksheet in neues Workbook

3 Worksheet in neues Workbook
28.07.2020 22:42:30
Richard
Liebe Experten,
ich verzweifle an folgendem Problem. Die genutzten Excel-Versionen sind Excel 2010 bzw. 2019.
Ich will aus einem Template regelmäßig (monatlich) bestimmte Auswertungen (Worksheets) in eine neue Excel-Datei (Workbook) kopieren. Dabei sollen nur die Werte und Formate übernommen werden.
Aktuell sind es drei Auswertungen, die den CodeName Tabelle12, Tabelle13, Tabelle14 haben. Die internen Nummern (Index) sind 14, 15, 16. Es könnten aber auch noch weitere Tabellen mit dann anderen Indexnummern dazu kommen.
Die sichtbaren Tabellenbezeichnungen (z.B. Finanzanalyse lfd Periode) will ich nicht zur Adressierung nutzen, da diese durch einen unbedarften Nutzer versehentlich verändert werden könnten.
Ich bin das Thema so angegangen, dass ich zunächst die Tabellen in neue Worksheets kopiere, dann die Werte und Formate aus der Quelle übertrage und in ein neues Workbook kopiere. Schließlich will ich die neu angelegten Worksheets löschen und das neue Workbook schließen.
Das klappt mit einer Tabelle auch sehr gut. Es klappt auch mit drei Tabellen sogar fast perfekt, wenn ich die neu angelegten Worksheets nicht lösche (also Fette und kursive Zeile auskommentiert ist). „Fast“, weil in dem neuen Workbook die erste der drei Tabellen Formelbezüge auf die Quelltabelle hat, obwohl in dem angelegten Worksheet nur Zahlen enthalten sind.
Wenn ich die Worksheets löschen will, funktioniert dies mit dem zweiten und dem dritten Worksheet ohne Probleme. Das erste Worksheet bleibt jedoch erhalten und das Makro stoppt bei n =3 mit einem „Index außerhalb des Bereiches“.
Ich habe mir mit dem Debugger schon mehrfach alle Werte anzeigen lassen, finde aber den Fehler nicht, warum er beim letzten Löschvorgang die Tabelle nicht mehr findet. Überhaupt verstehe ich nicht, warum er zunächst die zweite und dann die dritte Tabelle löscht. Die Reihenfolge des Löschvorganges sollte gemäß der For-Next-Schleife bzw. des Array ja eigentlich anders sein…
Irgendwas mache ich entweder beim Befüllen des Array oder auch bei der Adressierung der Tabellen falsch, komme aber nicht darauf
Kann mir jemand einen Hinweis geben, warum ich das eine Worksheet nicht löschen kann und warum _ plötzlich wieder Formelverknüpfungen vorhanden sind?

Sub ExportExcel()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim wkbQuelle As Workbook
Dim wkbZiel As Workbook
Dim wksTab As Worksheet
Dim wksZiel As Worksheet
Dim strWksName As String
Dim lngAnzahlTab As Long
Dim arrAnalysen As Variant
Dim n As Integer
Set wkbQuelle = ThisWorkbook
Call Dateimanagement		'ermittelt Variablen für Dateinamenserstellugn
ReDim arrAnalysen(1 To 9)
' Array für Tabellenblätter befüllen
' 1-3 = Index-Nummer der auszugebenden Tabellen
' 2-6 = Name für neue Tabelle
' 7-9 = Index-Nummer der neu angelegte Worksheet
arrAnalysen(1) = 14        ' Tabelle Finanzanalyse Periode
arrAnalysen(2) = 15        ' Tabelle Finanzanalyse Verlauf
arrAnalysen(3) = 16        ' Tabelle Mehrjahresvergleich
' Namen der Register in Array Schreiben
arrAnalysen(4) = "Analyse lfd Periode"
arrAnalysen(5) = "Analyse Verlauf"
arrAnalysen(6) = "Mehrjahresvergleich"
For n = 1 To 3
'#### temporäres Blatt anlegen und Array hinschreiben
'Namen des temporären Blattes festlegen
strWksName = strJahr & " " & strMonat & " " & arrAnalysen(n + 3)
' Prüfen, ob Tabellenblatt (noch) existiert
For Each wksTab In ActiveWorkbook.Worksheets
If wksTab.Name = strWksName Then
wksTab.Delete
End If
Next
Worksheets.Add after:=Worksheets(Worksheets.Count)      ' Neues Register anlegen an der  _
letzten Position
ActiveSheet.Name = strWksName
Set wksZiel = ActiveSheet                        ' Eingefügtes Blatt als temporäres Blatt   _
_
_
festlegen
arrAnalysen(n + 6) = ActiveSheet.Index    ' Index-Nummer des angelegten Blattes speichern
'Debug.Print arrAnalysen(n + 6) & "   " & ActiveSheet.Index & "  " & ActiveSheet.Codename & " _
_
_
" & n + 6
'########## ohne Formeln kopieren
Sheets(arrAnalysen(n)).UsedRange.Copy
With wksZiel
.Cells(1, 1).PasteSpecial Paste:=xlPasteValues
.Cells(1, 1).PasteSpecial Paste:=xlPasteFormats
.UsedRange.WrapText = False
.Columns.AutoFit
.Rows.AutoFit
End With
Next n
' temporäre Tabellen in neues Workbook übertragen und löschen
' Dateinamen Festlegen
strDateiN = strPfad & strOrdner & strJahr & "_" & strMonat & "_Finanzanalysen_" & strFirma & _
_
_
".xlsx"
lngAnzahlTab = Application.SheetsInNewWorkbook    ' Auslesen Standardanzahl Register Excel
Application.SheetsInNewWorkbook = 1               'Standardanzahl Register auf 1 setzen
Set wkbZiel = Workbooks.Add
Application.SheetsInNewWorkbook = lngAnzahlTab    ' Standardanzahl Register zurückschreiben
For n = 1 To 3
'Debug.Print n & "   " & n + 6
'Debug.Print " Name " & wkbQuelle.Sheets(arrAnalysen(n)).Name & " CodeN:" & wkbQuelle. _
Sheets(arrAnalysen(n)).CodeName
wkbQuelle.Sheets(arrAnalysen(n)).Copy after:=wkbZiel.Sheets(wkbZiel.Sheets.Count)
Application.Goto reference:=Range("A1")
'Debug.Print arrAnalysen(n + 6) & " Name " & wkbQuelle.Sheets(arrAnalysen(n + 6)).Name & "   _
_
_
CodeN:" & wkbQuelle.Sheets(arrAnalysen(n + 6)).CodeName
wkbQuelle.Sheets(arrAnalysen(n + 6)).Delete
Next n
wkbZiel.Sheets(1).Delete
' Speicherung
wkbZiel.Close savechanges:=True, Filename:=strDateiN
' Erledigungsvermerk in Tabelle Anleitung setzen
With Tabelle99
.Cells(16, 3).ClearContents
.Cells(16, 3).Value = "erledigt: " & Format(Now, "dd.mm.yyyy hh:mm:ss") & vbLf &  _
strDateiN
End With
'Debug.Print "Ende: " & Now
MsgBox "Die Analyse wurde als Excel-Datei abgelegt unter: " & vbLf & vbLf & strDateiN, _
vbInformation, "Analysen per" & dtStichtag & " exportiert"
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Lösch mal das letzte WS per Hand.
29.07.2020 00:26:52
lupo1
AW: Lösch mal das letzte WS per Hand.
29.07.2020 07:08:10
Richard
Hallo lupo1,
vielen Dank für den Hinweis. Aber was kann ich denn aus der manuellen Löschung für das Skript lernen?
Gar nichts. Weil man gar nicht löschen kann.
29.07.2020 07:58:42
lupo1
Wieso fragen die Leute immer, statt zu versuchen, was man ihnen sagt?
Was ist also die Konsequenz?
29.07.2020 08:24:25
lupo1
Vor dem Löschen des letzten Blatts liest Du seinen Namen aus.
Dann kopierst Du die "neuen" Blätter hinein.
Und dann löschst Du das letzte "alte" Blatt, dessen Namen Du nun hast.
AW: Was ist also die Konsequenz?
30.07.2020 11:01:48
Richard
Lieber lupo1,
zunächst einmal bitte ich um Entschuldigung für die späte Rückmeldung. Ich war gestern ab 8 Uhr offline. Ebenfalls Entschuldigung für die zweimal gesendete Antwort um kurz nach 7 bzw. kurz vor 8 Uhr. Das war ein Versehen und hat hoffentlich nicht zu Missverständnissen geführt.
Es funktioniert! Vielen herzlichen Dank für Deine Unterstützung.
Allerdings ist mir nicht klar, warum es jetzt funktioniert. Genau das Vorgehen, welches Du in Deinem Hinweis beschreibst, sollte mein Code auch leisten – nur eben nicht mit dem Tabellennamen, sondern mit dem Tabellenindex.
Warum? Wenn ich bei meinen bisherigen Templates mit dem Namen bzw. dem internen Namen ( „Tabelle12“ etc.) adressiert habe, bin ich immer wieder auf Fehler gestoßen, meistens Objekt- oder Methodenfehler, selten Laufzeitfehler. Daher habe ich meinen Code hier versucht, komplett auf Index umzustellen. Und das Array war auch mit den richtigen Indexnummern gefüllt. Insofern wäre ich für einen Hinweis, wo mein Denkfehler war und warum für Excel dann eine Tabelle "gar nicht" mehr da gewesen sein soll, dankbar.
Deine Frage „Wieso fragen die Leute immer, statt zu versuchen, was man ihnen sagt?“ kann ich Dir natürlich nicht beantworten, da ich nicht „die Leute“ bin.
Ich kann Dir aber verraten, warum ich gefragt habe. Schlicht und einfach, weil ich Deinen Hinweis mit dem Löschen nicht verstanden habe. Ich bin bzgl. Excel-VBA Quereinsteiger. Ich bin Finanzchef eines kleinen Unternehmens und als solcher habe ich mir mithilfe verschiedener Bücher (u.a. von B. Held, bin für Hinweise immer offen) und Forumsrecherchen Excel-VBA erst vor rund 1,5 -2 Jahren angefangen, selbst beizubringen. Das mache ich, weil ich Templates brauche, damit MitarbeiterInnen mit unterschiedlichen, aber im Schnitt recht geringen Excelkenntnissen, die benötigten Auswertungen „nach Schema F“ erstellen können und ich nicht selbst jeden Monat Stunden mit Datenimporten, kopieren und speichern etc. verbringe.
Das bedeutet aber auch, dass mir tatsächlich viele Basics (noch) nicht so geläufig sind, meine Skripte wahrscheinlich unelegant oder kompliziert sind und ich Fehlermeldungen bekomme, die ich zwar grds. verstehe (klar, der Laufzeitfehler resultierte daraus, dass die Tabelle „gar nicht“ da war). Aber ich verstehe dann häufig nicht, warum bzw. wo in meinem Skript ich diesen Fehler angelegt habe. Und dann frage ich im Forum an, um zu lernen.
Daher bedanke ich mich bei Dir jetzt nochmals ganz herzlich dafür, dass Du mir mit Deinem Hinweis geholfen hast, meine Fähigkeiten weiter zu entwickeln und so das Problem zu lösen.
Ich lasse diesen Eintrag noch ein wenig offen, falls Du oder jemand anderes noch bzgl. des „Warum“ etwas ergänzen möchtest und schließe ihn dann erst in Kürze.
Für alle anderen, denen es vielleicht ähnlich wie mir geht, füge ich das jetzt funktionierende Skript an. Ich selbst habe viele Einträge im Internet zu dem Thema „verschieben von WKS in neues WKB“ gelesen und getestet, aber mit keinem bin ich vollständig zum erwünschten Ergebnis gekommen; irgendwas fehlte immer oder funktionierte nicht.
Viele liebe Grüße
Richard
Sub ExportExcel()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim wkbQuelle As Workbook
Dim wkbZiel As Workbook
Dim wksTab As Worksheet
Dim wksZiel As Worksheet
Dim strWksName As String
Dim lngAnzahlTab As Long
Dim arrAnalysen As Variant
Dim n As Integer
Set wkbQuelle = ThisWorkbook
Call Dateimanagement                  ' ermittelt benötigte Daten für Pfad- und Dateinamen
' Auswertungsblätter auswählen
ReDim arrAnalysen(1 To 9)
' Array für Tabellenblätter befüllen
' 1-3 = Name der auszugebenden Tabellen
' 2-6 = Name für neue Tabelle
' 7-9 = Name des neuen Blattes speichern
arrAnalysen(1) = Tabelle12.Name        ' Tabelle Finanzanalyse Periode
arrAnalysen(2) = Tabelle13.Name        ' Tabelle Finanzanalyse Verlauf
arrAnalysen(3) = Tabelle14.Name        ' Tabelle Mehrjahresvergleich
' zukünftigen Namen der Register in Array Schreiben
arrAnalysen(4) = "Analyse lfd Periode"
arrAnalysen(5) = "Analyse Verlauf"
arrAnalysen(6) = "Mehrjahresvergleich"
'#### temporäre Blatt anlegen und Namen in Array schreiben
For n = 1 To 3
'Namen des temporären Blattes festlegen
strWksName = strJahr & " " & strMonat & " " & arrAnalysen(n + 3)
' Prüfen, ob Tabellenblatt (noch) existiert; ggf. löschen
For Each wksTab In ActiveWorkbook.Worksheets
If wksTab.Name = strWksName Then
wksTab.Delete
End If
Next wksTab
'Tabellenblatt anlegen
Worksheets.Add after:=Worksheets(Worksheets.Count)      ' Neues Register anlegen an der  _
letzten Position
ActiveSheet.Name = strWksName
Set wksZiel = ActiveSheet                               ' Eingefügtes Blatt als temporäres  _
Blatt festlegen
arrAnalysen(n + 6) = ActiveSheet.Name
'########## ohne Formeln kopieren
Sheets(arrAnalysen(n)).UsedRange.Copy
With wksZiel
.Cells(1, 1).PasteSpecial Paste:=xlPasteValues
.Cells(1, 1).PasteSpecial Paste:=xlPasteFormats
.UsedRange.WrapText = False
.Columns.AutoFit
.Rows.AutoFit
End With
Next n
' temporäre Tabellen in neues Workbook übertragen und löschen
' Dateinamen Festlegen
strDateiN = strPfad & strOrdner & strJahr & "_" & strMonat & "_Finanzanalysen_" & strFirma & " _
.xlsx"
lngAnzahlTab = Application.SheetsInNewWorkbook    ' Auslesen Standardanzahl Register Excel
Application.SheetsInNewWorkbook = 1               'Standardanzahl Register auf 1 setzen
Set wkbZiel = Workbooks.Add
Application.SheetsInNewWorkbook = lngAnzahlTab    ' Standardanzahl Register zurückschreiben
'Löschen der temporären Worksheets
For n = 1 To 3
wkbQuelle.Sheets(arrAnalysen(n)).Copy after:=wkbZiel.Sheets(wkbZiel.Sheets.Count)
Application.Goto reference:=Range("A1")
wkbQuelle.Sheets(arrAnalysen(n + 6)).Delete
Next n
' löschen des bei Anlage des neuen Workbooks automatisch erstellten ersten Tabellenblattes
wkbZiel.Sheets(1).Delete
' Speicherung exportierte Datei
wkbZiel.Close savechanges:=True, Filename:=strDateiN
' Erledigungsvermerk in Tabelle Anleitung setzen
With Tabelle99
.Cells(16, 3).ClearContents
.Cells(16, 3).Value = "erledigt: " & Format(Now, "dd.mm.yyyy hh:mm:ss") & vbLf & strDateiN
End With
' Informationsausgabe an User
MsgBox "Die Analyse wurde als Excel-Datei abgelegt unter: " & vbLf & vbLf & strDateiN, _
vbInformation, "Analysen per" & dtStichtag & " exportiert"
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Anzeige
Also noch einmal: XL kann nicht null Sheets haben
30.07.2020 15:57:23
lupo1
... sondern immer mindestens eins.
Das solltest Du händisch einmal machen, damit Du merkst, warum VBA das genauso wenig kann. Können darf!
Löscht man nun alle alten Blätter, baut man ein Error Next ein. Wenn das eingetreten ist, fügt man alle gewünschten Sheets DAHINTER ein und löscht anschließend Sheets(1).
Natürlich kann man das auch ohne forcierten Error tun.
AW: Also noch einmal: XL kann nicht null Sheets haben
31.07.2020 12:20:18
Richard
Hi,
jetzt ist der Groschen gefallen. Aber ich hatte weder in Excel noch im Debugger erkannt, dass der Code die Blätter auf 0 setzten wollte.
Vielen Dank und schönes Wochenende
Richard
vielen Dank. Jetzt ist der Groschen gefallen. Aber bei Deiner ersten Mail habe ich weder in Excel noch im Debugger erkannt, dass ich versuche, das letzte Blatt zu löschen.
Vielen Dank und schönes Wochenende
Frank
Anzeige
AW: Lösch mal das letzte WS per Hand.
29.07.2020 07:57:21
Richard
Hallo lupo1,
vielen Dank für den Hinweis. Aber was kann ich denn aus der manuellen Löschung für das Skript lernen?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige