Hallo,
ich hab den Thread aufmerksam verfolgt und soweit verstanden, dass das
folgende die Tabellenblätter für den Zeitraum 01.10.09 bis 31.12.09 erzeugt.
nö, das ist eher Zufall. Gäbe es eine globale Variable "Tag" mit einem von 0 verschiedenen Inhalt, käme etwas anderes heraus.
Sub Monatsblätter()
For Monat = 305 To 396
Set Sh = Worksheets.Add(after:=Worksheets(Worksheets.Count))
Sh.Name = Format(DateSerial(2009, Tag, Monat), "dddd,dd.mm.yy")
Next
Set Sh = Nothing
End Sub
Was mir nicht in den Kopf will, ist die zweite Zeile. Wieso Monat von 305 bis 396?
ist das für ein Format? Wieso ist Monat 1 = 01.12.2008?
Wie komme ich von der Zahl 305 zum 01.10.2009?
Durch schlampige Programmierung, d.h. durch Weglassen von
Option Explicit
die eine Deklarierung aller Variablen erzwingt. Weiterhin sind die Variablen miserabel benannt:
Die Variable Tag wird nicht initialisiert, die Variable Monat ist implizit vom Typ Variant.
DateSerial() hat folgende Syntax:
DateSerial(Jahr As Integer, Monat As Integer, Tag As Integer)
Da die Variable "Tag" nicht deklariert wurde, wird sie implizit angelegt und erhält den Standardwert 0.
Somit wird der Funktion DateSerial für Jahr der Wert 2009, für den Monat der Inhalt der Variablen "Tag", d.h. 0 und für den Tag der jeweils aktuelle Wert der Variablen "Monat", der von 305 bis 396 läuft übergeben.
Zählst Du die Tage folgender Monate zusammen:
Dezember 2008: 31
Januar 2009: 31
Februar 2009: 28
März 2009: 31
April 2009: 30
Mai 2009: 31
Juni 2009: 30
Juli 2009: 31
August 2009: 31
September 2009: 30
so kommst Du auf 304 Tage.
Der 305. Tag des 0. Monat des Jahres 2009 ist somit der 1. Oktober 2009.
Wie nahezu jede vernünftige Programmiersprache verwendet VBA für den ersten Monat im Jahr die 1 und für den ersten Tag im Monat ebenfalls die 1 :-)
Fazit:
- Benenne Variablen sinnvoll.
- Deklariere jede Variable explizit und gib ihr den geeigneten Datentyp
- Arbeite mit vernünftigen Werten :-)
- Kommentiere den Code!
- Nutze die VBA-Hilfe zu den verwendeten Funktionen
Freundliche Grüße
Vinzenz