Vba 如何基于从宏创建的新值更新列值?

Vba 如何基于从宏创建的新值更新列值?,vba,excel,Vba,Excel,为这个模棱两可的标题道歉 我目前有一个Excel工作簿,有5张工作表。每一张纸都是相互依存的。该手册用于根据劳动生产率、成本、销售的新产品等计算利润 在可以修改参数的主工作表上,显示了10年的利润。10年是我预测的默认年数。但是,使用以下宏,我可以从最初的10年开始添加和删除年份(扩展预测和减少) 延长年: Sub YearsNumberExtension() Dim LastCol As Long Dim DelCnt As Integer DelCnt = Shee

为这个模棱两可的标题道歉

我目前有一个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
当我执行任一宏时,它们会多次添加或删除列years N,在我调整各种参数的主电子表格中指定

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

然而,在我概述所有统计数据的主页上,年份仍然是10年,而不是14年

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

使用解决方案:


你真的需要宏吗?您不能使用
if
返回单元格公式或
”吗?假设你的年数在一个名为
years\u param
的单元格中,我将使用XXX在Employees和PL表等上表示你当前的单元格公式,然后在这些表上用

=IF(ROW() - 4 <= years_param, XXX, "")

你真的需要宏吗?您不能使用
if
返回单元格公式或
”吗?假设你的年数在一个名为
years\u param
的单元格中,我将使用XXX在Employees和PL表等上表示你当前的单元格公式,然后在这些表上用

=IF(ROW() - 4 <= years_param, XXX, "")

使用此公式代替主选项卡中的
第0年
第1年
第2年…

=IFERROR(INDEX(PL!$1:$1,MATCH("Year " &ROW()-1,PL!$1:$1,0)),"")
行()-1
调整为第0年开始的任何行,然后根据需要向下拖动任意多行


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

使用此公式代替主选项卡中的
第0年
第1年
第2年…

=IFERROR(INDEX(PL!$1:$1,MATCH("Year " &ROW()-1,PL!$1:$1,0)),"")
行()-1
调整为第0年开始的任何行,然后根据需要向下拖动任意多行


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

谢谢!不幸的是,我必须使用这些MARO。我看到了你的解决方案,但我想知道是否有可能得到一个代码集,它不仅可以在你想延长年数时插入列,还可以在主电子表格上添加相应的行,其中总年数和相应的利润是聚合的。@gcat这样做,只需将公式向下拖动一点就可以了。您可能需要更改
列()的部分
行()
s
谢谢!不幸的是,我必须使用这些MARO。我看到了你的解决方案,但我想知道是否有可能得到一个代码集,它不仅可以在你想延长年数时插入列,还可以在主电子表格上添加相应的行,其中总年数和相应的利润是聚合的。@gcat这样做,只需将公式向下拖动一点就可以了。您可能需要更改
列()的部分
行()
s
谢谢!我把它延长了两年,但只增加了一年。我想我把公式加对了吧?此外,我认为hlookup函数仅限于指定的数组,因此它无法从第11年及以后获取利润。对此有什么建议吗?如果我说的不够清楚,很抱歉,附页images@gcat-将
HLOOKUP
包装在
IFERROR
中,这样它只显示找到的内容,并根据需要扩展其列查找。远至“我把它延长了两年,但是只增加了一年*-这在你的例子中没有显示出来,所以我不知道你的意思。对我来说很好。干杯。我扩展了hlookup,并将其封装在iferror函数中。奇怪的是,它看起来只上升到11年,我必须手动自动填写利润数字。你知道为什么它在11年后停止工作吗?我想我犯了一个错误,我只是想在加法中算出它,如果我拖动公式,它似乎是有效的,但使用宏,它只适用于11年谢谢!我把它延长了两年,但只增加了一年。我想我把公式加对了吧?此外,我认为hlookup函数仅限于指定的数组,因此它无法从第11年及以后获取利润。对此有什么建议吗?如果我说的不够清楚,很抱歉,附页images@gcat-将
HLOOKUP
包装在
IFERROR
中,这样它只显示找到的内容,并根据需要扩展其列查找。远至“我把它延长了两年,但是只增加了一年*-这在你的例子中没有显示出来,所以我不知道你的意思。对我来说很好。干杯。我扩展了hlookup,并将其封装在iferror函数中。奇怪的是,它看起来只上升到11年,我必须手动自动填写利润数字。你知道为什么它在11年后停止工作吗?我想我犯了一个错误,我只是想在加法中找出它,如果我拖动公式,它似乎是有效的,但使用宏,它只适用于第11年
=IFERROR(INDEX(PL!$1:$1,MATCH("Year " &ROW()-1,PL!$1:$1,0)),"")