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 - 哪个更好? 的相关文章

  • 使用R中的XLSX包在Excel中打印data.frame时出错

    数据框是可见的 没有任何错误 但是 当使用 XLSX 包的 write xlsx 函数打印相同内容时 会出现错误 Error in jcall cell V setCellValue value method setCellValue wi
  • Excel 2007 Visual Basic 编辑器:占用空格,四处移动光标

    我无法解决这个问题 我发现了类似的问题here https stackoverflow com questions 1164138 vba editor auto deletes spaces at the ends of lines bu
  • 在 MS Excel 中为字符分配一个值并执行字符串(具有字符)的数学函数(+、-、*、/)

    我想根据给定字符串 ABCDEF 的预分配值对其进行求和 即首先我想为每个字符分配值 然后计算具有预先分配的字符的字符串的总值 excel中可以实现这个功能吗 例如 在下面 A 2 B 5 C 8 D 1 E 1 F 2 sum of AB
  • 如何在 excel 2007 vba 中以编程方式对一组形状进行分组?

    我正在迭代电气表表上的数据并在形状表上创建形状 创建形状后 我想以编程方式对它们进行分组 但是我无法找出正确的语法 形状就在那里 被选中 如果我单击分组按钮 它们就会完美分组 但是通过下面的代码我得到 运行时错误 438 对象不支持此方法或
  • 为什么从 Evaluate 调用时 VBA Find 循环失败?

    当使用 Application Evaluate 或 ActiveSheet Evaluate 方法调用例程时 我在子例程内运行查找循环时遇到一些问题 例如 在下面的代码中 我定义了一个子例程 FindSub 它在工作表中搜索字符串 xxx
  • MongoDB聚合查询性能提升

    我最近开始将数据从 Microsoft SQL Server 转移到 MongoDB 以获得可扩展性 就移民而言一切都很好 该文档有 2 个重要字段 customer timestamphash 年月日 我们在安装 MongoDB 的 Az
  • 使用 python (openpyxl) 从 Excel 中删除网格线

    我正在尝试从使用 openpyxl 创建的 Excel 工作表中删除网格线 但它不起作用 我正在这样做 wb Workbook ws wb get active sheet ws show gridlines False print ws
  • 如何使用 VBA 将符号/图标格式化为单元格而不使用条件格式

    我使用 VBA 代码放置条件格式以覆盖大型表格中的值 每个单元格使用 2 个公式来确定使用 3 个符号中的哪一个 我需要根据列使用不同的单元格检查每个单元格的值 因此据我了解 我必须将条件格式规则单独放置在每个单元格上 以确保每个单元格中的
  • Javascript 链接在 selenium excel vba 中没有响应

    我正在尝试做这样一行点击 javascript 链接的操作 FindElementById ctl00 ContentPlaceHolder1 LinkButton4 WaitDisplayed True 3000 Click 这条线没有任
  • VBA写入Word,更改字体格式

    我正在 Excel 中编写 VBA 脚本 以将基于某些表格的文本输出到 Word 文档 在大多数情况下 一切都很顺利 我在 stackoverflow 的帮助下自学 我有一个相当长的代码 因此将其全部复制到这里会很困难 我将尝试展示相关部分
  • 如何防止Excel单元格中前导零自动截断

    如果我粘贴04562 它会自动截断前导零并将其存储为4562 我希望将其存储为04562 如果您使用 MS Excel 编辑需要存储带前导零的数字的单元格 只需将单元格内容格式化并定义为文本即可 如果您以编程方式存储它 则可以将该值放在引号
  • 根据标准在多个需求之间分配数量

    我正在创建一个周期盘点表 表 1 将是用户输入 其中将放置找到的材料和数量 表 2 是盘点时的库存快照 我希望将找到的材料数量分配到表 2 上的数量中 直到表 1 的数量用完为止 按照从最新批次 日期代码 到最旧批次 先进先出 的顺序分配数
  • 通过 Whatsapp 从 Excel 发送图片

    我们如何通过 Whatsapp 从 Excel 发送图片 我找到了通过以下方式发送消息的vba代码https web whatsapp com https web whatsapp com Sub Test Dim text As Stri
  • 如何检查单元格是否为空 (Excel\VisualC#)

    我的目标是逐行检查Sheet1为了发现有多少行 所以我放了一个 do while 一旦到达空白单元格就应该停止 Example 第 1 行数据第2行数据第3行数据第4行数据第5行数据 第 6 行数据第7行数据 在本例中 我只需要前 5 行
  • 使用 VBA 设置 Sharepoint 标签/属性

    是否可以使用 VBA 设置 Sharepoint 文档 特别是 Excel 的标签 目前我知道处理此问题的唯一方法是将文件保存到 Sharepoint 在出现提示时设置标签 然后再次下载该文件并将其用作模板 然而 我需要使用这些标签的几种不
  • 在 PHP 中生成 Excel 输出的最佳方法是什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 还有其他类似 PHPExcel 的 PHP 组件吗 有一些类可以生成 PHP Excel 文件 真正的 Excel 文件 而不是 csv
  • 从多页表单中获取活动控件名称和值

    我已经在网上寻找解决方案几个月了 但没有成功 我创建于Excel 2010 a UserForm与多页 我正在尝试编写一个函数来获取activecontrol名称和值 到目前为止 我已经成功使用此命令获取了控件的名称Me MultiPage
  • Excel Active-X 按钮无法单击

    我有一个在 Excel 中应该可以点击的按钮 当我尝试单击它时 什么也没有发生 我注意到 如果我单击并按住右下角的鼠标 则会出现第二个按钮 这种情况过去发生过 当我移动鼠标单击该按钮时 我可以单击 一切都会正常 但这一次 当我移动鼠标时 按
  • VBA中工作表变化的递归调用

    我已经创建了包含多个工作表的工作簿 我正在尝试使用 WorkSheet ChangeSheet1 即工作表 1 上的某些更改正在复制到工作表 2 中 同样 如果有任何改变Sheet2我想做出类似的改变Sheet1以及 这样做时 两张表上都会
  • 使用 C# 在 Powerpoint 2013 中创建具有多个系列的图表

    我使用的是 VS2013 Ultimate 带有 Office 2013 已安装 PowerPoint Excel 和 Word 我正在用 C 编码 我正在使用 C 创建 PowerPoint 演示文稿 到目前为止 我已经成功地完成了我想做

随机推荐

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

    我正在自定义角度材质选择 自动完成以允许嵌套下拉菜单 在这里 我想要一个包含多个孩子的家长下拉菜单 如果我展开特定的父下拉列表 则只有该下拉列表的子项应该展开或折叠 同样 在同一场景中也应选择复选框事件 我面临两个问题 搜索 自动完成不起作
  • 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 我寻找它们之间的差异不是出于个人喜好 而是主要在以下方面 是否有一种方法可以做到而另一种方法不能做到的事情 一般来说 哪一种更有效 或者取决于具体情