如何根据从宏创建的新值更新列值?

时间:2017-12-29 14:38:05

标签: excel vba excel-vba

为这个暧昧的头衔道歉。

我目前在Excel中有一个工作簿,有5张。每张纸都是相互依存的。该工作簿用于根据劳动生产率,成本,销售的新产品等来获取利润。

在主工作表上,可以修改参数,显示 10年的利润。 10年是我预测的默认年数。但是,使用以下宏,我可以添加和删除年份(扩展预测和减少)从最初的10年开始。

延长年限:

Sub YearsNumberExtension()

    Dim LastCol As Long
    Dim DelCnt As Integer
    DelCnt = Sheets("Clients Control Panel").Range("E17").Value
    Dim copyCol As Range
    Dim DestRange As Range
    Dim lastRow As Long

    With ThisWorkbook.Sheets("Employees")

        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

        Set copyCol = .Range(.Cells(1, LastCol), .Cells(lastRow, LastCol))

        Set DestRange = .Range(.Cells(1, LastCol), .Cells(lastRow, LastCol + DelCnt))

        copyCol.AutoFill Destination:=DestRange, Type:=xlFillDefault

    End With

  With ThisWorkbook.Sheets("PL")

        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

        Set copyCol = .Range(.Cells(1, LastCol), .Cells(lastRow, LastCol))

        Set DestRange = .Range(.Cells(1, LastCol), .Cells(lastRow, LastCol + DelCnt))

        copyCol.AutoFill Destination:=DestRange, Type:=xlFillDefault

    End With


  With ThisWorkbook.Sheets("Contracts")

        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

        Set copyCol = .Range(.Cells(1, LastCol), .Cells(lastRow, LastCol))

        Set DestRange = .Range(.Cells(1, LastCol), .Cells(lastRow, LastCol + DelCnt))

        copyCol.AutoFill Destination:=DestRange, Type:=xlFillDefault

    End With

    With ThisWorkbook.Sheets("Employee Time")

        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

        Set copyCol = .Range(.Cells(1, LastCol), .Cells(lastRow, LastCol))

        Set DestRange = .Range(.Cells(1, LastCol), .Cells(lastRow, LastCol + DelCnt))

        copyCol.AutoFill Destination:=DestRange, Type:=xlFillDefault

    End With

End Sub

减少年限

Sub YearsNumberReduction()
Dim LastCol As Long
Dim DelCnt As Integer
DelCnt = Sheets("Clients Control Panel").Range("E19").Value
With ThisWorkbook.Sheets("Contracts")
    LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    If LastCol >= DelCnt Then
        .Range(.Cells(1, LastCol - DelCnt + 1), .Cells(1, LastCol)).EntireColumn.Delete
    End If
End With


With ThisWorkbook.Sheets("Employee Time")
    LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    If LastCol >= DelCnt Then
        .Range(.Cells(1, LastCol - DelCnt + 1), .Cells(1, LastCol)).EntireColumn.Delete
    End If
End With

With ThisWorkbook.Sheets("Employees")
    LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    If LastCol >= DelCnt Then
        .Range(.Cells(1, LastCol - DelCnt + 1), .Cells(1, LastCol)).EntireColumn.Delete
    End If
End With

With ThisWorkbook.Sheets("PL")
    LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    If LastCol >= DelCnt Then
        .Range(.Cells(1, LastCol - DelCnt + 1), .Cells(1, LastCol)).EntireColumn.Delete
    End If
End With

End Sub

当我执行任一个宏时,他们会在主电子表格中指定N次,添加或删除列年数N次。我会调整各种参数。

在这里,N是4,所以从10年开始,在我运行宏之后,它增加了4年。

enter image description here

但是,在我浏览所有统计数据的主页上,年数仍然是10年,而不是14年。

enter image description here

我想确保主面板上的年数与利润表(PL)中的年数相同,因为它是动态的,我可以使用以下宏添加/删除年份。什么是可行的方法来做到这一点? (目前它是固定的,仅限于10年,我使用hlookup函数链接它们)

使用解决方案:

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:3)

在主标签中使用此公式代替Year 0Year 1Year 2 ...

=IFERROR(INDEX(PL!$1:$1,MATCH("Year " &ROW()-1,PL!$1:$1,0)),"")

Row()-1调整为将开始的Year 0行,然后根据需要向下拖动多行。

当PL选项卡中的宏插入或列时,年份将正确显示在主选项卡中。

答案 1 :(得分:0)

你真的需要宏吗?您是否只能使用if返回您的单元格公式或""?因此,假设您的年数在一个名为years_param的单元格中,我将使用XXX代表您在Employees和PL工作表上的当前单元格公式等,然后在这些工作表上用

替换公式
=IF(ROW() - 4 <= years_param, XXX, "")

我假设你的数据从第4行开始,我可能会被一个人关闭,但公式应该给你一般的想法。

然后你可以轻松地为你的TOTAL PROFIT栏做一些类似的事情(假设第0行在第29行,相应调整):

=IF(ROW()-29 <= years_param, "Year "&ROW()-29, "")

现在添加IF,检查HLOOKUP之前列是否为空:

=IF(A29=="","",HLOOKUP(...