Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1448to1452
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 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.

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

.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

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

Anzeige
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?

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.

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!

30 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige