Excel-如何锁定用作定义名称的公式?

时间:2016-07-01 20:10:40

标签: excel vba excel-vba

所以我创建了一个"名称"在我的工作簿中帮助我使用宏来运行高级过滤器。这是公式:

=OFFSET('Property Data'!$A$6,,,COUNTA('Property Data'!$A$5:$N$69),14)

除了我有一个"删除"写入工作簿的函数,允许你删除行...包括第6行。当第6行被删除时,这个" name"更改为:

=OFFSET('Property Data'!#REF!,,,COUNTA('Property Data'!$A$5:$N$69),14)

这显然会破坏高级过滤器的宏,因此用户无法编辑数据库中的现有条目。

所以我需要做的是找到一种方法来锁定这个公式,这样它就不会抛出一个错误,说明要引用的单元格已被删除,而它只使用新的第6行。

我已经看到使用括号" {}"但我不确定这是怎么回事。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您应修改您的名称公式,否则行删除不会修改。

两种方式:

  1. 将其锚定到一个永远不会被删除的行,例如,如果从未删除第1行,请使用

    =OFFSET('Property Data'!$A$1,5,,COUNTA('Property Data'!$A$5:$N$69),1)
    
  2. 使用INDIRECT指定范围

    =OFFSET(INDIRECT("'Property Data'!$A$6"),,,COUNTA('Property Data'!$A$5:$N$69),14)
    
  3. 对于这些(和您的原始)行删除也可能会影响'Property Data'!$A$5:$N$69部分。如果不希望这样做,请使用INDIRECT来指定。

答案 1 :(得分:0)

每当有人删除一行时重新分配公式。

检测deleted row

Private Sub Worksheet_Activate()
    glOldRows = Me.UsedRange.Rows.Count
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

        If Me.UsedRange.Rows.Count < glOldRows Then
            MsgBox “Row deleted”
        End If

    glOldRows = Me.UsedRange.Rows.Count

End Sub

现在您要将MsgBox行替换为重新分配。

ThisWorkbook.Names("FilterData").RefersTo = "=OFFSET('Property Data'!$A$6,,,COUNTA('Property Data'!$A$5:$N$69),14)"

所以最终的结果应该是:

希望这有帮助。

干杯