从一个新列的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;;"