Live-Forum - Die aktuellen Beiträge
Datum
Titel
03.05.2024 10:49:02
03.05.2024 10:43:56
03.05.2024 07:38:32
Anzeige
Archiv - Navigation
1928to1932
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

Tabellenblätter löschen

Tabellenblätter löschen
16.05.2023 09:59:54
Filikos

Liebe VBA-Cracks, ich komme mit einem Skript nicht weiter. Ich möchte in einer Datei alle Tabellenblätter löschen bis auf ein bestimmtes Blatt. Die Blätter werden jedoch nicht gelöscht und das Skript läuft nicht bis zum Schluss durch. Zur Fehlersuche habe ich einen alternativen Code verwendet und anstelle des Lösch-Befehls das Einfärben der Register getestet. Dies funktioniert einwandfrei und das Skript läuft bis zum Schluss durch. Was ist falsch? Danke für die Hilfe.


Option Explicit
Sub Extern_Publikation_FI()

'Variablendeklaration
Dim strPfad As String
Dim strPublikationsdatei As String
Dim mySheet As String
Dim ws As Worksheet

'Variablenwerte
strPfad = ThisWorkbook.Path & "\"
strPublikationsdatei = "FI_2023"
mySheet = "FTE_Extern Test_FI"


'---------
'Start
'---------
'Datei kopieren
ThisWorkbook.Sheets.Copy


'Neue Datei abspeichern als .xlsx-Datei
With ActiveWorkbook
.SaveAs Filename:=strPfad & strPublikationsdatei, FileFormat:=xlOpenXMLWorkbook
End With

'Tabellenblätter entfernen
Application.DisplayAlerts = False
For Each ws In ActiveWorkbook.Worksheets
If ws.Name > mySheet Then

'Löschen funktioniert nicht
ws.Delete

'Einfärben der Register funktioniert
'ws.Tab.ColorIndex = 3
End If
Next ws
Application.DisplayAlerts = True

'Neue Datei schliessen
With ActiveWorkbook
.Save
.Close
End With

'---------
'Ende
'---------

MsgBox "Publikationsdatei FI_2023 ist erstellt!" & vbNewLine & vbNewLine & "Dateiablage: " & vbNewLine & strPfad

Exit Sub
FehlerMarke:
MsgBox "Es ist ein Fehler aufgetreten. Das Makro wurde nicht ausgeführt."
End Sub

28
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabellenblätter löschen
16.05.2023 10:13:21
onur
"das Skript läuft nicht bis zum Schluss durch" - Was soll das denn heissen ?


AW: Tabellenblätter löschen
16.05.2023 11:10:06
Filikos
Ich habe zwei offene Dateien: die Datei, aus welcher ich das Skript starte und die neu erzeugte Datei. Letztere enthält alle ursprünglichen Register. Das Löschen wurde nicht ausgeführt, die Datei wird nicht geschlossen und die Message-Box wird nicht ausgegeben.


AW: Tabellenblätter löschen
16.05.2023 11:17:12
Pappawinni
Kann es vielleicht sein, dass mySheet so nicht existiert, also nicht mit dem Namen, denn dann würden ja alle Blätter gelöscht werden, was aber nicht geht.
Kann aber auch nach deiner Beschreibung eigentlich nicht sein.

Aber wenn du da schon eine Fehlermarke hast, dann lass dir da doch was aussagekräftiges ausgeben, also vielleicht
MsgBox "Fehler Nummer" & Err.Number & vbCrLf & Err.Description
und dann muss natürlich am Anfang von deinem Code irgendwo
On Error GoTo FehlerMarke
stehen, sonst bringt die Fehlermarke auch nichts.


Anzeige
AW: Tabellenblätter löschen
16.05.2023 11:25:47
Jowe
Hallo,
bei mir läuft's durch und macht genau das was die Programmierung vorgibt.
Option Explicit

Sub Extern_Publikation_FI()
  'Variablendeklaration
  Dim strPfad As String
  Dim strPublikationsdatei As String
  Dim mySheet As String
  Dim ws As Worksheet
  'Variablenwerte
  strPfad = ThisWorkbook.Path & "\"
  strPublikationsdatei = "FI_2023"
  mySheet = "FTE_Extern Test_FI"
  '---------
  'Start
  '---------
  'Datei kopieren
  ThisWorkbook.Sheets.Copy
  'Neue Datei abspeichern als .xlsx-Datei
  With ActiveWorkbook
  .SaveAs Filename:=strPfad & strPublikationsdatei, FileFormat:=xlOpenXMLWorkbook
  End With
  'Tabellenblätter entfernen
  Application.DisplayAlerts = False
  For Each ws In ActiveWorkbook.Worksheets
    If ws.Name > mySheet Then
      'Löschen funktioniert nicht
      ws.Delete
      'Einfärben der Register funktioniert
      'ws.Tab.ColorIndex = 3
    End If
  Next ws
  Application.DisplayAlerts = True
  'Neue Datei schliessen
  With ActiveWorkbook
    .Save
    .Close
  End With
  '---------
  'Ende
  '---------
  MsgBox "Publikationsdatei FI_2023 ist erstellt!" & vbNewLine & vbNewLine & "Dateiablage: " & vbNewLine & strPfad
  Exit Sub
FehlerMarke:
  MsgBox "Es ist ein Fehler aufgetreten. Das Makro wurde nicht ausgeführt."
End Sub
Gruß
Jochen


Anzeige
AW: Tabellenblätter löschen
16.05.2023 11:26:21
Pappawinni
und wirf das raus

'Neue Datei abspeichern als .xlsx-Datei
With ActiveWorkbook
.SaveAs Filename:=strPfad & strPublikationsdatei, FileFormat:=xlOpenXMLWorkbook
End With
und mach am Ende

'Neue Datei speichern und schliessen
With ActiveWorkbook
  .SaveAs Filename:=strPfad & strPublikationsdatei, FileFormat:=xlOpenXMLWorkbook
  .Close
End With


AW: Tabellenblätter löschen
16.05.2023 11:36:05
Filikos
1.
Der korrekt Einbau der Fehlermeldung bringt keinen Erfolg: es wird kein Fehler ausgegeben. Die beiden Dateien bleiben wie beschrieben offen - aber ohne dass in der neuen Datei die gewünschten Blätter gelöscht würden.

2.
Wenn ich den Code für das Generieren der Datei ans Ende Stelle, wird keine neue Datei erzeugt. Hier der geänderte Code:

Option Explicit
Sub Extern_Publikation_FI()

'Variablendeklaration
Dim strPfad As String
Dim strPublikationsdatei As String
Dim mySheet As String
Dim ws As Worksheet

'Variablenwerte
strPfad = ThisWorkbook.Path & "\"
strPublikationsdatei = "FI_2023"
mySheet = "FTE_Externes Personal_DPM_FI"


'---------
'Start
'---------
On Error GoTo FehlerMarke

'Datei kopieren
ThisWorkbook.Sheets.Copy


'Tabellenblätter entfernen
Application.DisplayAlerts = False
For Each ws In ActiveWorkbook.Worksheets
    If ws.Name > mySheet Then
        
        'Löschen funktioniert nicht
        ws.Delete
        
        'Einfärben der Register funktioniert
        'ws.Tab.ColorIndex = 3
    End If
Next ws
Application.DisplayAlerts = True

With ActiveWorkbook
    .SaveAs Filename:=strPfad & strPublikationsdatei, FileFormat:=xlOpenXMLWorkbook
    .Close
End With


'---------
'Ende
'---------

Exit Sub

FehlerMarke:
        MsgBox "Fehler Nummer" & Err.Number & vbCrLf & Err.Description

End Sub


Anzeige
AW: Tabellenblätter löschen
16.05.2023 12:05:38
Pappawinni
kannst du die Arbeitsblätter dann zu Fuß löschen ?


AW: Tabellenblätter löschen
16.05.2023 12:08:34
Filikos
Du meinst manuelles Löschen? Ja, das geht problemlos: Gruppieren und Delete - und weg sind sie. Es ist kein Schreib- oder Blattschutz vorhanden.


AW: Tabellenblätter löschen
16.05.2023 12:20:31
Pappawinni
Merkwürdig..
Setzte doch mal in die For Each eine Msgbox oder ein debug.print, das die Namen der Blätter ausgibt, also
debug.print ws.name
oder, wenn es nicht zu viele sind
msgbox ws.name
Die Ausgabe von debug.print siehst du im Direktfester..


AW: Tabellenblätter löschen
16.05.2023 12:39:41
Filikos
Ausgabe: Fehler Nummer-2147221080 Automatisierungsfehler. Ich habe im Forum-Archiv unter der Nummer 1376to1380 was gefunden. Könnte das mit ThisWorkbook / ActiveWorkbook zu tun haben? Warum aber funktioniert denn das z.B. Ändern der Farbe oder das Ausblenden der Sheets problemlos?


Anzeige
AW: Tabellenblätter löschen
16.05.2023 12:46:25
GerdL
Hallo Filikos,

ein andere Schleife fürs Löschen..
Dim a As Integer
'Tabellenblätter entfernen
Application.DisplayAlerts = False
For a = ActiveWorkbook.Sheets.Count To 1 Step -1
    With ActiveWorkbook.Sheets(a)
    If .Name > mySheet Then
        
        'Löschen funktioniert ?
        .Delete
        
        'Einfärben der Register funktioniert
        'ws.Tab.ColorIndex = 3
    End If
    End With
Next
Ich frage mich, weshalb du erst alle (sichtbaren) Blätter aus einer Datei in eine neue Datei kopierst u. dort bis auf ein Blatt alle löschen willst.

Gruß Gerd


Anzeige
AW: Tabellenblätter löschen
16.05.2023 13:38:08
Filikos
Hallo Gerd, diese Variante hatte ich auch schon versucht. Zur Sicherheit aber nochmals: das Ergebnis ist identisch erfolglos. Zu deiner Frage: ich habe 15 verschiedene Datenquellen, welche über Power-Query aufbereitet werden. Je nach Empfänger sind die Daten, welche versendet werden, etwas anders. Statt nun zig Dateien von Hand zu kopieren, die Verbindungen zu löschen, die nicht relevanten Register zu löschen etc., soll das über einen Makro-Befehl passieren. Das funktioniert alles - aber eben nicht das Löschen bestimmter Blätter.


AW: Tabellenblätter löschen
16.05.2023 13:57:11
Pappawinni
Das Problem ist, wir können den Fehler nicht nachstellen.
Bei meinen einfachen Testfällen funktioniert das reibungslos.
Man kann viel ändern, aber im Grunde müsste es ja funktionieren..
Ich hab es jetzt mal so:

'Datei kopieren
ThisWorkbook.Sheets.Copy
Dim wbkNew As Workbook
Set wbkNew = ActiveWorkbook

Application.DisplayAlerts = False
For Each ws In wbkNew.Worksheets
    If Not (ws.Name = mySheet) Then
        Debug.Print ws.Name
        ws.Delete
    End If
Next ws
Application.DisplayAlerts = True

'Neue Datei speichern und schliessen
With wbkNew
  .SaveAs Filename:=strPfad & strPublikationsdatei, FileFormat:=xlOpenXMLWorkbook
  .Close
End With

Ich fürchte aber, dass das bei dir auch nichts ändert...


Anzeige
AW: Tabellenblätter löschen
16.05.2023 14:51:05
Pappawinni
Vielleicht auch mal die Application.DisplayAlerts in die Schleife, statt außen und noch ein on Error Resume Next dazu..

                On Error Resume Next
                Application.DisplayAlerts = False
                ws.Delete
                Application.DisplayAlerts = True
                On Error GoTo FehlerMarke


AW: Tabellenblätter löschen
16.05.2023 15:46:20
Filikos
Ja, die Befürchtung trifft zu. Ich schätze, dass das Problem vermutlich weniger mit falscher Codierung zu tun hat, sondern mit der Systemumgebung.


AW: Tabellenblätter löschen
16.05.2023 16:10:09
Pappawinni
Du kannst ja auch mal neues Workbook erstellen, dort ein Arbeitsblatt auf den "speziellen Namen" umbenennen, dein Makro rein setzen, das speichern und schliessen kannst du da auch auskommentieren und wenn da das Löschen nicht funktioniert, dann ist etwas oberfaul..


Anzeige
AW: Tabellenblätter löschen
16.05.2023 16:18:29
Filikos
Ergebnis: oberfaul - leider.


AW: Tabellenblätter löschen
16.05.2023 13:59:45
Daniel
hI
ganz blöde Frage:
wenn du nur ein Blatt in der neuen Datei haben willst, warum kopierst du dann alle Blätte in die neue Datei?
kopiere doch einfach nur das Blatt, dass du brauchst und spar dir das löschen.
Gruß Daniel


Anzeige
AW: Tabellenblätter löschen
16.05.2023 15:48:52
Filikos
Hi Daniel, wie weiter oben beschrieben: das ganze ist nur ein kleiner Teil der Fragestellung. Je nach Adressaten braucht es andere Daten aus dem einen Quellsheet. Einige erhalten alle TAB, andere TAB A/B/C/D, andere nur TAB A. Deshalb das Löschen.


AW: Tabellenblätter löschen
16.05.2023 15:50:59
Filikos
Die Idee war eigentlich, die jeweils relevanten TAB in ein Array zu schreiben, dann über eine Schlaufe alle TAB zu prüfen. Die einen ins "Körbchen", die anderen eben löschen.


AW: Tabellenblätter löschen
16.05.2023 16:39:56
Daniel
Warum nicht alle relevanten Tabs markieren (als Gruppe) und dann gemeinsam in einem Schritt in die neue Datei übernehmen?

Wenn beispielsweise dein String xxx die Namen der zu verschiebenden Tabellenblätter enthält, dann so:
xxx = "Tabelle1, Tabelle2, Tabelle4"
thisworkbook.activate
check = true
for each ws in thisworkbook.Worksheets
    if instr(xxx, ws.Name) > 0 then
        ws.Select check
        check = false
    end if
next
if not check then ActiveWindow.SelectesSheets.Copy
ansosnten ist es halt gefährlich, mit ActiveWorkbook zu arbeiten, weil sich das auch mal ändern kann.
ich würde direkt nach dem ThisWorkbook.Sheets.Copy das dabei neu erstellte Workbook einer Variable übergeben und dann die Variable anstelle von ActiveWorkbook verwenden. Dann bist du da relativ sicher, dass die Befehle auf das richtige Workbook geleitet werden und nicht aus versehen auf das falsche, auch beim Testen im Einzelstepmodus, wenn du paralles in Excel schaust, was dein Makro grade macht.

also in etwa so
dim WB as Workbook
dim ws as worksheet
thisworkbook.Sheets.copy
set wb = ActiveWorkbook
for each ws in wb.worksheets
    if ws.Name > "xxx wie auch immer" AND wb.Worksheets.count > 1 then ws.Delete
next
Gruß Daniel


Anzeige
AW: Tabellenblätter löschen
16.05.2023 18:06:33
Pappawinni
oder..


Sub Extern_Publikation_FI()
          
          'Variablendeklaration
          Dim strPfad As String
          Dim strPublikationsdatei As String
          Dim mySheet As String
          Dim ws As Worksheet
          Dim sheetsToCopy() As Variant
          
          'Variablenwerte
          strPfad = ThisWorkbook.Path & "\"
          strPublikationsdatei = "FI_2023"
          mySheet = "FTE_Externes Personal_DPM_FI"
          
          sheetsToCopy = Array("Tabelle1", "Tabelle2")
          
          '---------
          'Start
          '---------
          On Error GoTo FehlerMarke
          
          'Datei kopieren
          ThisWorkbook.Activate
          ThisWorkbook.Sheets(sheetsToCopy).Copy
                  
          With ActiveWorkbook
              .SaveAs Filename:=strPfad & strPublikationsdatei, FileFormat:=xlOpenXMLWorkbook
              .Close
          End With
          
          
          '---------
          'Ende
          '---------
          
          Exit Sub
          
FehlerMarke:
                  MsgBox "Fehler Nummer" & Err.Number & vbCrLf & Err.Description
          
          End Sub




AW: Tabellenblätter löschen
22.05.2023 15:22:46
Filikos
Hallo Daniel, danke für deine Inputs - ich werde das Skript umbauen und zwar mit der Copy-Variante der relevanten Tabellenblätter. Und ja, guter Hinweise betreffend der "sicheren" Variante bzgl. dem Workbook. Das werde ich auch einbauen. Mit der Delete-Variante komme ich leider nicht weitert - das scheint an meiner Systemumgebung zu liegen. Jegliche Code-Varianten, welche einen Delete-Befehl beinhalten, führen dazu, dass Excel den "Schirm zumacht" beim ersten Delete-Befehl. Leider bekommt man nicht einmal eine verwertbare Fehlermeldung angezeigt. Ich schliesse den Thread nun. Danke nochmals - Gruss Andrea


AW: Tabellenblätter löschen
16.05.2023 14:54:34
Jowe
mach es doch einfach so:
Option Explicit

Sub Extern_Publikation_FI()
  Dim strPfad As String
  Dim strPublikationsdatei As String
  Dim mySheet As String
  Dim ws As Worksheet
  'Variablenwerte
  strPfad = ThisWorkbook.Path & "\"
  strPublikationsdatei = "FI_2023"
  mySheet = "FTE_Extern Test_FI"
  ThisWorkbook.Sheets(mySheet).Copy
  ActiveWorkbook.SaveAs Filename:=strPfad _
    & strPublikationsdatei, FileFormat:=xlOpenXMLWorkbook
  With ActiveWorkbook
    .Save
    .Close
  End With
  MsgBox "Publikationsdatei FI_2023 ist erstellt!" _
    & vbNewLine & vbNewLine & "Dateiablage: " _
    & vbNewLine & strPfad
  Exit Sub
FehlerMarke:
  MsgBox "Es ist ein Fehler aufgetreten. Das Makro wurde nicht ausgeführt."
End Sub


AW: Tabellenblätter löschen
16.05.2023 15:40:02
Filikos
Hi Jowe - danke dir. Da der eine Adressat nur genau dieses eine Tabellenblatt sehen soll, funktioniert das. Das verschafft mir mal einen Teil der Lösung.


AW: Tabellenblätter löschen
22.05.2023 14:34:35
Daniel
Hi

hier noch eine Möglichkeit, alle Blätter in einer Mappe zu löschen bis auf ein bestimmtes.
hierzu verschiebt man das "bestimmte Blatt" an die Position 1 und löscht solange das 2. Sheet, bis nur noch 1 übrig ist.
das schöne ist, man braucht keine Variablen und kann das auch leicht für mehrere Blätter erweitern.

With ActiveWorkbook
    .Sheets("Bestimmtes Blatt").Move before:=.Sheets(1)
    Application.DisplayAlerts = False
    Do Until .Sheets.Count = 1
        .Sheets(2).Delete
    Loop
    Application.DisplayAlerts = True
End With
Gruß Daniel


AW: Tabellenblätter löschen
22.05.2023 15:17:20
Filikos
Hallo Daniel, danke dir vielmals für deine wertvollen Inputs. Meine Excel-Installation ist leider definitiv "immun" auf jegliche Delete-Befehle. Grüsse Filikos

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige