2017-11-13 1 views
1

Ich habe eine Tabelle mit mit identischen Zeilen in Sequenzen von drei Wiederholungen. Zum Beispiel repräsentiert unter A eine Reihe von Informationen. In Spalte S sind Daten. Ich möchte das Datum in Spalte S in der zweiten Zeile jeder Sequenz auf einen Monat nach dem ursprünglichen Datum und die dritte Zeile jeder Sequenz auf zwei Monate nach dem ursprünglichen Datum ändern und dies für die gesamte Tabelle mit einer Schleife fortsetzen und die DateAdd Funktion.VBA: Verwenden der DateAdd-Funktion

Hier ist der Code ich jetzt habe, aber die ich einen Compiler-Fehler auf der DateAdd Funktion erhalten (dies ist mein erstes Mal, es zu benutzen):

Sub DateChange() 

Dim r As Long 

Application.ScreenUpdating = False 

For r = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1 
    With Cells(r, 1).EntireRow 
     .Copy 
     .Resize(2).Offset(1, 0).Insert Shift:=xlDown 
    End With 
    Cells(r + 1, "S").Value = DateAdd("m", 1, Cells(r, "S")) 
    Cells(r + 2, "S").Value = DateAdd("m", 2, Cells(r, "S")) 
Next r 

Application.ScreenUpdating = True 

End Sub 
+0

Was ist der spezifische Fehler, den Sie bekommen? –

+0

häufigsten Problem, wenn 'Zellen (r," S ") auf der Aktivseite (da Sie nicht vollständig qualifizierten Namen verwenden) kein gültiges Datum ist, erhalten Sie den Fehler. Überprüfen Sie vor dem Hinzufügen mit 'IsDate'. Wir haben entschieden, dass wir alles schließen sollten, was wir jetzt tun können. – cyboashu

+0

Mat's Mug der Fehler sagt "Kompilierfehler: Falsche Anzahl von Argumenten oder ungültige Eigenschaftenzuweisung". Es ist in der Tat ein Datum. Wie würdest du den Namen Cyboashu qualifizieren? Danke – oryan5000

Antwort

1

Wenn Sie Schwierigkeiten mit der DataAdd Funktion erleben dann können Sie es wie folgt umgehen:

Option Explicit 

Sub DateChange() 

Dim r As Long 
Dim dttTemp As Date 
Dim ws As Worksheet 

Set ws = ThisWorkbook.Worksheets("Sheet1") 

Application.ScreenUpdating = False 

For r = ws.Range("A" & ws.Rows.Count).End(xlUp).Row To 1 Step -1 
    With ws.Cells(r, 1).EntireRow 
     .Copy 
     .Resize(2).Offset(1, 0).Insert Shift:=xlDown 
    End With 
    dttTemp = ws.Cells(r, "S").Value 
    ws.Cells(r + 1, "S").Value = DateSerial(Year(dttTemp), Month(dttTemp) + 1, Day(dttTemp)) 
    ws.Cells(r + 2, "S").Value = DateSerial(Year(dttTemp), Month(dttTemp) + 2, Day(dttTemp)) 
Next r 

Application.ScreenUpdating = True 

End Sub 

Beachten Sie, dass ich auch in vollem Umfang alle Verweise bin qualifiziert (für eine gute Codierung Praxis und Fehler zu vermeiden). Das bedeutet, ich verweise auf ThisWorkbook.Worksheets("Sheet1").Cells(r, "S").Value anstelle von nur Cells(r, "S") (wie Sie getan haben). So weiß VBA, in welcher Excel-Datei zu suchen und auf welches Blatt bei der Suche nach Zelle S3 (zum Beispiel) aussehen soll. Außerdem erzähle ich VBA, dass ich an der Zelle .Value interessiert bin und nicht .Value2 oder .Formula oder irgendetwas anderes.

Lassen Sie mich wissen, ob das obige half.

+0

Vielen Dank! Nach dem Ausführen des Codes, habe ich einen Fehler 13, Typ Mismatch in dieser Zeile: dttTemp = ws.Cells (r, "S"). Wert – oryan5000

+0

Dies funktioniert, perfekt. Ich erkannte, dass ich meine Header in der ersten Reihe loswerden musste. Ich schätze die harte Arbeit sehr – oryan5000

Verwandte Themen