Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1812to1816
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

Neue Sheet anlegen

Neue Sheet anlegen
11.02.2021 11:19:15
Chris
Hallo VBAler,
ich möchte folgendes per VBA lösen:
Wenn die Arbeitsmappe startet soll geprüft werden, ob ein Sheet mit Name des aktuellen Jahres existiert.
Wenn ja, Exit Sub.
Wenn nicht, soll dieses erstellt werden.
Wenn ein Sheet mit aktuellem Jahr existiert und der aktuelle Monat = 2 ist, soll ein Sheet mit Namen des nächsten Jahres erstellt werden.
Hier mein Ansatz, dieser bricht jedoch ab, mit der Hinweis, dass die Namen bereits vergeben sind,.
Schon mal danke für die Hilfe.

Sub x()
Dim neueSeite As String
Dim SH As Object
Dim found As Boolean
found = False
'Prüfen, ob Sheet mit aktuellem Jahr vorhanden ist.
'Wenn vorhanden aktivieren
SheetYearNow = Year((Now))
For Each SH In ActiveWorkbook.Sheets
If SH.Name = SheetYearNow Then
ActiveWorkbook.Sheets(SheetYearNow).Activate
found = True
End If
Next
'Wenn Sheet mit aktuellem Jahr nicht vorhanden ist,
'hinten anlegen und aktivieren
If found = False Then
ActiveWorkbook.Worksheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Name = SheetYearNow
found = True
If found = True Then
If Month(Now()) = 2 Then
ActiveWorkbook.Worksheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Name = SheetYearNow + 1 'Sheet für das nächste Jahr
End If
End If
End If
End Sub


12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Neue Sheet anlegen
11.02.2021 11:36:27
Rudi
Hallo,
Sub x()
Dim wks As Worksheet
Dim SheetYearNow As Integer
'Prüfen, ob Sheet mit aktuellem Jahr vorhanden ist.
'Wenn vorhanden aktivieren
SheetYearNow = Year((Now))
On Error Resume Next
Set wks = Sheets(CStr(SheetYearNow))
On Error GoTo 0
If wks Is Nothing Then
Set wks = Worksheets.Add(after:=Sheets(Sheets.Count))
wks.Name = SheetYearNow
End If
Set wks = Nothing
If Month(Now()) = 2 Then
SheetYearNow = SheetYearNow + 1
On Error Resume Next
Set wks = Sheets(CStr(SheetYearNow))
On Error GoTo 0
End If
If wks Is Nothing Then
Set wks = Worksheets.Add(after:=Sheets(Sheets.Count))
wks.Name = SheetYearNow
End If
End Sub

Gruß
Rudi
Anzeige
AW: Neue Sheet anlegen
11.02.2021 12:23:11
Chris
Hallo Rudi,
danke für das Makro. Kannst du mir das erklären, du gehst vom Ablauf anders vor als ich...
Gruß
Chris
AW: Neue Sheet anlegen
11.02.2021 11:44:11
Daniel
Hi
Deklariere mal SheetYearNow als Stringvariable bzw weise den Wert zu mit SheetYearNow = CStr(Year(Now))
VBA und Excel sind manchmal etwas pingelig, was Text und Zahl an geht, da muss man ggf. genau unterscheiden und beachten dass die Zahl 2021 nicht das gleiche ist wie der Text "2021".
Auch bei der Ansprache der Sheets ist Vorsicht geboten, wenn du Zahlenwerte als Sheetnamen verwendet.
So ist Sheet(2021) nicht das Sheet mit dem Reiternamen "2021", sondern das 2021te Sheet in der Liste (falls du so viele hast).
Korrekt wäre Sheets("2021").
Bei Verwendung von Variablen als Sheet-Bezeichnung muss man dann auf den Datentyp achten.
Gruß Daniel
Anzeige
AW: Neue Sheet anlegen
11.02.2021 13:09:17
Chris
Hallo Daniel,
danke für den Hinweis. Ich habe das geändert. Obwohl das Sheet mit der Bez. 2022 existiert, bekomme ich immer ein Weiteres. Der Fehler muss im letzten bei Sheets.Add liegen..
Sub x()
On Error Resume Next
Dim neueSeite As String
Dim SH As Object
Dim found As Boolean
found = False
'Prüfen, ob Sheet mit aktuellem Jahr vorhanden ist.
'Wenn vorhanden aktivieren
SheetYearNow = CStr(Year(Now))
SheetYearNext = CStr(Year(Now)) + 1
For Each SH In ActiveWorkbook.Sheets
If SH.Name = SheetYearNow Then
Sheets(SheetYearNow).Activate
found = True
End If
Next
'Wenn Sheet mit aktuellem Jahr nicht vorhanden ist,
'hinten anlegen und aktivieren
If found = False Then
ActiveWorkbook.Worksheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Name = SheetYearNow
found = True
End If
'Wenn Sheet mit aktuellem Jahr vorhanden und Monat = 2 dann
'erzeuge Sheet mit Jahr+1 ansonsten ende
If found = True Then
If Month(Now()) = 2 Then
For Each SH In ActiveWorkbook.Sheets
If SH.Name = SheetYearNext Then
Exit Sub
Else
ActiveWorkbook.Worksheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Name = SheetYearNext 'Sheet für das nächste Jahr
Exit Sub
End If
Next
End If
End If
End Sub

Anzeige
AW: Neue Sheet anlegen
11.02.2021 14:51:05
Daniel
Hi
Du verwendest für die Prüfung ob das SheetYearNext vorhanden ist eine andere Methode, als für die Prüfung für SheetYearNow.
Diese ist aber Unsinn, Bau das mal genauso auf die die erste Prüfung.
Außerdem hast du bei SheetYearNext wegen duem +1 wieder eine Zahl. Oder was auch passieren kann: weil die Jahreszahl Text ist, wird das + wie & verwendet und fu bekommst statt "2022" dann "20211", was auch nicht sinnvoll ist.
Wenns Text sein soll, muss CStr die letzte Funktion sein, daher:
SheetYearNext = CStr(Year(Now) + 1)
Gruß Daniel
Anzeige
AW: Neue Sheet anlegen
11.02.2021 15:08:53
Chris
Hallo Daniel,
Ich habe das geändert. Soweit funktioniert es aber: Wenn die Sheets 2021 und 2022 angelegt sind, legt Excel mir weitere Sheets an (Tabelle4, 5, 6 etc.). Ich habe verstanden, dass dies dadurch passiert, da Sheet 2022 bereits existiert und die entsprechende Fehlermeldung abgefangen wird und daher die weitere Sheets angelegt werden.
Aus meiner Sicht müssten im letzten Teil noch abgefragt werden, ob SheetNextYear existiert, wenn ja dann beenden. Dies habe ich versucht, im vorherigen Makro umzusetzen, was nicht gelungen ist: Hier hat mir Excel exakt die bereits bestehende Anzahl an Sheets nochmal kopiert und jeweils mit "Tabelle5, 6,,7,8 etc) durchnummeriert. Weshalb verstehe ich nicht.
Wie baue ich nun einen Prüfung ein, ob SheetNextYear existiert?
Gruß
Chris
Sub x()
On Error Resume Next
Dim SheetYearNow As String
Dim SheetYearNext As String
Dim SH As Object
Dim found As Boolean
found = False
'Prüfen, ob Sheet mit aktuellem Jahr vorhanden ist.
'Wenn vorhanden aktivieren
SheetYearNow = CStr(Year(Now))
SheetYearNext = CStr(Year(Now) + 1)
For Each SH In ActiveWorkbook.Sheets
If SH.Name = SheetYearNow Then
Sheets(SheetYearNow).Activate
found = True
End If
Next
'Wenn Sheet mit aktuellem Jahr nicht vorhanden ist,
'hinten anlegen und aktivieren
If found = False Then
ActiveWorkbook.Worksheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Name = SheetYearNow
found = True
End If
If found = True Then
If Month(Now()) = 2 Then
ActiveWorkbook.Worksheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Name = SheetYearNext 'Sheet für das nächste Jahr
End If
End If
End Sub

Anzeige
AW: Neue Sheet anlegen
11.02.2021 21:05:56
Daniel
im Prinzip genauso, wie du die Prüfung aufgebaut hast, ob das Blatt für das aktuelle Jahr besteht.
ist genau das gleiche, nur eben mit einem anderen Blattnamen, aber ansonsten, genau gleich.
da du das ja schon programmiert hattest, solltest du das wiederholen können.
Gruß Daniel
AW: Neue Sheet anlegen
12.02.2021 07:08:16
Chris
Hi Daniel,
habs nun geändert und scheint zu funktionieren, vgl. unten.
Nun noch einen Detailfrage. Zuvor hatte ich folgende Änderung, die nicht funktionierte.
Warum?
Hier nur der untere Teil:

If found = True Then
If Month(Now()) = 2 Then
For Each SH In ActiveWorkbook.Sheets
If SH.Name = SheetYearNext Then
Exit Sub
Else
ActiveWorkbook.Worksheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Name = SheetYearNext 'Sheet für das nächste Jahr
End If
Next
End If
End If

Aus meiner Sicht sage ich Excel, wenn Sheet mit Namen des nächsten Jahres gefunden, dann Exit.
Stattdessen legt mir Excel immer drei neue Sheets mit Namen TabelleX an, obwohl Sheet 2022 existiert.
Es scheint dieses Sheet nicht zu finden.... in der unten stehenden Variante funktionierts...

Sub x()
On Error Resume Next
Dim SheetYearNow As String
Dim SheetYearNext As String
Dim SH As Object
Dim found As Boolean
found = False
'Prüfen, ob Sheet mit aktuellem Jahr vorhanden ist.
'Wenn vorhanden aktivieren
SheetYearNow = CStr(Year(Now))
SheetYearNext = CStr(Year(Now) + 1)
For Each SH In ActiveWorkbook.Sheets
If SH.Name = SheetYearNow Then
Sheets(SheetYearNow).Activate
found = True
End If
Next
'Wenn Sheet mit aktuellem Jahr nicht vorhanden ist,
'hinten anlegen und aktivieren
If found = False Then
ActiveWorkbook.Worksheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Name = SheetYearNow
found = True
End If
If found = True Then
If Month(Now()) = 2 Then
For Each SH In ActiveWorkbook.Sheets
If SH.Name = SheetYearNext Then
Exit Sub
End If
Next
End If
End If
If found = True Then
If Month(Now()) = 2 Then
ActiveWorkbook.Worksheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Name = SheetYearNext 'Sheet für das nächste Jahr
End If
End If
End Sub


Anzeige
AW: Neue Sheet anlegen
12.02.2021 08:21:40
Max
Guten Morgen,
Mach es doch einfach so so wie Daniel das gestern schon geschrieben hat
Du verwendest für die Prüfung ob das SheetYearNext vorhanden ist eine andere Methode, als für die Prüfung für SheetYearNow.
Diese ist aber Unsinn, Bau das mal genauso auf die die erste Prüfung.

dann klappt das bestimmt
Sub x()
On Error Resume Next
Dim SheetYearNow As String
Dim SheetYearNext As String
Dim SH As Object
Dim found As Boolean
Dim foundnextyear As Boolean
foundnextyear = False
found = False
'Prüfen, ob Sheet mit aktuellem Jahr vorhanden ist.
'Wenn vorhanden aktivieren
SheetYearNow = CStr(Year(Now))
SheetYearNext = CStr(Year(Now) + 1)
For Each SH In ActiveWorkbook.Sheets
If SH.Name = SheetYearNow Then
Sheets(SheetYearNow).Activate
found = True
End If
Next
'Wenn Sheet mit aktuellem Jahr nicht vorhanden ist,
'hinten anlegen und aktivieren
If found = False Then
ActiveWorkbook.Worksheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Name = SheetYearNow
found = True
End If
'Prüfen ob Sheet mit nächstem Jahr vorhanden ist
For Each SH In ActiveWorkbook.Sheets
If SH.Name = SheetYearNext Then
foundnextyear = True
End If
Next
If found = True And foundnextyear = False Then
If Month(Now()) = 2 Then
ActiveWorkbook.Worksheets.Add after:=Sheets(Worksheets.Count)
ActiveSheet.Name = SheetYearNext 'Sheet für das nächste Jahr
End If
End If
End Sub
MfG
Max
Anzeige
AW: Neue Sheet anlegen
12.02.2021 09:18:59
Daniel
Hi
naja, du musst das ganze mal durchspielen.
wenn bei dieser Variante das gesuchte Blatt nicht an Postion 1 steht sondern auf Postion 3, dann läuft die Schleife auch über die ersten beiden Blätter und wird bei diesen beiden versuchen, das neue Blatt anzulegen.
btw, es gibt eine einfahrer Variante um zu prüfen ob ein Blatt vorhanden ist, die ohne zusätzliche Variable (found) auskommt.
Die beruht darauf, dass nach dem vollständigen Durchlauf einer For-Each-Schleife die Schleifenvariable leer ist. Wird abgebrochen, dann enthält die Schleifenvariable das Objekt bei dem abgebrochen wurde:
for each sh in ActiveWorkbook.Worksheets
if sh.Name = "gesuchter Name" then Exit for
Next
if sh is nothing then
Sheets.Add
ActiveSheet.Name = "gesuchter Name"
else
sh.select
end if
Gruß Daniel
Anzeige
AW: Neue Sheet anlegen
12.02.2021 12:51:07
Chris
Hallo zusammen,
danke für die Hinweise. Da es nun läuft, probiere ich eure letzten beiden Varianten aus.
Offensichtlich muss ich VBA im Ablauf wörtlicher nehmen...
"... dann läuft die Schleife auch über die ersten beiden Blätter und wird bei diesen beiden versuchen, das neue Blatt anzulegen." ...achso :-) *aha*
Danke Euch allen.
AW: Neue Sheet anlegen
17.02.2021 13:44:16
Daniel
Computer sind nur schnell, aber ansonsten sehr doof.
sie machen genau das, was man ihnen sagt.
was man eigentlich von ihnen will, können sie nicht wissen.
diese Fähigkeit, aus dem was man gesagt hat herauszuinterpretieren was man eigentlich will, haben nur Menschen und auch bei diesen funktioniert das nicht immer zuverlässig.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige