【问题标题】:Use formula to dynamically modify named range使用公式动态修改命名范围
【发布时间】:2015-08-09 21:31:26
【问题描述】:

我在工作簿中使用了一堆命名范围。以下是当他们要求我对其进行修改时,它是如何改变以使其更具活力的历史记录。

我想要做的是从 1 到 100 的 A 列中搜索 A 列中的标签(我将其编码到命名范围公式中),并且在找到它的位置,命名范围将知道是行。我知道,如果我们更改了一行的名称,我仍然需要更新命名范围,但我只需要更新一个命名范围,而不是像现在每当我们进行更改时那样更新 75-100 个命名范围。

这是我正在使用的当前命名范围:

=INDIRECT("Input!$C$23:"LastColumn&"$23")

LastColumn 是一个命名范围,包含最后一列的字母。

以下是我为什么这样做的一些历史:

当我第一次创建它时,我直接在公式中引用了单元格(没有命名范围),并且每当我添加另一行、列等时都必须更改所有公式。然后我将它切换到命名引用。这修复了它,所以每当我们添加一行时,我根本不需要更改引用。但是,每当我们更改列数时,我仍然必须更改所有引用。我所做的是使列可变,因此如果我们更改列的数量,我不必对命名范围进行任何更改。不幸的是,这样做会产生意想不到的后果,所以每当我添加、删除或移动一行时,我都需要更新所有引用。现在,我有一个想法可以使行和列都可变。因此,我可以进行任何更改而无需更新任何参考。

我需要这样做,因为大多数时候这些列都是空的,我不知道它们什么时候会有数据。

【问题讨论】:

  • TL;博士。请阅读How to Ask。创建一个简单的 MCVE,问一个简单的问题。
  • @Amit,问题很简单——剩下的就是我为什么需要这样做的原因。我让区分问题和历史变得更容易了。
  • 哪一行总是包含正确数量的非空白条目,它是否包含数字或文本?示例:标题行将始终包含数据矩阵范围内的条目,而数据行的最后一列中可能包含也可能不包含空格。
  • @Jeeped 没有。我对列没有问题。我现在需要使行动态化。这些列已经是动态的。
  • 我绝不会建议一种更好的方法来以更有效的方式完成这两项任务。祝你的项目好运!

标签: excel excel-formula named-ranges


【解决方案1】:

放弃易失性INDIRECT function 并使用INDEX function 作为范围的终止,MATCH 定位最后一列。该行可以通过 A 列到“标签”的 MATCH 来确定。

据我了解,您希望在 A 列中找到“标签”,并使其位置定义 =INDIRECT("Input!$C$23:"LastColumn&"$23") 中的行,其中 23 当前定义了该行。

放弃INDIRECT,Input!$C$23引用可以改为:

=INDEX(Input!$C:$C, MATCH("Label", Input!$A:$A, 0))

所以剩下的就是找到最后一列。该工作表上必须有 一些东西 可用于定位最后一列,而不管列是否删除或添加,但我将只使用 A 列中包含“标签”的行中的最后一个值。

'this finds the last text value in row 23
=MATCH("zzz", Input!23:23)
'this finds the last number or date value in row 23
=MATCH(1e99, Input!23:23)
'since I do not know whether *the row* (e.g. 23:23) contains text, numbers, dates 
'or a combination of any of those, I will have to double up the formula and add error control
=MAX(IFERROR(MATCH("zzz", Input!23:23), 0), IFERROR(MATCH(1e99, Input!23:23), 0))

您可以用冒号将两个 INDEX 函数拼接在一起,就像您键入 C23:Z23 一样。

=INDEX(Input!$C:$C, MATCH("Label", Input!$A:$A, 0)):INDEX(Input!$A:$ZZ,MATCH("Label",Input!$A:$A,0),MAX(IFERROR(MATCH(1E+99, INDEX(Input!$A:$ZZ,MATCH("Label",Input!$A:$A,0),0)),0),IFERROR(MATCH("zzz",INDEX(Input!$A:$ZZ,MATCH("Label",Input!$A:$A,0),0)),0)))

是的,它看起来很复杂,但其中很多来自于不知道所讨论的行是否包含文本或数字,并且它比易变的 INDIRECT(只要整个工作簿中的任何内容发生变化时都会重新计算)做的工作更少,同时保持向上 -迄今为止,尽管行和列删除/插入。

顺便说一句,在 INDIRECT 中使用文本作为单元格引用时,不需要使用 $ 绝对引用指示符。 address-as-text 是一个文本字符串;除了重新键入它之外,无论您对它做什么,它都不会改变。上述方法确实需要绝对单元格引用,因为它使用实际的单元格和单元格范围引用。

【讨论】:

  • 抱歉,第一列永远是文本,而不是数字。我感谢您的帮助。再次感谢你:)
  • 吉普车,我将如何简化它?第一列将始终是文本。
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 2023-04-08
  • 2016-11-22
  • 2014-12-21
  • 1970-01-01
  • 2013-08-21
  • 2018-07-05
  • 1970-01-01
相关资源
最近更新 更多