代码之家  ›  专栏  ›  技术社区  ›  Façade

Lambda函数可以使用从ByCol函数传递的文本引用吗?

  •  1
  • Façade  · 技术社区  · 11 月前

    在编写一个从基于文本的引用数组中获取和转换数据的函数时(例如。 {"ref1", "ref2", ...} )我发现了以下问题。

    =BYCOL({"A1"}, LAMBDA(cellRef, ISREF(cellRef)))
    

    退换商品

    FALSE
    

    据我所知,这是问题的最简单形式,我用对参考有效性的简单检查代替了实际的数据计算。

    我不能放弃迭代基于文本的引用,因为真正的引用是表列(例如。 table1[A], table2[A], ... )存储在一维数组中。起初,我试图用纯A1表示法替换我的结构化引用,但这只是解决上述问题的中间步骤 ISREF() 在内部 BYCOL(...Lambda(...)) 退货 FALSE .

    我试过使用 INDIRECT() , T() , INDEX() ,以及 CELL() 以各种(也许是愚蠢的)方式,包括:

    =BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(cellRef))))
    =BYCOL({"A1"}, LAMBDA(cellRef, INDIRECT(ISREF(cellRef))))
    =BYCOL({"INDIRECT(A1)"}, LAMBDA(cellRef, ISREF(cellRef)))
    =BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(T(cellRef)))))
    =BYCOL({"A1"}, LAMBDA(cellRef, ISREF(CELL("address", cellRef))))
    =BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(CELL("address", cellRef)))))
    =BYCOL({"A1"}, LAMBDA(cellRef, ISREF(CELL("address", cellRef))))
    =BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDEX(cellRef, 1))))
    =BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDEX(cellRef, 1, 1))))
    =BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDEX(cellRef, 0))))
    

    但他们都认为 错误的 . 请注意,最后几个使用 INDEX() 仍然失败。我希望 this answer 会有帮助的。

    如果需要一些独特的语法来使这些函数协同工作,或者一些逻辑阻止您以这种方式迭代引用,请告诉我。

    3 回复  |  直到 11 月前
        1
  •  2
  •   VBasic2008    11 月前

    检查数组中的有效范围引用

    • 你只是一个 INDIRECT 你最后三个公式太短了。

    硬编码

    • 你可以用。。。

      =BYCOL({"A1"}, LAMBDA(cellRef,ISREF(INDEX(INDIRECT(cellRef),1))))
      

      …或者更明显

      =BYCOL({"A1","B1","AAA","D1048576","E1048577"},LAMBDA(cellRef,ISREF(INDEX(INDIRECT(cellRef),1))))
      

      …屈服于

      {TRUE,TRUE,FALSE,TRUE,FALSE}
      

    动态

    =A2:A3&"["&B1:G1&"]"                    
    =MAP(B2:G3,LAMBDA(cellRef,ISREF(INDEX(INDIRECT(cellRef),1))))                   
    or:
    =MAP(B2#,LAMBDA(cellRef,ISREF(INDEX(INDIRECT(cellRef),1))))                 
    

    enter image description here

        2
  •  1
  •   nkalvi    11 月前

    一种处理以文本形式给出的结构化引用的方法是 INDIRECT :

    • 表1和;表2包含数据
    • 表3包含上述列的名称
    =REDUCE(
        "Handle table column refs",
        Table3[Col],
        LAMBDA(acc, cur, HSTACK(acc, INDIRECT(cur)))
    )
    

    Formula and result

        3
  •  1
  •   rotabor    11 月前

    没有答案能解释你公式中的错误。

    第二个公式几乎为真,只需将BYCOL替换为MAP:

    =BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(cellRef))))
    -->
    =MAP({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(cellRef))))
    

    问题是BYCOL为每个源项提供值数组:

    {"A1","B1","AAA","D1048576","E1048577"}
    -->
    {"A1"}
    {"B1"}
    {"D1048576"}
    {"E1048577"}
    

    因此 ISREF(INDIRECT(cellRef)) 退货 错误的 .

    可以通过以下方式解决 INDEX 它从数组中获取一个元素

    =BYCOL({"A1"}, LAMBDA(cellRef, ISREF(INDIRECT(INDEX(cellRef,1)))))
    

    显然,MAP更简单地解决了这个问题。