为这个暧昧的头衔道歉。
我目前在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年。
但是,在我浏览所有统计数据的主页上,年数仍然是10年,而不是14年。
我想确保主面板上的年数与利润表(PL)中的年数相同,因为它是动态的,我可以使用以下宏添加/删除年份。什么是可行的方法来做到这一点? (目前它是固定的,仅限于10年,我使用hlookup函数链接它们)
使用解决方案:
答案 0 :(得分:3)
在主标签中使用此公式代替Year 0
,Year 1
,Year 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(...