2017-09-03 51 views
1

我試圖添加一年到其添加到列中的任何值。我不想粘貼到一個新列,而是替換同一列上的值。將一年添加到一個值範圍 - Excel VBA

至今編寫的代碼IVE是:

Private Sub Update_Click() 

    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 

    Dim path As String, fileName As String 
    Dim lastRowInput As Long, lastRowOutput As Long, rowCntr As Long, lastColumn As Long 
    Dim inputWS1 As Worksheet, outputWS As Worksheet 

    Set inputWS1 = ThisWorkbook.Sheets("Universal") 
    Set outputWS = ThisWorkbook.Sheets("Carriers") 


    rowCntr = 1 

    lastRowInput = inputWS1.Cells(Rows.Count, "A").End(xlUp).Row 
    lastRowOutput = outputWS.Cells(Rows.Count, "A").End(xlUp).Row 
    lastColumn = inputWS1.Cells(1, Columns.Count).End(xlToLeft).Column 

    inputWS1.Range("A4:A" & lastRowInput).Copy outputWS.Range("B2") 
    inputWS1.Range("B4:B" & lastRowInput).Copy outputWS.Range("C2") 
    outputWS.Range("E2:E" & (lastRowInput - 2)).Value = inputWS1.Name 
    inputWS1.Range("J4:J" & lastRowInput).Copy outputWS.Range("G2") 
    inputWS1.Range("G2:G" & lastRowInput).Value = DateAdd("yyyy", -1, CDate(inputWS1.Range("G2:G" & lastRowInput))) 

    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 

End Sub 

我需要你們幫我該生產線是:

使用DateAdd( 「YYYY」,-1,CDATE(inputWS1.Range (「G2:G」 & lastRowInput)))

其中inputWS1是我的表和lastrowinput的名字是我的變量來查找該列的最後一行。當時我把這個代碼放在G2上已經有了值,我只是想把它們轉換成最後一年的日期而已。

請幫忙

+1

當您單擊按鈕時,您想要爲單元格列添加一年。 ......您計劃點擊按鈕多少次? – jsotola

+0

實際上一個月一次,因爲按鈕會導入單元格中的新數據。然而,它只是用舊數據中的數據覆蓋舊數據。因此,基本上每次點擊按鈕時,它都會清除新工作表上的所有內容,並從舊工作表中複製它。 –

+0

你應該提到你正在刪除工作表內容。我試圖找出在多個宏運行中僅更新一次的機制 – jsotola

回答

1

您也可以使用評估功能來一次像下面執行計算...

inputWS1.Range("G2:G" & lastRowInput).Value = Evaluate("=IF(ISNUMBER(G2:G" & lastRowInput & "),DATE(YEAR(G2:G" & lastRowInput & ")-1,MONTH(G2:G" & lastRowInput & "),DAY(G2:G" & lastRowInput & ")),G2:G" & lastRowInput & ")") 

合併到您的代碼,你想一個在G列中減去一年以上線

+0

我加了這條線,什麼都沒有發生。沒有錯誤。 –

+0

我用一些虛擬數據測試了這個代碼,它沒有問題。例如如果InputWS1中G2的日期爲09/01/2017,則它將更改爲09/01/2016。這不是你想要達到的目標嗎? – sktneer

+0

對不起,它工作! –

0

您需要使用dateadd函數轉換單元格的具體值。

Private Sub Update_Click() 

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 

Dim path As String, fileName As String 
Dim lastRowInput As Long, lastRowOutput As Long, rowCntr As Long, lastColumn As Long 
Dim inputWS1 As Worksheet, outputWS As Worksheet 

Set inputWS1 = ThisWorkbook.Sheets("Universal") 
Set outputWS = ThisWorkbook.Sheets("Carriers") 


rowCntr = 1 

lastRowInput = inputWS1.Cells(Rows.Count, "A").End(xlUp).Row 
lastRowOutput = outputWS.Cells(Rows.Count, "A").End(xlUp).Row 
lastColumn = inputWS1.Cells(1, Columns.Count).End(xlToLeft).Column 

inputWS1.Range("A4:A" & lastRowInput).Copy outputWS.Range("B2") 
inputWS1.Range("B4:B" & lastRowInput).Copy outputWS.Range("C2") 
outputWS.Range("E2:E" & (lastRowInput - 2)).Value = inputWS1.Name 
inputWS1.Range("J4:J" & lastRowInput).Copy outputWS.Range("G2") 
'inputWS1.Range("G2:G" & lastRowInput).Value = DateAdd("yyyy", -1, CDate(inputWS1.Range("G2:G" & lastRowInput))) 
Dim vDB As Variant, i As Long 
vDB = inputWS1.Range("G2:G" & lastRowInput) '<~~ get data to variant array vDB 
For i = 1 To UBound(vDB,1) 
    vDB(i, 1) = DateAdd("yyyy", -1, CDate(vDB(i, 1))) 
Next i 
inputWS1.Range("G2:G" & lastRowInput) = vDB 


Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 
End Sub 
+0

我在行「vDB(i,1)= DateAdd(」yyyy「,-1,CDate(vDB(i,1))))」中得到一個錯誤。 –

相關問題