【问题标题】:Dyanamic range and criteria for a VLOOKUPVLOOKUP 的动态范围和标准
【发布时间】:2020-05-29 18:53:26
【问题描述】:

我正在尝试创建一个 VLOOKUP,它可以将 COLUMN 编号用于条件和范围起始位置,同时从 COLUMNS 计数中获取索引编号。

我有一个电子表格,我将数据集导入其中进行分析。我在顶部添加了几行,并使用其中一行将特定列标记为包含固定值 - 例如,这些值来自预定义的选择,例如 order_status 将具有 created、submited、fulfilled、paid 的固定值等。

当我将每一个标记为固定时,上面的行会递增地为每一列分配一个数字值。如果我有 16 个固定值,则会有从 1 增加到 16 的列。

在分析表中,我有 16 列用于执行某些分析。它为数据集中的每一行做的第一件事是为数据集列中的每个唯一值分配一个唯一标识符,或者,如果该值以前存在于它之前的行中,则查找上次分配给它的数字。然后,我可以稍后根据这些唯一数字查找不同的值,并关联它们的计数以显示每个值在数据集中存在的频率。

我已经创建了这个分析表,它已经知道列的位置。示例如下:

=IF(B5="",0,IF(COUNTIF(B$3:B4,B5)>0,VLOOKUP(B5,B:AB,27,FALSE),MAX(AB$3:AB4)+1))

我的问题是如何使公式的标准和起始位置动态化,以便我可以更改我归类为固定的列,而无需调整分析公式。

因此,对于上面的示例,B 列是一个固定值列。我已经有了以下公式:

formula=MATCH(AB2,$A2:$Z2,0)

这告诉我第 2 列(也称为 B)是第一个固定值。

如果我使用我所知道的来重现该公式以动态工作,那将是:

=IF(COUNTIF($column(formula)+row (=3): column(formula)+ current_row(5)-1
           , column(formula)+ current_row(5)>0
               , VLOOKUP (column(formula)+current_row(5), column(formula):AB
               , COLUMNS(column(formula):AB)
               , false)
           , MAX(AB$3:AB4)+1))

但是,我完成此公式的方式不起作用 - 我不知道如何明确设置公式中的行号。我希望我已经提供了足够的信息来解释我想要做什么,在此先感谢。

这是它的外观图片 - 出于敏感原因,我不得不模糊某些信息。谢谢。

【问题讨论】:

  • 还是不行,这是我最近的尝试=IF(COLUMN(AQ$1) & ROW(5)="",0, IF(COUNTIF (COLUMN (AQ$1) & "$3:" & COLUMN (AQ$1)&"4,"& COLUMN (AQ1) &"5)" & >0, VLOOKUP(COLUMN(AQ$1) &"5, "& COLUMN(AQ$1) &":AQ," & COLUMNS(COLUMN(AQ$1), AQ), FALSE), MAX(AQ$3:AQ4)+1))
  • 哦,我知道我可能需要=SUBSTITUTE(ADDRESS(1,AQ1,4),"1",""),因为它给了我可以用作公式中插入文本的字母。仍在努力中
  • 如何让它读取结果,就好像我已将其作为公式的一部分输入一样?这个 =countIF(SUBSTITUTE(ADDRESS(1,AQ1,4),"1","")&":"&SUBSTITUTE(ADDRESS(1,AQ1,4),"1",""),SUBSTITUTE(ADDRESS(1,AQ1,4),"1","") & AA10) 没有解析为 'COUNTIF(Z:Z, Z10) - 这只是一个错误的公式

标签: excel


【解决方案1】:

您可以使用 INDIRECT 函数将生成的字符串转换为范围引用。

=COUNTIF(INDIRECT(*formula to generate range string*),INDIRECT(*formula to generate cell string*))

但是,INDIRECT 是一个不稳定的函数,每次您对工作簿进行任何更改时都会重新计算。如果您有一整列它们,您的工作簿可能会严重减慢速度,尤其是在将它们与精确查找相结合时。

另一种选择是使用 CHOOSE 函数,如果您从已知的固定可能范围中进行选择,则可以使用该函数:

CHOOSE(*rangenumber*,*range1*,*range2*,*range3*,...)

Choose 非常好,因为它不是一个 volatile 函数。

如果范围的数量或大小不固定,您也许可以使用 OFFSET 函数:

OFFSET(*starting point*,*row offset*,*column offset*,*number of rows*, *number of columns*)

这使您可以从锚点开始,然后计算到所需范围的距离以及所需范围的大小。

OFFSET 也是可变的,但是您可以将其保存为定义的名称,然后在一列公式中重复使用该定义的名称,要求它在用于所有公式之前只计算一次,而不是必须在每个公式。

【讨论】:

  • 感谢您,终于设法让 INDIRECT 版本正常工作,哇,真是个任务。我需要一些时间来了解如何使用 CHOOSE 或 OFFSET。这就是它现在的样子=IF(INDIRECT(AQ1&AA5)="",0, IF(COUNTIF(INDIRECT(AQ$1&"$3:"&AQ$1&$AA5-1),INDIRECT(AQ$1&$AA5))>0, VLOOKUP(INDIRECT(AQ$1&$AA5), INDIRECT(AQ$1&":"&SUBSTITUTE(ADDRESS(1,COLUMN(AQ$1)*1,4),"1","")), COLUMNS(INDIRECT(AQ$1&":"&SUBSTITUTE(ADDRESS(1,COLUMN(AQ$1)*1,4),"1",""))), FALSE),MAX(AQ$3:AQ4)+1))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多