VLookup 函数据说在 Excel 函数的使用频率排名前三,但这个函数也有不少局限性,Microsoft 推出了一个新的函数 XLookup 可以用于取代 VLookup。但 XLookup 目前还没有正式发布。处理多表连接,如果有多条件,之前我比较多的是用 MS Access 的查询,但现在有了 Power Query (PQ),在 Excel 中也能愉快的玩耍了。多条件连接准备放在下一篇。PQ 的查询表合并,实现将两个表横向合并,无论是界面友好性方面,还是功能上,都比 VLookup 强大太多。
举一个例子:现在有一个销售记录,需要从 Material Master 中获取物料的成本价和销售价:
这是 Excel VLookup 的典型场景,我们来看看 PQ 怎么实现。
从当前工作簿加载数据到 PQ
本篇介绍从 当前工作表导入数据到 PQ 的方法。在 Material Master 工作表中,选中数据区域,像下面这样:
然后同时按下 Ctrl T,Excel 弹出“创建表” 对话框,将 A1:D4 这个区域 (Range) 变成一个 Table。Excel 的 Table 是和 Range 相对应的一个概念,在开发用 Excel Object 对象模型中,这个对象被称为 ListObject
。
点击数据区域任意单元格,Excel 会多出一个选项卡:【表设计】,切换到【表设计】,将表的名称改为 MaterialMasters。
用同样的方法根据 Sales Journals 工作表创建一个名为 SalesJournals 的表 (ListObject):
接下来,将 MaterialMasters 表和 SalesJournals 表中的数据加载到 PQ。选中 MaterialNasters 表中任意一个单元格,切换到【数据】选项卡:选择【获取数据】- 【自其他源】- 【自表格/区域】
表中的数据就被导入到 PQ,这是一从当前工作簿 (Current Workbook) 中加载数据到 PQ 最方便的方法。下面给出操作的动图:
由于后面不需要对 MaterialMaster 查询进行输出显示,所以在【关闭并上载】时,选择【关闭并上载至】:
PQ 将界面切回到 Excel 工作表,弹出【导入数据】对话框:
选择【仅创建连接】,点击确定按钮,“仅创建连接”选项控制 MaterialMasters 查询表的数据不被加载到工作表中。下面是动图:
合并查询
用同样的方法将表 SalesJournal 数据加载到 PQ,这样我们现在有了两个查询。选中 SalesJournals 查询,切换到【主页】,点击【合并查询】:
弹出【合并】对话框,选中 SalesJournal 表的 MaterialNo 字段,然后在中间第二个表中选择 MasterMaters 查询表,也选中第二个表MaterialNo 字段,作为两个表的关联条件。
在连接种类中,选择【左外部】,然后点击确定按钮。PQ 在 SalesJournal 查询表中新建了一个字段:
MaterialMaster 列是一个结构化列,结构化列的每个单元格包含结构化信息,比如 MaterialMaster 字段包含物料的多个信息。结构化列是 PQ 很重要特征,后面会专门写一篇结构化列的博客来介绍其用法。选中 MasterialMaster 字段任意一个单元格,显示区下面部分相应显示对应物料主数据的信息:
下面是合并查询的动图:
点击 MaterialMaster 列的【展开】图标,将 MaterialMaster 列进行展开 (expand):
只选择我们需要的 Cost 和 Price 两个字段:
点击确定按钮,获取 Price 和 Cost 的连接:
新建一列,计算每一行的利润:
完成后点击【关闭并上载】,数据加载至 Excel 工作表。
连接类型
合并查询中。两个表的连接类型有下面几种,相当于数据库中两个表的连接类型。熟悉数据库 SQL 语句的人一看就知道怎么回事。
各种连接的图解说明如下:
示例数据:
github