Excel - VLOOKUP 与 INDEX/MATCH - 哪个更好?

2024-04-04

我了解如何使用每种方法:VLOOKUP (or HLOOKUP) vs. INDEX/MATCH.

我寻找它们之间的差异不是出于个人喜好,而是主要在以下方面:

  1. 是否有一种方法可以做到而另一种方法不能做到的事情?

  2. 一般来说,哪一种更有效(或者取决于具体情况)?

  3. 使用一种方法与另一种方法相比的任何其他优点/缺点

NOTE:我在这里回答我自己的问题,但想看看其他人是否有我没有想到的其他见解。


我更喜欢使用INDEX/MATCH几乎适用于所有情况,因为它更加灵活,并且有可能根据查找表的大小提高效率。

我唯一能真正证明使用的合理性VLOOKUP适用于非常直接的表,其中列索引号是动态的,尽管即使在这种情况下,INDEX/MATCH是同样可行的。

下面我将举几个具体的例子来展示这两种方法之间的详细区别。


INDEX/MATCH可以向左查找 (或任何你想要的地方)

这可能是最明显的优势INDEX/MATCH以及最大的失败之一VLOOKUP. VLOOKUP只能向右查找,INDEX/MATCH可以从任何范围查找,如果需要,包括不同的工作表。

下面的例子无法完成VLOOKUP.


INDEX/MATCH 有可能使用更小的单元格范围(从而提高效率)

考虑下面的例子。可以使用任一方法来完成。

这两个公式都可以正常工作。然而,自从VLOOKUP公式包含的范围比INDEX/MATCH公式,它是不必要的波动。

如果该范围内有任何单元格B1:G4变化,则VLOOKUP公式必须重新计算(因为B1:G4是在范围内A1:H4)即使更改中的任何单元格B1:G4不会影响公式的结果。这不是问题INDEX/MATCH因为它的公式不包含范围B1:G4.


使用带有固定 col_index_number 的 VLOOKUP 是危险的

我看到的固定列索引号的主要问题是,如果插入完整的列,它不会像应该的那样更新。考虑以下示例:

除非在查找表中插入列,否则此公式可以正常工作。在这种情况下,公式将在应有位置左侧查找值。请参阅下面,插入列后的结果。

实际上可以通过使用以下方法来缓解这种情况VLOOKUP公式改为:

= VLOOKUP("s",A1:H4,COLUMN(H1)-COLUMN(A1)+1,FALSE)

Now H1将自动更新为I1如果插入列,则保留对同一列的引用。然而,这是完全没有必要的,因为INDEX/MATCH可以使用下面的公式来实现这一点而不会出现此问题。

= INDEX(H1:H4,MATCH("s",A1:A4,0))

我意识到这种情况不太可能发生,但它始终困扰着我VLOOKUP默认情况下,基于固定列索引进行查找,如果插入列,该索引不会自动更新。对我来说,这似乎只是让VLOOKUP功能比较脆弱。


INDEX/MATCH 也可以处理可变列索引,但公式更长

如果列索引号本身是动态的,这确实是我认为的唯一情况VLOOKUP稍微简化了事情,但同样INDEX/MATCH另一种选择也同样好,只是稍微更令人困惑。请参阅下面的示例。


INDEX/MATCH 对于多次查找更有效

(感谢@jeffreyweir)

如果单个匹配值需要多个查找值,则使用具有匹配值的辅助单元会更有效。这样,只需计算一次匹配,而不是为每个查找公式计算一次。请参见下面的示例。

然后可以使用该匹配值返回适当的查找值。请参阅下面的示例(公式已被拖到右侧)。

手动“拆分”匹配值和索引值不是一个选项VLOOKUP因为匹配值是一个“内部”变量VLOOKUP并且无法访问。


INDEX/MATCH可以查找一个范围,允许另一个操作

假设您想要根据列名称查找列中的最大值。

您可以先使用MATCH找到合适的列,然后INDEX返回range整个列的,然后使用MAX找到该范围的最大值。

请参阅下面的示例,其中的公式H4查找单元格中指定的列名的最大值G4。这不能通过使用来完成VLOOKUP alone.


MATCH 不必匹配精确的值

Usually MATCH与第三个参数一起使用,如下所示0,意思是“找到完全匹配”。但要根据情况使用-1 or 1作为第三个参数MATCH非常有用。

例如,以下公式返回列中最后一行的行号A包含一个数字:

= MATCH(-1E+300,A:A,-1)

这是因为这个公式是从底部开始的A列并向顶部移动,并返回该列中的第一行号A值大于或等于-1E+300(基本上是任何数字)的列。

Then INDEX可以与此结合使用以返回该单元格中的值。请参见下面的示例。


总之

VLOOKUP充其量相当于INDEX/MATCH不可否认,在某些情况下稍微不那么混乱。最坏的情况是,VLOOKUPINDEX/MATCH.

另外值得注意的是,如果您想查找range而不是单个值,INDEX/MATCH必须使用。VLOOKUP不能用于查找范围。

由于这些原因,我通常更喜欢INDEX/MATCH几乎在所有情况下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel - VLOOKUP 与 INDEX/MATCH - 哪个更好? 的相关文章

随机推荐

  • 如何自定义垫选择选项组以允许角度中的嵌套值

    我正在自定义角度材质选择 自动完成以允许嵌套下拉菜单 在这里 我想要一个包含多个孩子的家长下拉菜单 如果我展开特定的父下拉列表 则只有该下拉列表的子项应该展开或折叠 同样 在同一场景中也应选择复选框事件 我面临两个问题 搜索 自动完成不起作
  • jhipster 使用 prod 配置文件运行嵌入式 jar - liquibase 问题

    我已经将我的应用程序打包为 mvn Pprod 包 然后我跑了 java jar myapp 0 0 1 SNAPSHOT war 效果很好 但如果我跑 java jar myapp 0 0 1 SNAPSHOT war spring pr
  • 检测 DOM 中的变化

    我想在 html 中添加一些 div 或输入时执行一个函数 这可能吗 例如 添加一个文本输入 然后应该调用该函数 迄今为止的终极方法 代码最少 IE11 FF Webkit Using 变异观察者 https developer mozil
  • 如何消除警告LNK4221?

    我正在使用 c windows 表单 Visual Studio 2010 开发一个项目 我们有 4 个项目 1 个包含 GUI Windows 窗体 托管代码 的项目 这是 exe 项目 其他3个项目 非托管代码 并且都是静态库 在这 4
  • Java中易失性变量和普通变量的显示区别

    我正在尝试创建一个示例来显示易失性变量和常用变量之间的区别 例如 package main public class TestVolatile extends Thread public int l 5 public volatile in
  • UITableView reloadData 不重新加载

    我很困惑为什么 reloadData 不重新加载 tableview 它不调用numberOfRowsInSection The fetchedResultsController将新数据保存到核心数据后确实获得新行 在将新数据添加到表视图之
  • Java - 易失性的使用仅在多处理器系统中有意义?

    易失性的使用仅在多处理器系统中才有意义 这是错误的吗 我正在尝试学习线程编程 所以如果你知道任何好的文章 pdf 我喜欢提到一些关于操作系统如何工作的东西 而不仅仅是语言的语法 否 挥发性可用于多线程应用程序 它们可能会也可能不会在多个处理
  • 将 javascript 字符串转换为 html 对象 [重复]

    这个问题在这里已经有答案了 我可以将字符串转换为 html 对象吗 喜欢 string s div div var htmlObject s toHtmlObject 这样我以后就可以通过 id 获取它并对其样式进行一些更改 var ho
  • 如何在CKEditor激活时在HTML5文本区域中显示占位符属性?

    我在 HTML5 网站中有一个文本区域 具有适当的占位符 示例文本 属性 在我通过 CKEditor 添加 RichText 支持之前 它显示得很好 CKEditor GUI 正在重新创建文本区域 并且不显示其中的占位符文本 有没有办法在
  • 使用foreignObject使用D3js动态添加SVG

    working
  • 如何将文本放入可绘制对象中?

    我正在尝试动态创建一个可绘制对象 以用作自定义线性布局的背景 它需要有哈希标记之类的 没什么大不了的 而且还需要有数字来标记哈希标记的内容 就像一把尺子 我知道我可以创建文本元素并将它们放入线性布局中 然后将哈希标记放入可绘制对象中 但我希
  • extjs 树面板上下文菜单不起作用

    var menu1 new Ext menu Menu items text Open in new tab var treePanel Ext create Ext tree Panel id tree panel region cent
  • ASP.NET MVC 3 使用身份验证

    如何使用 FormsAuthentication 保存某些内容 我不想通过 URL 存储用户 ID 例如 现在我有这样的代码 UserController class HttpPost public ActionResult LogOn L
  • 如何使用 PHP 打破外循环?

    我正在寻找打破 PHP 中的外部 for foreach 循环 这可以在 ActionScript 中完成 如下所示 top for each var i MovieClip in movieClipArray for each var j
  • 使用反应钩子 getSnapshotBeforeUpdate

    如何使用 React hooks 实现 getSnapshotBeforeUpdate 提供的相同逻辑 根据React Hook 常见问题解答 https reactjs org docs hooks faq html do hooks c
  • 为什么 python docker 镜像这么大(~750 MB)?

    My Dockerfile FROM python 3 onbuild CMD python test py test py print hello world 构建图像 docker build t my test app docker
  • 如何渲染模板和布局?

    在控制器方法中 如何渲染模板和布局 Like so def new render template gt devise invitations new layout gt application unauthorized2 t2 end r
  • VS2010中关闭双击取消停靠

    我总是不小心双击 VS2010 中的选项卡并取消停靠它们 是否可以关闭此行为 注意 我正在使用 Productivity Power Tools 中的 Document Well 2010 Plus 以防产生影响 在文档选项卡上找到它以及高
  • 重命名实体框架 T4 模板生成的类名称?

    我有一个包含大量表的数据库 不幸的是这些表的命名没有任何标准约定 表名 另一个表名 还有另一个表名 垃圾表 我使用实体框架和标准 T4 代码生成模板在 C 中创建 POCO 类 是否有我可以遵循的最佳实践 让我可以合并自己的约定 在 C 应
  • Excel - VLOOKUP 与 INDEX/MATCH - 哪个更好?

    我了解如何使用每种方法 VLOOKUP or HLOOKUP vs INDEX MATCH 我寻找它们之间的差异不是出于个人喜好 而是主要在以下方面 是否有一种方法可以做到而另一种方法不能做到的事情 一般来说 哪一种更有效 或者取决于具体情