2017-09-03 90 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))))”中得到一个错误。 –