【问题标题】:Specifying search direction in Excel VLOOKUP() function在 Excel VLOOKUP() 函数中指定搜索方向
【发布时间】:2018-08-29 14:32:38
【问题描述】:

Stack Overflow 上有很多很好的答案,描述了如何使用 Excel 的 VLOOKUP() 函数。在问这个问题之前我研究过的一些在这里:

看起来VLOOKUP() 默认返回表中的第一个匹配条目(即“顶部优先”搜索)。我需要返回表中的 last 条目(即“底部优先”搜索)——有没有办法使用 VLOOKUP() 指定搜索方向函数,或者除此之外的替代函数,类似于VLOOKUP(),但允许指定搜索方向?

编辑: 这是我的数据示例。我有网络流量,我试图计算具有相同标识符的数据包之间的时间戳差异。

Packet ID  Timestamp (ms)
A          0.0
B          1.0
C          2.0
C          3.0
A          4.0
B          5.0
.          .
.          .
.          .

我需要计算类似于下面的时间戳差异

Packet ID  Timestamp (ms) Timestamp Difference (ms, packet ID basis)
A          0.0            0.0
B          1.0            0.0
C          2.0            0.0
C          3.0            1.0 (i.e. "3.0 - 2.0")
A          4.0            4.0 (i.e. "4.0 - 0.0")
B          5.0            4.0 (i.e. "5.0 - 1.0")
C          6.0            3.0 (i.e. "6.0 - 3.0")
.          .              .
.          .              .
.          .              .

为此,我尝试在Packet ID 上创建一个VLOOKUP(),以查找具有相同ID 的前一个数据包的时间戳。

【问题讨论】:

  • 从纯关系代数的角度讲,您有一些包含多个匹配项的查找列通常不是一件好事。例如,如果某天数据的顺序发生了变化,以至于最后一个(或第一个)匹配在逻辑上不再正确,该怎么办?我投票赞成通过在查找列中只有一个匹配键来完全避免这种情况。但是对您的问题 +1。
  • 您可以使用Index/Match 并在Match 上嵌套一个Match,让您稍后从列表中开始。此外,@TimBiegeleisen 提出了一个很好的观点。如果您有这么多重复数据,应该(希望)有另一个变量可以用来缩小搜索范围。
  • 另外,只有searching aroundthis pagethis onethis one。这些都没有帮助吗?
  • 感谢@TimBiegeleisen。通常我会同意分类数据,但是我正在分析时间序列数据(具有周期性数据包标识符的网络流量),并且需要计算具有相同标识符的数据包之间的时间偏移量。我正在使用VLOOKUP 直接搜索相同标识符的前一个数据包并获取它们的时间戳之间的差异。
  • @BruceWayne, This link 你的评论给了我我需要的东西。如果您将其添加为答案,我会接受;否则我稍后会添加它作为答案。

标签: excel excel-formula vlookup


【解决方案1】:

来自this page,你应该可以使用:

=LOOKUP(2,1/(A2:A12=D2),B2:B12)

要忽略零,您可以使用此 CSE 公式(使用 CTRL+SHIFT+ENTER 输入)

=LOOKUP(9.99999999999999E+307,IF(A2:A12=D2,IF(ISNUMBER(B2:B12),B2:B12))) 

(根据需要调整范围)

【讨论】:

  • 这是一个很好的通用答案。对于我的特定场景,我将公式编辑为=LOOKUP(2, 1/($A$2:A(n-1)=A(n)), $B$2:B(n-1)),其中A(n) 是包含数据集中当前行的数据包ID 的单元格,A(n-1) 是其正上方的单元格,B(n-1) 是相应的时间戳当前行的正上方。
  • 这是一个聪明的处理方式。
  • @K.Dᴀᴠɪs - 我同意! (不幸的是,我不知道我是否足够聪明地想出它)。
【解决方案2】:

为什么不创建你自己的 VLOOKUP() UDF?

Function VLOOKUP2(lookupVal, tblArray As Range, colIndex As Long)

    Dim r As Long
    r = tblArray.Find(What:=lookupVal, SearchDirection:=xlPrevious).Row
    VLOOKUP2 = tblArray(r, colIndex)

End Function

免责声明:我的测试范围如下图所示。

【讨论】:

  • 感谢您的回答,K.Davis。虽然您的解决方案确实有效,但我将 @BruceWayne 的答案标记为“正确”,因为它使用预先存在的 Excel 函数解决了问题。
  • @EricSchnipke - 请记住这个答案,以防您需要添加更多功能或条件,因为这很容易扩展到更多自定义查找。好思想 K.Davis :D
【解决方案3】:

正如@tim 所说,通常最好使用唯一值作为索引,这样在排序时就不会出现问题。如果这不是索引(例如日期),那么这很好。

我会使用数组公式(按 ctrl、shft、enter 来添加花括号,而不是直接输入):

{=INDEX(K34:K38,LARGE(IF(K34:K38="a",ROW(K34:K38),),1)-ROW(K34)+1)}

以下是细分:

INDEX(<<target column range>>,

 #Compare all the recorded row numbers, and get the largest
 LARGE(

     #For each item in the column, check to see if it matches the 
     #search value
  IF(<<column range to search>> = <<value to search>>,
     #if it does, record its row number          
     ROW(<<column range to search>>),
  )
 )

 #since we are getting the absolute row number (not relative to the
 #target column, we need to calculate an offset
 -ROW(<<start item>>)

 #excel ranges start at 1 and not 0 so we have to correct the offset
 +1
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多