删除后恢复公式
Re-instate formulas when deleted
上下文
我正在尝试制作一个简单的多户家庭租赁分析工作表。最终用户对 excel 一无所知。一个部分的数据点是单元类型、每种类型的单元数、每个单元的月租金、 单位年租金。我希望用户能够输入 月租金 并计算 年租金 或反之亦然(假设在这两种情况下,他们还输入了每种类型的 单位数 )。所讨论的公式比您想象的要简单:
月租 = 年租 / 12 / 人数单位
年租金 = 月租金 * 单位数量 * 12
我启用了迭代计算,以便在每个租金列中保留一个公式,因为它们在计算时相互依赖(相关公式)。这很好用,但仅适用于第一个条目。如果用户输入了 月租金 数据,但现在想输入 年度数据,那么月度计算公式就消失了。 但是, 我可以使用下面粘贴的 Private Sub Worksheet_Change(ByVal Target As Range)
中的一些狡猾代码来解决这个问题。这非常有效。每当更改一个时,都会为另一个插入公式,覆盖用户输入--除非...其中一个公式被删除而不是刚刚更改。
问题
我找不到有关如何在用户删除公式时插入公式的任何信息。例如:假设用户之前输入了 月租金 的信息,并且工作表自动计算了年租金。现在,当用户返回删除 monthly rent 时,monthly rent cell 并没有被重置,它是空的。该公式不再存在,当他们编辑年租金时,VBA 不会恢复月租金公式。
我不知道:
为什么注释掉的 ElseIf 块不起作用
为什么有时删除输入到一个相关单元格中的信息会清除另一个相关单元格,而有时却不会
为什么删除一个公式并编辑另一个公式不会恢复已删除的公式。例如。删除月租然后编辑年租不会重新创建月租公式
当用户删除其中一个依赖公式时,理想的行为是将单元格 return 置于其起始位置,同时两个循环公式都已就位。似乎只需在删除公式后重新输入公式就可以解决问题,但令人惊讶的是,我找不到任何关于如何做到这一点的帮助。
Private Sub Worksheet_Change(ByVal Target As Range)
'Macro replaces formulas in circular reference cells
'This is to allow users to enter a piece of data in one
'column and have the other column automatically calculate,
'even if they had already entered data into the cell that
'calculates.
'
'FOR EXAMPLE: users can enter the monthly rent to have the
'annual rent calculate OR they can enter the annual rent to
'have the monthly rent calculate (assuming they have also
'provided number of units in the No. of Units column). This
'macro overwrites the cell contents of the unused column, allowing
'users to enter a monthly rent figure and see what the annual rent
'is but then to specify the annual rent and have the monthly rent
'column overwrite their previously entered figure
Dim AnnualRent, MonthlyRent As Range
Dim cll As Variant
'Dynamically set the ranges of interest, to allow users to
'add rows willy-nilly
Set AnnualRent = Range("R2:R" & Range("Total_Ann_Rent").Row - 1)
Set MonthlyRent = Range("P2:P" & Range("Total_Ann_Rent").Row - 1)
'It is necessary to disable event listening to prevent an infinite loop
Application.EnableEvents = False
'Handle subsequent changes to the ranges set above, specifically,
'to rebuild the circularity
For Each cll In Target.Cells
With cll
'Make a persistent formula for MonthlyRent
If Not Intersect(cll, MonthlyRent) Is Nothing _
And .Offset(0, 2).FormulaR1C1 <> "=RC[-2]*12*RC[-11]" Then
.Offset(0, 2).FormulaR1C1 = "=RC[-2]*12*RC[-11]"
' 'Reinstate the MonthlyRent when it's deleted
' ElseIf Not Intersect(cll, MonthlyRent) Is Nothing _
' And .Formula Is Nothing Then
'
' .FormulaR1C1 = "=IFERROR(RC[2]/12/RC[-9],0)"
'Make a persistent formula for Annual Rent
ElseIf Not Intersect(cll, AnnualRent) Is Nothing _
And .Offset(0, -2).FormulaR1C1 <> "=IFERROR(RC[2]/12/RC[-9],0)" Then
.Offset(0, -2).FormulaR1C1 = "=IFERROR(RC[2]/12/RC[-9],0)"
' 'Reinstate Annual Rent formula when it's deleted
' ElseIf Not Intersect(cll, AnnualRent) Is Nothing _
' And .formula Is Nothing Then
'
' .Formula R1C1 = "=RC[-2]*12*RC[-11]"
End If
End With
Next cll
Application.EnableEvents = True
End Sub
更好的方法(因为您已经在使用事件处理程序来响应更改)可能是完全跳过公式,而是当用户直接更改月度或年度金额时,只需更新该单元格上的其他单元格行。
或者,如果您想继续当前的方法:
而不是
... And .Formula Is Nothing Then
使用
... And Len(.Formula) = 0 Then
"Formula" 当单元格没有公式时 returns 只是一个空字符串。
上下文
我正在尝试制作一个简单的多户家庭租赁分析工作表。最终用户对 excel 一无所知。一个部分的数据点是单元类型、每种类型的单元数、每个单元的月租金、 单位年租金。我希望用户能够输入 月租金 并计算 年租金 或反之亦然(假设在这两种情况下,他们还输入了每种类型的 单位数 )。所讨论的公式比您想象的要简单:
月租 = 年租 / 12 / 人数单位
年租金 = 月租金 * 单位数量 * 12
我启用了迭代计算,以便在每个租金列中保留一个公式,因为它们在计算时相互依赖(相关公式)。这很好用,但仅适用于第一个条目。如果用户输入了 月租金 数据,但现在想输入 年度数据,那么月度计算公式就消失了。 但是, 我可以使用下面粘贴的 Private Sub Worksheet_Change(ByVal Target As Range)
中的一些狡猾代码来解决这个问题。这非常有效。每当更改一个时,都会为另一个插入公式,覆盖用户输入--除非...其中一个公式被删除而不是刚刚更改。
问题
我找不到有关如何在用户删除公式时插入公式的任何信息。例如:假设用户之前输入了 月租金 的信息,并且工作表自动计算了年租金。现在,当用户返回删除 monthly rent 时,monthly rent cell 并没有被重置,它是空的。该公式不再存在,当他们编辑年租金时,VBA 不会恢复月租金公式。
我不知道:
为什么注释掉的 ElseIf 块不起作用
为什么有时删除输入到一个相关单元格中的信息会清除另一个相关单元格,而有时却不会
为什么删除一个公式并编辑另一个公式不会恢复已删除的公式。例如。删除月租然后编辑年租不会重新创建月租公式
当用户删除其中一个依赖公式时,理想的行为是将单元格 return 置于其起始位置,同时两个循环公式都已就位。似乎只需在删除公式后重新输入公式就可以解决问题,但令人惊讶的是,我找不到任何关于如何做到这一点的帮助。
Private Sub Worksheet_Change(ByVal Target As Range)
'Macro replaces formulas in circular reference cells
'This is to allow users to enter a piece of data in one
'column and have the other column automatically calculate,
'even if they had already entered data into the cell that
'calculates.
'
'FOR EXAMPLE: users can enter the monthly rent to have the
'annual rent calculate OR they can enter the annual rent to
'have the monthly rent calculate (assuming they have also
'provided number of units in the No. of Units column). This
'macro overwrites the cell contents of the unused column, allowing
'users to enter a monthly rent figure and see what the annual rent
'is but then to specify the annual rent and have the monthly rent
'column overwrite their previously entered figure
Dim AnnualRent, MonthlyRent As Range
Dim cll As Variant
'Dynamically set the ranges of interest, to allow users to
'add rows willy-nilly
Set AnnualRent = Range("R2:R" & Range("Total_Ann_Rent").Row - 1)
Set MonthlyRent = Range("P2:P" & Range("Total_Ann_Rent").Row - 1)
'It is necessary to disable event listening to prevent an infinite loop
Application.EnableEvents = False
'Handle subsequent changes to the ranges set above, specifically,
'to rebuild the circularity
For Each cll In Target.Cells
With cll
'Make a persistent formula for MonthlyRent
If Not Intersect(cll, MonthlyRent) Is Nothing _
And .Offset(0, 2).FormulaR1C1 <> "=RC[-2]*12*RC[-11]" Then
.Offset(0, 2).FormulaR1C1 = "=RC[-2]*12*RC[-11]"
' 'Reinstate the MonthlyRent when it's deleted
' ElseIf Not Intersect(cll, MonthlyRent) Is Nothing _
' And .Formula Is Nothing Then
'
' .FormulaR1C1 = "=IFERROR(RC[2]/12/RC[-9],0)"
'Make a persistent formula for Annual Rent
ElseIf Not Intersect(cll, AnnualRent) Is Nothing _
And .Offset(0, -2).FormulaR1C1 <> "=IFERROR(RC[2]/12/RC[-9],0)" Then
.Offset(0, -2).FormulaR1C1 = "=IFERROR(RC[2]/12/RC[-9],0)"
' 'Reinstate Annual Rent formula when it's deleted
' ElseIf Not Intersect(cll, AnnualRent) Is Nothing _
' And .formula Is Nothing Then
'
' .Formula R1C1 = "=RC[-2]*12*RC[-11]"
End If
End With
Next cll
Application.EnableEvents = True
End Sub
更好的方法(因为您已经在使用事件处理程序来响应更改)可能是完全跳过公式,而是当用户直接更改月度或年度金额时,只需更新该单元格上的其他单元格行。
或者,如果您想继续当前的方法:
而不是
... And .Formula Is Nothing Then
使用
... And Len(.Formula) = 0 Then
"Formula" 当单元格没有公式时 returns 只是一个空字符串。