excel 从MATCH返回列引用以避免对命名范围使用INDIRECT

rsaldnfx  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(184)
    • TL; DR**:我基本上是尝试获取一个列范围,如'Sheet 1'!$A:$A,其中A是通过将给定单元格的内容与另一个给定单元格引用的工作表中的1:1范围进行匹配来获得的,以便在动态范围中使用。

在极有可能的情况下,这是毫无意义的,这里有一个例子:
参数:A2 = "LIST"|C2 = "FirstName"|预期结果:'LIST'!$A:$A
我已经得到了,但是,我不能在公式中使用输出('LIST '! $A:$A)(即创建一个动态范围)。例如,这里的' LIST '! $A:$A包含101个单元格,其中有值:
V3 = NamedFormula ='列表'! $A:$A
COUNTA(INDIRECT(V3)) = 101
COUNTA(INDIRECT(NamedFormula)) = 1,因为它的计算结果为#VALUE,并且这是一个奇异结果。
在深入探讨 * 使用INDIRECT和Named Range * 这个主题之前(我已经读到过这方面的内容,现在还在从困惑的悲伤中恢复过来),我意识到我的Names有点失控了。我倾向于像一个疯狂的科学家一样使用Excel。所以,如果有一个更简单的解决方案可以解决我正在尝试做的事情,我的实际任务是:

    • 0.**我正在构建一个工具,以简化从不同数据构建电子邮件地址的过程,该过程需要在没有任何脚本的情况下运行,只有公式。
    • 1.**没有强加名称的选项卡将包含一个用户数据库,该数据库具有最小的(名字和姓氏或ID)AND(可能是其他数据列),没有特定的顺序。工具用户将根据客户端从数据到达的任何地方导入该选项卡,并且只需要将相关的标题复制粘贴到主选项卡,而不需要为了数据完整性而在这里更改任何其他内容。
    • 2.**主选项卡将具有特定的输入字段,工具用户将在其中粘贴导入的选项卡的名称以及他们需要的列的标签(例如,包含名字和姓氏的列的第一行中的标签),以及用于构建这些电子邮件地址的域名的输入字段。
    • 3.**数据选项卡用于清理和准备电子邮件地址格式的字符串。
    • 4.**Export(导出)选项卡将显示一个可以导出为CSV的干净电子邮件地址列表。

Data选项卡只有2列,可以使用SUBSTITUTE,例如省略号被删除,但重音字母被规范化(é-〉e)。我在Names中使用了LAMBDA。问题是要把所有东西都绑定进去--把这些命名范围放到最终的公式中。
到目前为止,我使用的名称(我希望使用更少的名称,但我担心测试特定部件会超出简单的使用范围):

    • 字母**={"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,ADDRESS(2,MATCH(labelname,INDIRECT("'"&PARAMETERS!$A$2&"'!$1:$1"),0),1,1,PARAMETERS!$A$2))
    • 兰戈科尔**=LAMBDA(labelname,COLUMN(INDIRECT(LABELS(labelname))))
    • 兰科尔**=LAMBDA(label,"'"&PARAMETERS!$A$2&"'!$"&INDEX(ALPH,RANGECOL(label))&":$"&INDEX(ALPH,RANGECOL(label)))

我还没有把所有东西都绑在数据标签上--我还在尝试自动化我的主标签,然后再进一步推动,并使用数据标签替换所有东西。这将是下一步,不是我目前的重点。但是,对于好奇和感兴趣的人,在数据标签上,我正在使用一些我在ablebits上找到的东西,它会产生奇迹=]
所以,现在如果我使用静态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,而evaluation显示了从INDIRECT(RNCOL($C$3))开始的偏离,等于#VALUE。
我开始看到双重这里,但我永恒的和完全正常的爱Excel阻止我回家工作,因为我的方式太远的兔子洞,让我的痴迷死在这里。
有什么建议可以说明这是如何工作的吗?注意-提供的表单中的所有名称都是由在线假名生成器生成的,这里没有任何实际的用户数据#GDPR
提前感谢!〈3
测试表可通过Google Drive获得。

vjhs03f7

vjhs03f71#

你目前的设置是不好的原因有很多,在我看来,将需要一个完整的大修,其范围超出了本网站的回应。
至于对当前问题的“快速修复”,E1中的公式当前返回错误的原因是,正如您通过逐步使用 Evaluate Formula 工具所看到的,
COUNTA(INDIRECT(RNCOL($C$2)))-1
决心
COUNTA(INDIRECT({"'LIST'!$A:$A"}))-1
而这和...不一样...
COUNTA(INDIRECT("'LIST'!$A:$A"))-1
传递给INDIRECT的值在前者中是一个 array,而在后者中不是。尽管INDIRECT可以接受数组,但它仅在某些结构中与其他合适的函数结合使用;这里它将简单地出错。
它返回一个数组的原因是因为RNCOL($C$2)返回了一个数组,这是因为这个函数被定义为
=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 参数,因此
x1米11米1x
决心
{"A"}
它是一个 * 数组 *(尽管它包含单个值),并且在技术上不同于
"A"
在大多数情况下,这不是一个问题。因此,在索引一维数组时,几乎总是没有必要同时将 row_numcolumn_num 参数传递给INDEX。但在这里,这很重要。
您可以通过显式包含 column_num 参数来解决此问题,即将RNCOL重新定义为
=LAMBDA(label,"'"&PARAMETERS!$A$2&"'!$"&INDEX(ALPH,RANGECOL(label),1)&":$"&INDEX(ALPH,RANGECOL(label),1))

相关问题