2017-09-06 1 views
1

Ich bin ein Makro ausführen, um Datumswerte von Zelle J4 bis zur letzten Zeile mit Wert für die Spalte und neue Werte auf L4: L mit einem Jahr von dem Wert an subtrahiert Spalte J derselben Zeile.Substract ein Jahr von Datum Werte in einer neuen Spalte

Der Code für diesen Schritt, den ich habe, ist:

Private Sub Update_Click() 
Dim inputWS1 As Worksheet 
Set inputWS1 = ThisWorkbook.Sheets("Universal") 

lastRowUniversal = inputWS1.Cells(Rows.Count, "A").End(xlUp).Row 

inputWS1.Range("L4:L" & lastRowUniversal).Value = Evaluate("=IF(ISNUMBER(J4:J" & lastRowUniversal & "),DATE(YEAR(J4:J" & lastRowUniversal & ")-1,MONTH(J4:J" & lastRowUniversal & "),DAY(J4:J" & lastRowUniversal & ")),J4:J" & lastRowUniversal & ")") 

`

Das Makro geht jedoch durch auf L4-Werte: L-Show "1/0/1900". Also ich weiß, dass die Lastrow Variable funktioniert, weil es nur bis zur letzten Zeile läuft, wo J4 endet.

Können Sie mir helfen, dies zu korrigieren, wenn Wert auf J4 ist 02/01/2017 es zeigt 01.02.2016 auf L4?

Danke!

+0

ich habe den Application.ScreenUpdating darauf setzt auch –

Antwort

3

Es gibt zwei Formen von Zensur:

  • Anwendung (Standard) - nutzt den Umfang der ActiveSheet: die nicht das Blatt, das Sie/wollen erwarten sein.
  • Arbeitsblatt (muss mit einem Arbeitsblatt-Objekt qualifiziert werden) - betreibt den Umfang der Arbeitsblatt-Qualifikation mit

Sie sollten das Arbeitsblatt Formular verwenden, oder Sie können zu unerwarteten Ergebnissen kommen.

Dieser arbeitete für mich:

Sub Tester() 

    Const dtFORM As String = "=IF(ISNUMBER(J4:J<r>),DATE(YEAR(J4:J<r>)-1," & _ 
          "MONTH(J4:J<r>),DAY(J4:J<r>)),J4:J<r>)" 

    Dim inputWS1 As Worksheet, lastRowUniversal 

    Set inputWS1 = ThisWorkbook.Sheets("Universal") 

    lastRowUniversal = inputWS1.Cells(Rows.Count, "A").End(xlUp).Row 

    '### use the *worksheet* form of Evaluate ### 
    inputWS1.Range("L4:L" & lastRowUniversal).Value = _ 
       inputWS1.Evaluate(Replace(dtFORM, "<r>", lastRowUniversal)) 

End Sub 
+0

Dies ist für mich großartig gearbeitet, wie ich die Arbeitsblatt Form bin mit! Vielen Dank! –

0

Es funktioniert wie erwartet.

Sie erhalten 1/0/1900, da die entsprechende Zelle in Spalte J möglicherweise leer ist. es so probieren ...

Dim lastRowUniversal As Long 
Dim inputWS1 As Worksheet 
Set inputWS1 = ThisWorkbook.Sheets("Universal") 

lastRowUniversal = inputWS1.Cells(Rows.Count, "A").End(xlUp).Row 

inputWS1.Range("L4:L" & lastRowUniversal).Value = Evaluate("=IF(ISNUMBER(J4:J" & lastRowUniversal & "),DATE(YEAR(J4:J" & lastRowUniversal & ")-1,MONTH(J4:J" & lastRowUniversal & "),DAY(J4:J" & lastRowUniversal & ")),J4:J" & lastRowUniversal & ")") 
inputWS1.Range("L4:L" & lastRowUniversal).NumberFormat = "mm/dd/yyyy;;" 
+0

Es funktioniert, solange das Arbeitsblatt "Universal" das aktive Blatt ist. –

+0

Das stimmt, da die verwendete Formel nicht mit der Tabellenreferenz qualifiziert ist. – sktneer

Verwandte Themen