2016-04-26 5 views
1

Ich bin ein relativ neuer Programmierer in VBA für Excel und suche nach Hilfe für ein arbeitsbezogenes Projekt.Aktualisieren des Geschäftsjahrs mit einem Makro

Die Frage auf der Hand ist in Bezug Update-Routine für ein Budget-Tracking-System zu entwerfen, die die Datumseinträge für jedes kommendes Geschäftsjahr aktualisieren würden, durch den Benutzer in einem Eingabefeld angegeben:

Sub Putittogether() 
On Error Resume Next 

Dim xMonthNumber As Integer 
Dim xMonthNumber2 As Integer 
Dim xYearInput As Integer 
Dim xCell As Range 
Dim xCell2 As Range 
Dim xMonthYear As Range 
Dim xMonthNextYear As Range 

Set xMonthYear = Range("B4:B12") 
Set xMonthNextYear = Range("B1:B3") 


xYearInput = InputBox("Please enter year:") 


For Each xCell In xMonthYear 
    xCell = xYearInput 
     For xMonthNumber = 4 To 12 
     Range("B" & xMonthNumber).NumberFormat = "General" 
     Range("B" & xMonthNumber) = MonthName(xMonthNumber, True) & xCell 
      For Each xCell2 In xMonthNextYear 
      xCell2 = xYearInput + 1 
       For xMonthNumber2 = 1 To 3 
       Range("B" & xMonthNumber2).NumberFormat = "General" 
       Range("B" & xMonthNumber2) = MonthName(xMonthNumber2, True) & xCell2 
      Next xMonthNumber2 
     Next xCell2 
    Next xMonthNumber 
Next xCell 

End Sub 

Der Makro geht von April des laufenden Jahres bis März des folgenden Jahres, also die Doppelschleifen.

Ich habe Probleme an zwei Stellen: mit der Methode, die ich verwende, müssen die Bereiche in der B-Spalte streng in Zeilen 1-12 widergespiegelt werden und alle anderen Zeilen verursacht Probleme mit der Ausgabe, und ich bin nicht sicher warum. Das zweite Problem ist, dass ich Tracking-Summentabellen für jeden Monat habe und versuche, dieses Makro in einer Tabelle auszuführen, die eine Kopfzeile hat (dh verschiebt die erste Datenzeile auf B2), erzeugt zusätzliche Ausgabeprobleme - so Wie kann ich es in einem anderen Bereich arbeiten lassen?

Vielen Dank im Voraus für Ihre Hilfe !!

Antwort

1

Könnten Sie nicht verwenden, um die Date Typdaten und dann die DateAdd() Funktion. Dies würde Ihre Schleife auf nur zwei Codezeilen vereinfachen.

Wenn Sie eine Startreihe dann einen Weg festzulegen brauchen würde die Zeile Schleife von startRow laufen + StartRow 11.

So würde der Code wie folgt aussehen:

Const START_ROW As Integer = 1 'set this to the row you want 
Dim ws As Worksheet 
Dim r As Integer 
Dim dat As Date 
Dim yyyy As Integer 

Set ws = ThisWorkbook.Worksheets("Sheet1") 

yyyy = InputBox("Please enter year:") 

dat = DateSerial(yyyy, 4, 1) 
For r = START_ROW To START_ROW + 11 
    ws.Cells(r, "B").Value = Format(dat, "mmmyyyy") 
    dat = DateAdd("m", 1, dat) 
Next 
+0

@INOPIAE Entschuldigung, habe deine Antwort nicht gesehen ... zwei tolle Köpfe! Ich werde es weiter machen, um OP zu helfen, sich mit der Zeilenfrage zu befassen. – Ambie

+0

Ich habe die DateAdd-Methode verwendet, bevor ich die Version schrieb, die ich hier eingereicht habe, aber ich hatte ein Problem darin, dass es nur den letzten Wert der Schleife über den Bereich ausgab, und ich beschloss, das Jahr als Ganzzahl zu behandeln, die zu isolieren Monat und dann beide zusammen. Der Datentyp "Datum" kam mir damals nicht in den Sinn ... Wie wir sehen, sind die Ansätze von Ihnen und INOPIAE eher raffinierter. Vielen Dank, dass Sie sich die Zeit genommen haben. Es ist sehr geschätzt. – quadrature

1

Mai werden Sie diesen Code verwenden können

Sub Putittogether() 
    On Error Resume Next 

    Dim xYearInput As Integer 
    Dim xColumn As Integer 
    Dim xDate As Date 

    xYearInput = InputBox("Please enter year:") 

    xDate = DateSerial(xYear,4,1) 'you might adjust this date to the first month to be entered 

    For xColumn = 1 to 12 

     Cells("B" & xColumn).NumberFormat = "General" 
     Cells("B" & xColumn) = Format(xDate,"MMM YY") 
     xDate = DateAdd("m", 1, xDate) 

    Next xColumn 

End Sub 
+0

danke Für die Einsicht würde diese Version das Leben erleichtern - ich wusste vorher nichts von der DateSerial-Methode. – quadrature

Verwandte Themen