我想建立一个模型。我希望有一个输入页面,您可以在其中输入要涵盖的年份范围。根据输入的年份数,我希望一个表格(在不同的工作表上)填充现有公式。
更具体地说,我有一张充满公式的表格,其中每一行代表一年,范围从 2005 年到 2014 年。
我的要求如下:
有没有办法制作一个输入页面,输入年份并根据输入的范围更改表格并添加/减去行?例如,我们将输入页面上的范围更改为 2005-2018,然后我的表格将添加带有公式的 4 行。
答案1
解决方案
为了实现此自动化,请使用一些 VBA 代码在更新开始年份和结束年份后调整表格大小。
代码
以下是我的实现,其中年份在“Sheet1”(单元格 B1 和 B2)中,表格在“Sheet2”中。请注意,必须将此代码添加到包含年份的工作表中,因为每当您在该工作表上进行任何更改时,代码都必须运行。因此,在我的情况下,此代码被添加到“Sheet1”。
Private Sub Worksheet_change(ByVal Target As Range)
Dim StartYear, EndYour As Range
Dim UpdateTable As ListObject
Dim NrOfRows, OldNrOfRows As Integer
' Set some ranges
Set StartYear = Worksheets("Sheet1").Cells(1, 2)
Set EndYear = Worksheets("Sheet1").Cells(2, 2)
Set UpdateTable = Worksheets("Sheet2").ListObjects("Table1")
' Check if start or end years have changed
If (Not Intersect(StartYear, Target) Is Nothing) Or (Not Intersect(EndYear, Target) Is Nothing) Then
' Store the new and old number of rows
OldNrOfRows = UpdateTable.ListRows.Count - 1
NrOfRows = EndYear.Value - StartYear.Value + 1
' Resize the table
UpdateTable.Resize UpdateTable.Range.Resize(1 + NrOfRows)
'Delete cells below the table if it gets smaller
If OldNrOfRows > NrOfRows Then
UpdateTable.Range.Offset(NrOfRows + 1, 0).Resize(OldNrOfRows - NrOfRows + 1).Delete
End If
End If
End Sub
代码的一些解释
引用一些 Microsoft 函数/方法/属性来解释代码:
- Excel 可以调用子每当单元格上的值发生改变时。调用该子程序
Worksheet_change
并将更改的单元格作为范围值给出。 - 我用相交函数检查包含开始/结束年份的单元格是否已更改。NOT-NOTHING 结构可能会使其阅读起来有点困难,但效果是,
IF
如果 NOT-NOTHING 已更改,则会输入。 - 要调整表格大小,我使用ListObject 的调整大小方法(需要一个范围对象)和范围对象的调整方法(需要一个或两个 int)。
- 最后,如果表格变小,我必须手动删除新表格下面的内容。在这里我再次使用了一些嵌套的范围偏移和范围调整大小功能删除正确的范围。