Hi viktoriaV,
im Grunde bist du schon auf dem richtigen Weg.
Der Trick ist eigentlich der, dass man mit der Zählvariable (hier i) die Monate entsprechend pro Schleifendurchgang ändert.
Man kann es z.B. wie folgt lösen:
Option Explicit
Sub MonatsAbfrage()
Dim dtmFrom As Date
Dim retVal As String
Dim i As Long
retVal = InputBox("Für welchen Monat (z.B. April 2015) soll ein Bericht erstellt werden?")
If retVal = "" Then 'Abbruch durch Nutzer?
Exit Sub
ElseIf IsDate(retVal) Then
dtmFrom = CDate(retVal)
Else
Call MsgBox("Ungültige Eingabe", vbExclamation)
Exit Sub
End If
For i = 1 To 12 '12 Monate
With report.Sheets("Orders")
'Spalte: Monat
.Cells(1 + i, "A").NumberFormat = "mmm yy"
.Cells(1 + i, "A").Value = DateSerial(Year(dtmFrom) - 1, Month(dtmFrom) + i - 1, 1)
'Spalte: Von
.Cells(1 + i, "B").Value = DateSerial(Year(dtmFrom) - 1, Month(dtmFrom) + i - 1, 1)
'Spalte: Bis
.Cells(1 + i, "C").Value = DateSerial(Year(dtmFrom) - 1, Month(dtmFrom) - i + 2, 0)
End With
Next
End Sub
Anmerkung:
DateSerial(Year(dtmFrom) - 1, Month(dtmFrom) - i + 2, 0)
Hier wird ...
... mit i=1 der Monat um 1 erhöht;
... mit i=2 der Monat um 0 (= -2+2) erhöht;
... mit i=3 der Monat um -1 (= -3+2) erhöht (passender formuliert: erniedrigt);
... usw.
Der dritte Parameter erhält das Argument Null (0) und dieses bewirkt das nicht der Tag des im zweiten Parameter angebenen Monats zurückgegeben wird, sondern der des Monats davor (im Prinzip wird hier ein wenig getrickst, man muss es halt wissen dass es das gibt).
PS: In Dialogen wird i.d.R. die indirekte Anrede verwenden. Der Nutzer erstellt die Liste ja nicht, sie wird für ihn erstellt. ;o)
Gruß
|