从一个新列的date值中抽出一年

我正在运行一个macros,从单元格J4到列的最后一行的date值,并在L4:L上放置新的值,并从同一行J列的值中减去一年。

我有这个步骤的代码是:

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 & ")") 

`

然而,macros通过L4:L上的值显示“1/0/1900”。 所以我知道lastrowvariables正在工作,因为它只运行到J4结束的最后一行。

你们能帮我解决这个问题吗?如果J4的价值是02/01/2017,那么在L4上显示02/01/2016?

谢谢!

有两种forms的评估:

  • 应用程序(默认) – 使用ActiveSheet的范围:可能不是您期望/希望的工作表。
  • 工作表(需要使用工作表对象进行限定) – 使用合格工作表的范围进行操作

您应该使用工作表窗体,否则您可能会收到意想不到的结果。

这对我工作:

 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 

它按预期工作。

您得到1/0/1900,因为J列中的相应单元格可能为空。 试试像这样…

 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;;"