Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Tabellenblätter mehrfach kopieren

Tabellenblätter mehrfach kopieren
27.09.2015 22:05:48
Stefan
Hallo ich habe folgendes Problem:
Ich habe die Tabellenblätter "Vorlage" und eine "Mitarbeiterliste"
Jetzt bräuchte ich das sich die Vorlage für jeden Mitarbeiter kopiert und nach ihm benennt.
Das heißt ich habe das Tabellenblatt das sich "Vorlage" nennt, und er soll per vba das Tabellenblatt "Mitarbeiterliste" heranziehen und die Namen der Mitarbeiter in dem Bereich (A1:A29) nehmen und mir die Vorlage kopieren und automatisch mit den Namen benennen.
In der Zelle A1 steht der Name Huber
A2 Mayer
A3 Müller
A4 Schmid
usw.
Das heißt am Ende sollte ich 29 Tabellenblätter haben, und jedes lautet dann am Namen des Mitarbeiters.
Wie macht man sowas am besten, bzw. wie muss der Code dazu aussehen? Ich hoffe ich hab es verständlich geschrieben.

Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
1000x gefragt ...
27.09.2015 22:19:18
Rudi
Hallo,
... und gelöst.
Recherche Tabellenblätter erstellen nach Liste oder so ähnlich.
Gruß
Rudi

AW: Tabellenblätter mehrfach kopieren
27.09.2015 22:21:52
Sepp
Hallo Stefan,
' **********************************************************************
' Modul: Modul3 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub makeSheets()
Dim objTemplate As Worksheet
Dim rng As Range

On Error GoTo ErrExit

Static CalculationMode As Long

With Application
  .ScreenUpdating = False
  .EnableEvents = False
  CalculationMode = .Calculation
  .Calculation = xlManual
  .DisplayAlerts = False
End With

Set objTemplate = Sheets("Vorlage")

For Each rng In Sheets("Mitarbeiterliste").Range("A1:A29")
  If Len(Trim$(rng.Text)) Then
    objTemplate.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
    With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
      .Name = Trim$(rng.Text)
      .Visible = xlSheetVisible
    End With
  End If
Next

ErrExit:

With Err
  If .Number <> 0 Then
    MsgBox "Fehler in Prozedur:" & vbTab & "'makeSheets'" & vbLf & String(60, "_") & _
      vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
      "Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
      .Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
      "VBA - Fehler in Prozedur - makeSheets"
    .Clear
  End If
End With

On Error GoTo 0

With Application
  .ScreenUpdating = True
  .EnableEvents = True
  .Calculation = CalculationMode
  .DisplayAlerts = True
  .StatusBar = False
End With

End Sub

Gruß Sepp

Anzeige
AW: Tabellenblätter mehrfach kopieren
28.09.2015 02:13:04
Werner
Hallo Stefan,
hier der Code vom Forumsbetreiber selbst:
Sub Blätter_anlegen_bennenen()
Dim wks As Worksheet
Dim iRow As Integer
Set wks = ActiveSheet
iRow = 1
Do Until IsEmpty(wks.Cells(iRow, 1))
Worksheets.Add after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = wks.Cells(iRow, 1).Value
iRow = iRow + 1
Loop
Worksheets(1).Select
End Sub
Gruß Werner

Anzeige
.Add kopiert aber nicht die Vorlage! ___ kwT ;-)
28.09.2015 04:49:04
Matthias

AW: .Add kopiert aber nicht die Vorlage! ___ kwT ;-)
28.09.2015 05:12:11
Werner
Hallo Matthias,
stimmt natürlich, liegt wohl an der Zeit. Was meinst du dazu? Das hätte Stefan aber vielleicht auch selbst hin bekommen.
Sub Blätter_anlegen_bennenen()
Dim wks As Worksheet
Dim iRow As Integer
Set wks = Worksheets("Mitarbeiterliste")
iRow = 1
Do Until IsEmpty(wks.Cells(iRow, 1))
Worksheets("Vorlage").Copy after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = wks.Cells(iRow, 1).Value
iRow = iRow + 1
Loop
Worksheets(1).Select
End Sub
Gruß Werner

Anzeige
auf jeden Fall besser ;-)
28.09.2015 05:31:48
Matthias
Hallo
Ist ja schon mal besser als vorher ;-)
Nur darf man den Code eben nicht ein 2.Mal ausführen.
Dann gibts einen Crash.
Beim Bsp. von Sepp wird das zwar mit einer Fehlermeldung abgefangen,
aber auch dort wird dann Vorlage(2), Vorlage(3) ... erstellt.
Ist zwar kein Fehler(war nicht gefordert/gewünscht), sollte aber mE über eine Abfrage
ob das entsprechende Blatt bereits existiert auch abgefangen werden.
Nur so als Vorschlag.
Gruß Matthias

Anzeige
AW: auf jeden Fall besser ;-)
28.09.2015 13:16:17
Werner
Hallo Matthias,
ist mir, nachdem der Code online war auch bewusst geworden. Ist wohl doch nicht so gut das im Nachtdienst um diese Zeit noch zu machen, wobei ich von VBA selbst nicht so viel Ahnung habe. ;-)
Gruß Werner

AW: Tabellenblätter mehrfach kopieren
28.09.2015 13:41:18
Reiter
Also mal vielen Dank für die Antworten es funktioniert super.
Jetzt hätte ich noch eine Frage. Kann man das auch so machen das er in die Zelle A1  automatisch den jeweiligen Mitarbeiternamen schreibt?
Und das wenn ich die Liste um einen Mitarbeiter erweitere er mir nur die Vorlage neu anlegt für den neuen Mitarbeiter und die anderen Mitarbeiter wo es schon ein Tabellenblatt gibt ignoriert?

Anzeige
AW: Tabellenblätter mehrfach kopieren
28.09.2015 18:43:14
Sepp
Hallo Stefan,
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub makeSheets()
Dim objTemplate As Worksheet
Dim rng As Range

On Error GoTo ErrExit

Static CalculationMode As Long

With Application
  .ScreenUpdating = False
  .EnableEvents = False
  CalculationMode = .Calculation
  .Calculation = xlManual
  .DisplayAlerts = False
End With

Set objTemplate = Sheets("Vorlage")

For Each rng In Sheets("Mitarbeiterliste").Range("A1:A29")
  If Len(Trim$(rng.Text)) Then
    If Not SheetExist(Trim$(rng.Text)) Then
      objTemplate.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
      With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        .Name = Trim$(rng.Text)
        .Visible = xlSheetVisible
        .Range("A1") = Trim$(rng.Text)
      End With
    End If
  End If
Next

ErrExit:

With Err
  If .Number <> 0 Then
    MsgBox "Fehler in Prozedur:" & vbTab & "'makeSheets'" & vbLf & String(60, "_") & _
      vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
      "Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
      .Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
      "VBA - Fehler in Prozedur - makeSheets"
    .Clear
  End If
End With

On Error GoTo 0

With Application
  .ScreenUpdating = True
  .EnableEvents = True
  .Calculation = CalculationMode
  .DisplayAlerts = True
  .StatusBar = False
End With

End Sub

Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook) As Boolean
Dim wks As Object
On Error GoTo ERRORHANDLER
If Wb Is Nothing Then Set Wb = ThisWorkbook
For Each wks In Wb.Sheets
  If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function
Next
ERRORHANDLER:
SheetExist = False
End Function

Gruß Sepp

Anzeige
Janice Keihanaikukauakahihuliheekahaunaele
29.09.2015 07:02:35
Matthias
Hi Sepp
Hauptache es heißt kein Mitarbeiter
Janice Keihanaikukauakahihuliheekahaunaele
oder so ;-)
Mitarbeiterliste

 AB
1Mitarbeiter112
2Janice Keihanaikukauakahihuliheekahaunaele42
3Mitarbeiter312
4Mitarbeiter412


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Gibts wirklich, habs gerade gefunden.
http://www.spiegel.de/panorama/leute/janice-keihanaikukauakahihuliheekahaunaele-name-zu-lang-fuer-ausweis-a-922042.html
Nur n Späßle am Rande ;-)
Kann aber u.U. auch vorkommen.
Schlage vor das mit abzufragen:
'''
With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
.Name = Left(Trim$(rng.Text), 31)

und in der Function SheetExist
'''
For Each wks In Wb.Sheets
If Left(LCase(wks.Name), 31) = Left(LCase(sheetName), 31) Then SheetExist = True: Exit Function
Next
'''
Gruß Matthias

Anzeige
dann aber auch die Gültigkeit des namens prüfen
29.09.2015 21:17:05
Sepp
Hallo Matthias,
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub makeSheets()
Dim objTemplate As Worksheet
Dim rng As Range, strName As String

On Error GoTo ErrExit

Static CalculationMode As Long

With Application
  .ScreenUpdating = False
  .EnableEvents = False
  CalculationMode = .Calculation
  .Calculation = xlManual
  .DisplayAlerts = False
End With

Set objTemplate = Sheets("Vorlage")

For Each rng In Sheets("Mitarbeiterliste").Range("A1:A29")
  If Len(Trim$(rng.Text)) Then
    strName = Left(Trim$(rng.Text), 31)
    If IsValidSheetName(strName) Then
      If Not SheetExist(strName) Then
        objTemplate.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
          .Name = strName
          .Visible = xlSheetVisible
          .Range("A1") = strName
        End With
      End If
    End If
  End If
Next

ErrExit:

With Err
  If .Number <> 0 Then
    MsgBox "Fehler in Prozedur:" & vbTab & "'makeSheets'" & vbLf & String(60, "_") & _
      vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
      "Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
      .Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
      "VBA - Fehler in Prozedur - makeSheets"
    .Clear
  End If
End With

On Error GoTo 0

With Application
  .ScreenUpdating = True
  .EnableEvents = True
  .Calculation = CalculationMode
  .DisplayAlerts = True
  .StatusBar = False
End With

End Sub

Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook) As Boolean
Dim wks As Object
On Error GoTo ERRORHANDLER
If Wb Is Nothing Then Set Wb = ThisWorkbook
For Each wks In Wb.Sheets
  If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function
Next
ERRORHANDLER:
SheetExist = False
End Function

Private Function IsValidSheetName(ByVal strName As String) As Boolean
Dim objRegExp As Object

Set objRegExp = CreateObject("vbscript.regexp")

With objRegExp
  .Global = True
  .Pattern = "^[^\/\\:\*\?\[\]]{1,31}$"
  .IgnoreCase = True
  IsValidSheetName = .test(strName)
End With

Set objRegExp = Nothing

End Function

Gruß Sepp

Anzeige
AW: dann aber auch die Gültigkeit des namens prüfen
29.09.2015 22:09:41
Stefan
Also mal vielen Dank für die ganzen Antworten und die Hilfe!
Es funktioniert echt super, mein einziges Problem ist das bei meiner Vorlage das Datenblatt geschützt ist, und das hätte ich auch gern dann noch bei den anderen die sich dann erstellen.
Kann man da noch was im Makro ändern bzw. anpassen? Wäre super wenn das auch noch funktionieren würde.

Anzeige
AW: dann aber auch die Gültigkeit des namens prüfen
29.09.2015 22:14:07
Sepp
Hallo Stefan,
passe diesn Teil an.
With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
  .Unprotect "passwort"
  .Name = strName
  .Visible = xlSheetVisible
  .Range("A1") = strName
  .Protect "passwort"
End With

Gruß Sepp

Anzeige
AW: dann aber auch die Gültigkeit des namens prüfen
29.09.2015 22:19:19
Stefan
Hab es grad geändert, funktioniert jetzt absolut perfekt.
Danke Sepp!
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Tabellenblätter in Excel mehrfach kopieren und anpassen


Schritt-für-Schritt-Anleitung

Um ein Excel Tabellenblatt mehrfach zu kopieren und automatisch nach Namen zu benennen, kannst Du den folgenden VBA-Code verwenden. Dieser Code kopiert das Arbeitsblatt "Vorlage" und benennt es anhand der Namen in der "Mitarbeiterliste".

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu:
    • Klicke auf Einfügen > Modul.
  3. Kopiere den folgenden Code in das Modul:
Sub makeSheets()
    Dim objTemplate As Worksheet
    Dim rng As Range
    Dim strName As String

    On Error GoTo ErrExit

    Set objTemplate = Sheets("Vorlage")

    For Each rng In Sheets("Mitarbeiterliste").Range("A1:A29")
        If Len(Trim$(rng.Text)) > 0 Then
            strName = Left(Trim$(rng.Text), 31) ' Namen auf 31 Zeichen begrenzen
            If Not SheetExist(strName) Then
                objTemplate.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
                With ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
                    .Name = strName
                    .Range("A1").Value = strName ' Namen in Zelle A1 einfügen
                End With
            End If
        End If
    Next

ErrExit:
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With
End Sub

Private Function SheetExist(sheetName As String, Optional Wb As Workbook) As Boolean
    Dim wks As Worksheet
    On Error GoTo ERRORHANDLER
    If Wb Is Nothing Then Set Wb = ThisWorkbook
    For Each wks In Wb.Sheets
        If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function
    Next
ERRORHANDLER:
    SheetExist = False
End Function
  1. Schließe den VBA-Editor und gehe zurück zu Excel.
  2. Führe das Makro aus:
    • Drücke ALT + F8, wähle makeSheets aus und klicke auf Ausführen.

Häufige Fehler und Lösungen

  • Fehler: „Blatt existiert bereits“

    • Wenn Du das Makro mehrmals ausführst, könnte es zu diesem Fehler kommen. Der Code überprüft bereits, ob das Blatt existiert, bevor es kopiert wird.
  • Fehler: „Blattname ungültig“

    • Excel erlaubt keine Blattnamen mit mehr als 31 Zeichen oder bestimmten Sonderzeichen. Der Code begrenzt den Namen auf 31 Zeichen.
  • Problem: Das kopierte Blatt ist nicht geschützt

    • Wenn Du ein geschütztes Blatt möchtest, füge im Code nach dem Kopieren den Schutz hinzu:
.Protect "dein_passwort"

Alternative Methoden

  1. Manuelles Kopieren:

    • Du kannst ein Blatt manuell kopieren, indem Du mit der rechten Maustaste auf den Reiter des Blattes klickst und Kopieren wählst.
  2. Excel-Funktionen:

    • Du kannst auch die Funktion =INDIREKT() verwenden, um Daten aus mehreren Tabellenblättern in ein Hauptblatt zu konsolidieren.

Praktische Beispiele

  • Mitarbeiterliste erstellen:

    • Stelle sicher, dass die „Mitarbeiterliste“ in der Spalte A die Namen der Mitarbeiter enthält. Die Vorlage wird für jeden dieser Namen erstellt.
  • Vorlage anpassen:

    • Du kannst die Vorlage nach Deinen Bedürfnissen anpassen, bevor Du das Makro ausführst.

Tipps für Profis

  • Variablen benennen: Eine klare Benennung von Variablen im Code macht die Wartung einfacher.
  • Fehlerbehandlung: Implementiere umfassende Fehlerbehandlungsroutinen, um unerwartete Probleme zu vermeiden.
  • Dokumentation: Kommentiere Deinen Code gut, damit Du und andere ihn später leichter verstehen können.

FAQ: Häufige Fragen

1. Wie kann ich das Arbeitsblatt duplizieren, ohne VBA zu verwenden? Es ist nicht möglich, ein Arbeitsblatt mit Namen automatisch zu duplizieren, ohne VBA zu nutzen. Du kannst jedoch manuell Kopien erstellen.

2. Was mache ich, wenn der Code nicht funktioniert? Überprüfe die Namen der Blätter im Code und stelle sicher, dass sie mit denen in Deiner Excel-Datei übereinstimmen. Achte auch darauf, dass das Makro in einer Datei mit Makros gespeichert ist (*.xlsm).

3. Wie kann ich mehrere Tabellenblätter auf einmal kopieren? Verwende den oben genannten Code oder kopiere die Blätter manuell, indem Du die Steuerungstaste gedrückt hältst und die gewünschten Blätter auswählst, dann mit der rechten Maustaste klickst und Kopieren wählst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige