【问题标题】:Can Vlookup return a formula in excel?Vlookup可以在excel中返回公式吗?
【发布时间】:2017-04-03 12:11:53
【问题描述】:

我正在尝试使用 excel 中的 VLOOKUP 函数返回一个公式。我在这里找到了很多关于使用 VLOOKUP 的信息,但有一个稍微不同的问题。

我正在尝试获取可以在 A 列中找到的指定日期(在 C 列中)之前的一周平均温度(来自 B 列)。

更简单地说:

如果单元格 C2中的日期存在于 A中,则返回列中范围的平均值 B。

到目前为止,这是我最接近的(感谢 SO 上的其他 QA):

=VLOOKUP(C2, A1:B660, AVERAGE(B124:B130), FALSE)

但是,使用 AVERAGE 函数代替列号(通常是使用的参数)似乎不起作用。

我附上了一张非常简化的数据图片:

如果VLOOKUP 是处理此问题的错误函数,那么更好的方法是什么? 我在 Mac 上运行 Excel 15.32。

编辑:

虚拟数据: https://www.dropbox.com/s/rblk943k2zf71tw/dummy%20data.xlsx?dl=0

【问题讨论】:

  • 添加一个“小”数据样本和预期结果
  • 谢谢!我附上了一个虚拟数据集,包括以下答案中推荐的公式。
  • 范围 B124:B130 是基于什么?它应该为每一行改变吗?如果这些解决方案都不起作用,那么您就没有传达一些关键信息。
  • B124:B130 范围是 C 中指定日期之前的一周。我怀疑链接数据中存在问题(或者可能是当我将虚拟数据复制到新工作表中时) .所以这已经更新了 - 谢谢!

标签: excel excel-formula average


【解决方案1】:

怎么样:

=AVERAGE(OFFSET($B:$B,MATCH($C2,$A:$A,0)-1,0,-7))

这假定第 1 行中有一个标题。

  • 从 C2 中的条目中查找 A 列中的匹配日期
  • 创建一个包含 B 列值的数组,从该点开始倒数一周
  • 平均该数组。

例如,您可以向下填写 D 列,它会根据需要进行调整。

OFFSET 函数的一个问题是它是易变的,因此如果工作表上有任何更改,所有公式都会重新计算。

至少在更高版本的 Excel 中,以下内容应该是非易失性的:

=AVERAGE((INDEX($A:$B,MATCH($C2,$A:$A)-6,2,1):INDEX($A:$B,MATCH($C2,$A:$A,0),2)))

我将由您处理检查第 2-6 行中的日期时出现的错误。

【讨论】:

  • 不错的方法罗恩!
  • 感谢 Ron,您建议的第二行运行良好(第一行返回的值不正确,我还没有弄清楚问题出在哪里)。
  • @QuinnAsena 我编辑了第一个以纠正问题。问题是对没有一周数据的发现行的补偿是不正确的。但我仍然会推荐第二种,因为它是非易失性配方。
  • 谢谢,它似乎工作了!为我节省了大量手动操作的时间:)
【解决方案2】:

使用 INDEX 作为单元格引用,MATCH 定位主要日期并使用该位置以及该位置负 6 作为范围。

=AVERAGE(INDEX(B:B, MATCH(C2, A:A, 0)-6):INDEX(B:B, MATCH(C2, A:A, 0)))

【讨论】:

  • 由于某种原因,我得到的每个平均值略有不同。因此无法对他正在寻找的范围进行逆向工程。现在我只是对这个问题感到困惑,而不是原来的问题。
  • 啊,我的值显示为四舍五入。我复制了数据而不是下载示例文件。
  • 是的,您的公式平均范围会发生变化。每个新的结束日期都需要准确定位它们。
  • 比您在 Excel 中的敏锐度更令人印象深刻的是您能够阅读字里行间并解释问题的意图。太棒了。
  • 感谢这个,它运作良好。我已经更新了链接文件,因为我怀疑它存在问题。现在应该没问题 Jacob - Index 解决方案运行良好。
【解决方案3】:

我认为您正在寻找的是:

=IF(COUNTIF(A1:A660,C2)=0,0,AVERAGE(B124:B130))

这表示如果在 A1:B660 中找不到 C2,则返回 0,否则返回 AVERAGE(B124:B130)。

【讨论】:

  • 谢谢,这有效并返回了第一个日期的正确数字,但不幸的是,当向下复制时,平均范围不会与相关行一起复制。平均 (B124:130) 变为平均 (B125:131)。我将您的公式添加到问题中链接的虚拟数据中作为示例。
  • 如果单元格引用组件将绝对烘焙它,则在前面添加一个“$”,如果这是您想要的。因此,将范围更改为 B$124:B$130 将阻止它在您向上或向下复制时发生变化。更改为 $B$124:$B$130 将阻止它向左或向右复制。话虽这么说,我没有遵循每行需要什么不同的值?公式中的某些内容必须逐行更改才能返回不同的值。
  • 是的,解释 cmets 中的 excel 问题总是有点棘手!所以公式给了我第一个指定日期的一周的平均温度,这很好,但是当涉及到第二个日期时,它仍然给我第一个指定日期的平均温度(在没有'$'的情况下移动了一行)而不是第二个指定日期的周。希望这更清楚?
  • 那么你需要从 C 中的日期开始的一周的平均值吗?那是C中的日期加上7天吗?您为 AVERAGE 函数提供的范围是对日期 7/14/2012-7/20/2012 的值进行平均,因此这似乎不符合任何逻辑,我可以围绕特定一周建立一个公式。跨度>
  • 我正在寻找以 C 为单位的日期前一周的平均温度,因此对于第一个日期(2012 年 7 月 19 日),我试图获得第 13 天的平均温度/ 2012 年 7 月 - 2012 年 7 月 19 日。同样对于 C. Ron 和 Jeeped 的第二次约会,建议使用似乎有效的 INDEX!
【解决方案4】:

我会推荐一种不同的方法。仍然使用VLOOKUP,我会选择以下内容。然而,将有一种更简单/更优雅的方式来完成这项工作。

  • 如果找到,请使用VLOOKUP 返回值。真的,你并不关心它返回的价值。

    =VLOOKUP(C2,A:B,2,FALSE)

  • 包裹在IFNA 中以处理未找到的日期。在这里我让它返回 -1。

    =IFNA(VLOOKUP(C2,A:B,2,FALSE),-1)

  • 如果VLOOKUP 返回某个值,则使用 IF 语句计算平均值,如果未找到,则执行其他操作。
    =IF(IFNA(VLOOKUP(C2,A:B,2,FALSE),-1)<>-1,AVERAGE(B124:B130),"do something else")

【讨论】:

  • 谢谢,它适用于第一行,但不会向下复制,因为平均值仅移动一行,而不是获取获取日期的相关行的平均值。我在虚拟数据中进行了尝试,并将其链接到现在附加到问题的虚拟数据中。
猜你喜欢
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多