我在工作簿中使用了一堆命名范围。这是它是如何改变的历史,使它更动态,当他们要求我修改它。
我要做的是从1到100搜索A列中的标签(我将其编码到命名范围公式中),并且在找到它的地方,命名范围将知道是行。我知道我仍然需要更新命名范围,如果我们改变了一行的名称,但我只需要更新一个命名范围,而不是像我现在所做的那样,每当我们做出改变。
这是我正在使用的当前命名范围:
=INDIRECT("Input!$C$23:"LastColumn&"$23")
LastColumn是包含最后一列的字母的命名范围。
这里有一些关于我为什么这样做的历史:
当我第一次创建它时,我直接在公式中引用单元格(没有命名范围),并且每当我添加另一行,列等时必须更改所有公式。然后我将其切换为命名引用。这修复了它,所以每当我们添加一行时,我根本不需要更改引用。但是,每当我们更改列的数量时,我仍然必须更改所有的引用。我所做的是使列变量,所以如果我们改变列的数量,我不必对命名范围做任何改变。不幸的是,这带来了意想不到的后果,每当我添加、删除或移动一行时,我都需要更新所有引用。现在,我有一个想法,将行和列都变成变量。因此,我可以在不更新任何引用的情况下进行任何更改。
我需要这样做,因为大多数时候列将是空的,我不知道何时它们将包含数据。
放弃易失的INDIRECT函数,并使用INDEX函数来终止范围,MATCH位于最后一列。行可以通过a列到"Label"的MATCH来确定。
据我所知,您希望在A列中找到"Label",并让其位置定义=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中使用text-as-cell-references时,不需要使用$ absolute reference指示符。地址即文本是一个文本字符串;它不会改变,无论你做什么,除了重新输入它。上面的方法需要绝对的单元格引用,因为它使用的是实际的单元格和单元格范围引用。