【问题标题】:How to keep named range formula from changing cell values with VBA如何防止命名范围公式使用 VBA 更改单元格值
【发布时间】:2016-10-14 03:59:11
【问题描述】:

我在尝试调试 VBA 例程时注意到一个有趣的问题,该例程对某个范围内的工作表列表进行排序,然后重新绘制该范围周围的边框。

包含的范围在名称管理器中使用如下公式定义

=Tables!$L$2:$L$22

出现的问题是,在进行工作表名称工作时,有时会删除单元格,有时会插入单元格。这会更改命名范围内的单元格地址值。因此,如果我删除了两个单元格并插入了一个单元格,则公式将更改为

=Tables!$L$2:$L$21

如果我碰巧插入到第一个单元格 (L2) 中,那么公式将变为

=Tables!$L$3:$L$22

我确定可以使用标题范围名称并偏移一来解决问题,但我不确定如何在命名范围的公式中执行此操作,因为我尝试了多种方法但不能修正它。但我还需要结束范围地址是静态的。

任何帮助表示赞赏。

【问题讨论】:

  • 去掉$的.=Tables!L2:L22

标签: vba excel named-ranges


【解决方案1】:

要尝试的一件事是使用:

=Indirect("Tables!$L$2:$L$22")

而不是

=Tables!$L$2:$L$22

这是一个可接受的名称,但我不确定您是否会获得相同的功能。

【讨论】:

  • @Garys Student...查看我发布的答案,我认为这可能会更好,好奇您的意见,因为如果我在该范围内删除或添加单元格,则范围保持不变。
【解决方案2】:

找到了比使用静态标题范围的评论更好的方法。您只需使用标题中的偏移函数定义整个范围。

=OFFSET(AllSheetsHeader,1,0,21,1)

其中 1,0,21,1 是距标题的 1 行偏移量,0 列偏移量,21 是行高,1 只是那一列

【讨论】:

  • 它应该可以工作 ......我的问题是我不知道名称是如何在其他工作表公式中使用的,所以我无法测试。
  • @Gary 的学生...我有三个命名范围 AllSheetsHeader、AllSheetsRange,这是定义的内容,以及 AllSheetsNames,它是仅包含在 AllSheetsRange、AllSheetsNames 中具有工作表名称的单元格的范围as =OFFSET(AllSheetsHeader,1,0,COUNTA(AllSheetsRange)) 所以应该没问题,你同意吗?
  • 如果你测试它并且它有效,那么使用它....................使用 Indirect()在我的例子中确实不好。
猜你喜欢
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多