【问题标题】:Clean up Named Range Addresses with Errors (e.g. #REF!)清理有错误的命名范围地址(例如#REF!)
【发布时间】:2019-01-14 16:31:38
【问题描述】:

我设置了一个命名范围,我们称他为 RngIn。 他有 3 个单元格,他的地址指的是 A1:A3

接下来,我删除第 2 行。

我的 RngIn 现在显示 #REF!其 RefersTo 属性中的错误(正确): "=A1,Sheet1!#REF!,A2"

这意味着我无法使用 VBA 操作该命名范围的其余部分,因为全局对象的方法“范围”错误。

范围是在一个过程中创建的,如果用户随后出于某种原因需要删除一行,我未来的代码将失败,因为它需要知道命名范围数据的其余部分在哪里......

我已经尝试了很多方法来访问这个范围的剩余地址信息,在 VBA 中,但到目前为止都失败了,例如

Dim RngAddress As String
Dim RngIn As Range

Set RngIn = Range("A1:A3")
RngAddress = RngIn.Address
RngAddress = RngIn.RefersToRange.Address
RngAddress = RngIn.RefersTo
RngAddress = Replace(RngIn.Address, "Sheet1!#REF!", "")

我理想地希望在文本字符串中看到 RngIn 的结果是: “=A1,A2” 因为 A2 现在是 A3 中数据的位置。

【问题讨论】:

  • A3下面的数据多行吗?您可以重新定义命名范围。我使用 worksheet_change 事件来检测更改,获取新的最后一行并重新创建名称。类似 thisworkbook.names(“my name”).referstorange = mysheet.cells(1,1).resize(lastrow,1)
  • 嘿,谢谢你的建议,但这行不通。我的范围不是连续的(单元格实际上不是 A1、A2、A3,而是更像 A70、A104、A106 等)。我应该在问题中更清楚地说明这一点!

标签: excel vba named-ranges


【解决方案1】:

不确定我是否理解这一点:您的示例代码不使用定义名称(又名命名范围)。 假设您创建了一个名为 RangeIn 的名称,它引用 A1、A3、A5,然后删除第 3 行。

RangeIn 的 RefersTo 现在是 =Sheet1!$A$1,Sheet1!#REF!,Sheet1!$A$4

此代码删除 Sheet1!#REF!,留下 Name RangeIn 引用 =Sheet1!$A$1,Sheet1!$A$4

Option Explicit
Option Compare Text
Sub ChangeRef()
Dim strAd As String
strAd = ThisWorkbook.Names("RangeIn").RefersTo
strAd = Replace(strAd, "Sheet1!#REF!,", "")
ThisWorkbook.Names("RangeIn").RefersTo = strAd
End Sub

【讨论】:

    【解决方案2】:

    在这种情况下,我将命名范围的起点和终点设置为用户可以删除的范围上方的单元格和下方的单元格,然后使用 OFFSET 或 INDEX 函数调整该范围的大小以排除我的书签。或者我使用 Excel 表格,它可以处理行删除而不返回 #REF 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2013-10-20
      相关资源
      最近更新 更多