【问题标题】:Using a column reference for a vlookup formula对 vlookup 公式使用列引用
【发布时间】:2018-10-03 15:15:39
【问题描述】:

在Excel中插入表格时可以参考:

  • 数据范围Table[#data]
  • 标题范围Table[#header]
  • 全列范围Table[column name]
  • 某列下当前行的值Table[@[colum name]]

这使得公式非常容易阅读:=COUNTIF(A:A,A1) 变为

=COUNTIF(Suppliers[IBAN],Suppliers[@[IBAN]])

快速检查当前行值的重复项 (IBAN)。

我现在正在尝试将=VLOOKUP([@SupplierCode],Suppliers[Code],2,False) 转换为

=VLOOKUP([@SupplierCode],Suppliers[Code],Suppliers[Name],False)

换句话说,一种获取 tableObject 中列的列索引以在公式中使用它的方法(即 vlookup)

我可能会编写一个 VBA 函数来执行此操作,但我正在尝试找出 Excel 是否有办法处理此问题无需 VBA 代码

我不想要的 VBA 解决方案(但如果不可能,可能会解决):

Public Function GetColumnIndex(TableName As String, ColumName As String) As Long
    GetColumnIndex = ActiveSheet.ListObjects(TableName).ListColumns(ColumName).Index
End Function

允许我写信:=VLOOKUP([@SupplierCode],Suppliers,GetColumnIndex("suppliers","Name"),FALSE)

只要表格在同一张纸上就可以了

【问题讨论】:

  • 如果我理解正确,您可以使用 Match():例如 =VLOOKUP(@SupplierCode,Suppliers[Code],MATCH("??Name??",Suppliers[#Headers], 0),假)
  • no Suppliers[??Name??] 无效,我将其用作我期望其工作方式的占位符。
  • 那么如果你替换“??Name??”会发生什么?使用您要查找的任何列名称或使用您想要的名称的单元格引用?
  • 对不起,我没有看到你已经把 Match 放在那里,如果你把它作为答案发布,我会接受它。想了想,不知怎么得出了同样的结论,没想到你已经给出了答案
  • 好的,现在添加为答案

标签: excel


【解决方案1】:

现在添加为答案: =MATCH("Name",Suppliers[#Headers],0) 给出了与名称匹配的标头索引,所以

我认为没有 VBA 的唯一方法是使用 Match() 函数

=VLOOKUP([@SupplierCode],Suppliers,MATCH("Name",Suppliers[#Headers],0),FALSE)

【讨论】:

  • 很抱歉,这是一个单独的问题,您知道是否可以使用 Table[Column] 作为数据验证列表吗?
  • 我不认为你可以直接,但如果你创建一个命名范围(使用 ctrl + f3 打开名称管理器)与你的 Table[Column] 在引用中引用,你可以设置这个命名范围为数据验证列表。
  • 我还会花一些时间查看此页面ozgrid.com/Excel/DynamicRanges.htm。我发现命名范围比内置表格更通用。
  • @Dave 动态范围确实有较大的处理开销,因为与条件格式一样,每次调用重新计算时都会重新计算它们。
  • 谢谢马克,我确实忘记了这一点,因为我主要使用不受重新计算时间严重影响的数据集
【解决方案2】:

我发现此链接非常宝贵Using structured references with Excel tables

我创建了一个包含 2 列、SupplierCode 和 Name 的小型供应商表,然后在每个标题下方添加了几个条目。

当我粘贴你的=VLOOKUP(@SupplierCode,Suppliers[Code],2,False)

在我的表格第一行右侧的一个单元格中,我看到一条我以前从未见过的消息:

关闭时,公式的@Supplier 部分会突出显示。将其更改为 Suppliers[@SupplierCode] 解决了该问题。

假设 SupplierCode 位于表的第一列,您可以使用 VLOOKUP 函数中的 MATCH 函数找到查找列,正如您已经发现的那样。

【讨论】:

  • 感谢您的澄清,我应该将供应商代码放在括号中 - 我实际上是在使用单元格 ref 进行测试,并将 @suppliercode 作为示例。
  • 我编辑了我的问题以避免其他人尝试我放置的示例遇到相同的错误
  • 问题应该保留原样,以便将答案和 cmets 保持在上下文中。
【解决方案3】:

使用表格,我认为更好的选择是以这种方式将 VLOOKUP 公式替换为 INDEX 公式:

=INDEX(MyTableName[NameOfFieldContainingReturnValue],MATCH(LookupValue,MyTableName[NameOfFieldContainingLookupValue],0))

一些cmets:

  • 索引函数可以这样引用一个简单的列:=INDEX(MyTableName[FieldName];4)

  • 这将返回“字段名”列中第 4 行的值

  • 由于我们不知道行号,我们可以在包含查找值的列中使用 MATCH(在使用 vlookup 公式的情况下,这将是最左边的列)。

    李>

【讨论】:

    【解决方案4】:

    答案可以推广到查找值不在第一列的情况:

    =VLOOKUP("g";Table[[LookupColumn]:[ValueColumn]];MATCH("ValueColumn";Table[[#Headers];[LookupColumn]:[ValueColumn]];0);FALSE)
    

    如下例所示:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多