2017-09-06 50 views
1

我正在運行一個宏,將單元格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的價值是02/01/2017它顯示L4的02/01/2016?

謝謝!

+0

我有它設置以及 –

回答

3

有兩種形式評價的:

  • 應用(默認) - 使用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 
+0

的Application.ScreenUpdating這一個,因爲我現在用的工作形式,工作對我來說太棒了!謝謝! –

0

它按預期工作。

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

只要工作表「通用」是活動工作表,它就會工作。 –

+0

這是真的,因爲使用的公式不符合工作表參考。 – sktneer

相關問題