2016-08-29 2 views
2

Ich habe derzeit eine "For Next" -Schleife, die durch verschiedene Jahre iteriert und ich möchte es ändern, um Daten durchlaufen, insbesondere das Ende eines jeden Monats. Mein generischer Code für die Jahresschleife ist unten. Das Durchlaufen von Jahren ist relativ einfach, da Sie ein Anfangsjahr haben, das eine Ganzzahl ist, und die Iteration ist 1. Jetzt möchte ich die Schleife ändern, um verschiedene Monatsendtermine zu durchlaufen. Zum Beispiel: 31.01.2003, 28.2.2003, ......, 31.12.2007. Beachten Sie außerdem, dass ich für jede Iteration ein neues Arbeitsblatt mit dem Namen der aktuellen Iteration als Namen des Arbeitsblatts anlege. Auch dies ist relativ einfach für ein Jahr, aber die Verwendung eines Datums mit einem "/" kompliziert die Dinge. Hat jemand irgendwelche Ideen zum Erstellen einer Schleife mit Monatsenddaten sowie das Erstellen von Blättern mit Daten? Ich habe ein Array der Daten, so dass sich der Code auf das Array innerhalb eines Blattes beziehen kann. Und der Name des Blattes könnte in irgendeinem Format sein. Zum Beispiel "MM-TT-JJJJ".For-Next-Schleife mit Monatsenddaten als Iteration

Sub YearLoop() 

    Dim FirstYr As Integer 
    Dim LastYr As Integer 
    Dim Sheetname As String 
    Dim Counter1 As Single 

    FirstYr = Sheets("Model").Range("ax15").Value 
    LastYr = Sheets("Model").Range("ax16").Value 

    Counter1 = 0 

    For J = FirstYr To LastYr 

     Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = J 
     Sheetname = J 

     'do stuff 
     Counter1 = Counter1+1 

    Next 
End Sub 

Antwort

7

Die DateSerial function produziert die End-of-Monats-Datum des Vormonats, wenn Sie einen beliebigen Monat einen Tag Null geben.

dim m as integer 
for m = 2 to 13 
    debug.print dateserial(2016, m, 0) 
next m 
+0

Ich wollte dies vorschlagen mit einem datediff pro Tag zu subtrahieren, aber dieser Ansatz ist einfacher. – Chrismas007

+2

Wird 'm = 13' Fehler? – Chrismas007

+0

Nein, wenn der Tag 1 wäre, würde es als "01-Jan-2017" gelten, aber mit einem Tag Null ist es "31-Dez-2016". Das OP sollte in der Lage sein, dies leicht zu forschern ... Weiter innerhalb des jährlich in der Frage angebotenen. – Jeeped

1

Die Zeichen, die nicht in Blattnamen verwendet werden, sind ASCII \/[]*:?, aber Sie können wie ⁄∕/ Unicode-Zeichen verwenden

d = #1/31/2003# 
While d <= #12/31/2007# 
    Sheets.Add(, ActiveSheet).Name = Replace(d, "/", ChrW(8260)) 
    d = d + 32 
    d = d - Day(d) 
Wend 

aktualisieren

Oder Sie können Antwort Jeeped die Nutzung so:

For m = FirstYr * 12 + 2 To LastYr * 12 + 13 
    Sheets.Add(, ActiveSheet).Name = Replace(DateSerial(0, m, 0), "/", ChrW(8260)) 
Next 
+0

Große Kommentare alle. Ich danke dir sehr!!! Unten ist, was ich getan habe. Und es scheint zu funktionieren. – Jcarl

0

Public Sub ReadAndDisplay()

' Get Range 
Dim rg As Range 
Set rg = ThisWorkbook.Worksheets("Returns Calc").Range("C118:C319") 

' Create dynamic array 
Dim Arr() As Variant 

' Read values into array from sheet1 
Arr = rg 

For Each mark In Arr 

     Dim CurrentDate1 As Date, DimCurrentDate2 As String 
     CurrentDate1 = mark 
     CurrentDate2 = Replace(CurrentDate1, "/", ".") 

     Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = CurrentDate2 & " Rtns" 
     'do Stuff 

Next mark 

End Sub

+0

Das einzige Problem mit dem Code, den ich oben gepostet habe, ist, dass es sehr langsam zu sein scheint. also werde ich versuchen, was Sie alle empfohlen haben. – Jcarl