Vba 从新列上的日期值减去一年

Vba 从新列上的日期值减去一年,vba,excel,Vba,Excel,我正在运行一个宏,将日期值从单元格J4取到最后一行,值在列上,并将新值放在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.Rang

我正在运行一个宏,将日期值从单元格J4取到最后一行,值在列上,并将新值放在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 & ")")
`

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

你们能帮我纠正一下吗,如果J4上的值是2017年1月2日,那么L4上显示的是2016年1月2日


谢谢

评估有两种形式:

  • 应用程序(默认)-使用
    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
子测试仪()
Const dtFORM As String=“=IF(ISNUMBER(J4:J))、日期(YEAR(YEAR)(J4:J)-1、”_
“月(J4:J),日(J4:J)),J4:J”
尺寸输入WS1作为工作表,lastRowUniversal
设置inputWS1=ThisWorkbook.Sheets(“通用”)
lastRowUniversal=inputWS1.Cells(Rows.Count,“A”).End(xlUp).Row
“####使用*工作表*形式进行评估###
inputWS1.Range(“L4:L”和lastRowUniversal)。值=_
inputWS1.Evaluate(替换(dtFORM,“,lastRowUniversal))
端接头
它按预期工作

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

我还设置了Application.ScreenUpdate,只要工作表“Universal”是活动工作表,它就可以工作。这是真的,因为所使用的公式不符合工作表引用。这对我来说非常有用,因为我使用的是工作表表单!谢谢