繁体   English   中英

从 MATCH 返回列引用以避免将 INDIRECT 与命名范围一起使用

[英]Returning a column reference from MATCH to avoid using INDIRECT with a Named Range

TL;DR :我基本上是在尝试获取列范围,例如'Sheet 1':$A:$A ,其中 A 是通过将给定单元格的内容与引用的工作表中的 1:1 范围进行匹配而获得的另一个给定的单元格,用于动态范围。

在极有可能零意义的情况下,这里有一个例子:

参数:A2 = "LIST" | C2 = "FirstName" | 期望的结果: 'LIST':$A:$A

我已经知道了,但是,我不能在公式中使用 output ('LIST':$A.$A) (即创建动态范围),例如:这里 'LIST':$A:$ A 包含 101 个单元格,其中包含值:

V3 = NamedFormula = 'LIST':$A:$A

COUNTA(INDIRECT(V3)) = 101

COUNTA(INDIRECT(NamedFormula)) = 1 因为它的计算结果为#VALUE,这是一个单一的结果。

在深入研究将 INDIRECT 与命名范围结合使用的主题之前(我已经阅读过并且仍在克服我的困惑悲伤),我意识到我的名字有点失控了。 我倾向于像疯狂科学家一样使用 Excel。 所以,如果我想做的事情有一个更简单的解决方案,这是我的实际任务:

0.我正在构建一个工具来简化一个过程,其中 email 个地址是从不同的数据构建的,它需要在没有任何脚本的情况下运行,只有公式。

1.没有强加名称的选项卡将包含一个用户数据库,其中至少(名字和姓氏或 ID)和(可能是其他数据列)没有特定顺序。 工具用户将根据客户端从数据到达他们的任何地方导入该选项卡,并且只需要将相关标题复制粘贴到主选项卡,而无需更改此处的任何其他内容以确保数据完整性。

2.主选项卡将有特定的输入字段,工具用户可以在其中粘贴导入选项卡的名称以及他们需要的列的标签(例如,列的第一行中的标签包含名字和姓),以及用于构建这些 email 地址的域名的输入字段。

3.引用数据选项卡来清理和准备 email 地址格式的字符串。

4. “导出”选项卡会弹出一个干净的 email 地址列表,可以导出到 CSV。

“数据”选项卡只有 2 列可与 SUBSTITUTE 一起使用,以便例如删除撇号但重音字母被规范化 (é -> e)。 我在 Names 中使用 LAMBDA 到达那里。 问题是将所有内容都绑定在一起——将那些命名范围纳入最终公式。

到目前为止我使用的名称(我想使用更少但我担心测试超出简单用法的特定部分):

ALPH ={"A";"B";"C";"D";"E";"F";"G";"H";"I";"J";"K";"L";"M";"N";"O";"P";"Q";"R";"S";"T";"U";"V";"W";"X";"Y";"Z"}

标签 =LAMBDA( labelname =LAMBDA(labelname,ADDRESS(2,MATCH(labelname,INDIRECT("'"&PARAMETERS:$A$2&"',$1,$1"),0),1,1,PARAMETERS!$A$2))

RANGECOL =LAMBDA(labelname,COLUMN(INDIRECT(LABELS(labelname))))

RNCOL =LAMBDA(label,"'"&PARAMETERS,$A$2&"':$"&INDEX(ALPH,RANGECOL(label))&":$"&INDEX(ALPH,RANGECOL(label)))

我还没有将所有内容都绑定到“数据”选项卡中——我仍在尝试自动化我的主选项卡,然后再进一步推进并在所有内容之上使用“数据”选项卡替换。 那将是下一步,而不是我目前的重点。 但是,出于好奇和兴趣,在“数据”选项卡上,我使用了一些我在ablebits上发现的东西,它能创造奇迹 =]

所以,现在如果我将偏移范围与 static LIST:A:A一起使用,它会起作用:

=IF($C$2<>"",LOWER(INDEX(OFFSET(INDIRECT(ADDRESS(2,MATCH($C$2,INDIRECT("'"&$A$2&"'!$1:$1"),0),1,1,$A$2)),0,0,COUNTA(LIST!A:A)-1,1),ROW())),"") &IF($C$3<>"","."&LOWER(INDEX(OFFSET(INDIRECT(ADDRESS(2,MATCH($C$3,INDIRECT("'"&$A$2&"'!$1:$1"),0),1,1,$A$2)),0,0,COUNTA(LIST!A:A)-1,1),ROW())),"") &"@"&$C$4

但是当我尝试使用动态RNCOL($C$3)它不会:

=IF($C$2<>"",LOWER(INDEX(OFFSET(INDIRECT(LABELS($C$2)),0,0,COUNTA(INDIRECT(RNCOL($C$2)))-1,1),ROW())),"") &IF($C$3<>"","."&LOWER(INDEX(OFFSET(INDIRECT(LABELS($C$3)),0,0,COUNTA(INDIRECT(RNCOL($C$3)))-1,1),ROW())),"") &"@"&$C$4

这只给出了#REF,并且评估显示了从 INDIRECT(RNCOL($C$3)) 开始等于#VALUE 的离题。

我开始在这里看到双重身份,但我对 Excel 的不朽和完全正常的爱阻止我下班回家,因为我太深入兔子洞了,无法让我的痴迷在这里消亡。

关于这如何工作的任何指示? 注意 - 所提供表格中的所有名称均由在线假名生成器生成,此处没有任何内容是实际用户数据#GDPR

提前致谢! <3

测试表可通过Google 云端硬盘获得。

由于多种原因,您当前的设置并不好,我认为需要彻底检修,其中的 scope 超出了本网站的回复范围。

至于对当前问题的“快速修复”, E1中的公式当前返回错误的原因是,正如您通过使用“评估公式”工具逐步执行所看到的那样,该部分

COUNTA(INDIRECT(RNCOL($C$2)))-1

正在解决

COUNTA(INDIRECT({"'LIST':$A:$A"}))-1

COUNTA(INDIRECT("'LIST':$A:$A"))-1

因为传递给INDIRECT的值在前者中是一个数组,但在后者中不是。 虽然INDIRECT可以接受 arrays,但它只能在某些构造中与其他合适的函数结合使用; 在这里它只会出错。

它返回一个数组的原因是RNCOL($C$2)返回一个数组,那是因为 function 被定义为

=LAMBDA(label,"'"&PARAMETERS,$A$2&"':$"&INDEX(ALPH,RANGECOL(label))&":$"&INDEX(ALPH,RANGECOL(label)))

并且,由于RANGECOL($C$2)在这里解析为 1,因此以上等同于

"'PARAMETERS,$A$2':$"&INDEX(ALPH,1)&":$"&INDEX(ALPH,1)

在这里,因为您从INDEX中省略了column_num参数,所以部分

INDEX(ALPH,1)

正在解决

{"A"}

这是一个数组(尽管一个包含单个值)并且在技术上不同于

"A"

在大多数情况下,这不是问题。 因此,在索引一维数组时,几乎总是没有必要同时将row_numcolumn_num参数传递给INDEX 然而,这很重要。

您可以通过显式包含column_num参数来解决此问题, RNCOL重新定义为

=LAMBDA(label,"'"&PARAMETERS,$A$2&"',$"&INDEX(ALPH:RANGECOL(label),1)&",$"&INDEX(ALPH,RANGECOL(label),1))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM