Excel、PowerQuery 和 ChatGPT 终极手册(下)

原文:Ultimate ChatGPT Handbook for Enterprises

译者:飞龙

协议:CC BY-NC-SA 4.0

使用 SUMIFS、SUMPRODUCT、AGGREGATE 和 MAX 函数查找数值数据

其中之一鲜为人知的事实是,当查找单个数值时,匹配和三角函数可能比查找函数更好。

例如,在图 5.14中,我们要返回发票"224-VV-004"的付款金额:

图 5.14: 使用 SUMIFS 函数查找数值数据

=SUMIFS(Payments[Amt],Payments[Invoice],G100)

SUMIFS函数计算满足多个条件的值的总和。它允许您指定多个条件,并仅对满足条件的值进行求和。

语法:

=SUMIFS (sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...)

其中:

  1. 汇总范围 ► 要聚合的值。

  2. 条件范围 ► 应用条件的值。

  3. 条件 ► 要满足的条件。

  4. 在我们之前的示例中,我们检查存储在支付中的发票号是否等于:

  5. Payments[Amt] 是求和范围。它代表付款表中的Amt列。我们想要根据给定条件从该范围返回值。

  6. Payments[Invoice] 是第一个条件范围。它代表付款表中的发票列。我们想要检查这些单元格范围是否符合特定条件。

  7. G100 是条件。它是一个特定值或参考值,用于评估发票列中的单元格。

该函数返回相应的付款金额,因为只有一个发票号符合条件。

注意: 如果多个发票号符合条件,函数将返回总付款金额。

SUMIFS 函数的替代方案是SUMPRODUCT函数(见图 5.15):

图 5.15: 使用 SUMPRODUCT 函数查找数值数据

=SUMPRODUCT(Payments[Amt],(Payments[Invoice]=G100)*1)

SUMPRODUCT 函数功能强大,允许您将多个数组中对应元素相乘并求和。

当您需要对数组执行计算或同时对多个范围应用条件时,这是一个优势。

语法:

=SUMPRODUCT(array1, array2, ...)

在上面的示例中:

  1. Payments[Amt] 是第一个数组。它代表付款表中的Amt列。我们想要将这些值的数组相乘并求和。

  2. 对于第二个数组,我们首先比较发票列中的每个单元格(在付款表中)与单元格 G100 中的值,并返回一个由 True 和 False 值组成的数组(Payments[Invoice]=G100)。将此数组乘以 1 将 True 值转换为 1,False 值转换为 0((Payments[Invoice]=G100)*1)

  3. 最后,SUMPRODUCT函数将Amt列中的相应值与 1 和 0 的数组相乘,然后求和这些乘积。求和计算将仅包括Amt列中的值,其中Invoice列与 G100 匹配(见图 5.16)。

注意: 对布尔值执行数学运算会将它们转换为它们的数值等效值 1/0。

因此,我们可以通过添加零来转换前面的 True/False 值。

(Payments [Invoice]=G100)+0.

图 5.16: SUMPRODUCT 数组乘法

最后,让我们看看AGGREGATE函数以及我们如何使用它查找数值,如图 5.17所示:

图 5.17: 使用 AGGREGATE 函数查找数值数据

与其他SUMPRODUCTSUMIFS函数不同,AGGREGATE函数在数据集上执行各种计算。

它允许您应用 19 个函数(见表 5.1),有七个选项可以忽略错误、隐藏值和小计,并应用特定条件来包含或排除数据。

1. AVERAGE 5. MIN 9. SUM 13. MODE.SNGL 17. QUARTILE.INC
2. COUNT 6. PRODUCT 10. VAR.S 14. LARGE 18. PERCENTILE.EXC
3. COUNTA 7. STDEV.S 11. VAR.P 15. SMALL 19. QUARTILE.EXC
4. MAX 8. STDEV.P 12. MEDIAN 16. PERCENTILE.INC

表 5.1: 在 AGGREGATE 中应用的函数

语法:

=AGGREGATE(function_num, options, array, [k])

参考图 5.16中使用的公式。

=AGGREGATE(14,3,Payments[Amt]*(Payments[Invoice]=G100)*1,1)

以下是前述函数的工作原理:

  1. 14 ►该参数指定LARGE函数返回数据范围中第 k 个最大值。

  2. 3 ►该参数指定函数将忽略数据范围中的错误值。

  3. 对于数组,我们首先将Payments表中Invoice列中的每个单元格与单元格 G100 中的值进行比较,并返回一个 True 和 False 值的数组(Payments[Invoice]=G100)。将此数组乘以 1 将 True 值转换为 1,False 值转换为 0((Payments[Invoice]=G100)*1)。然后,将Amt列中的相应值与 1 和 0 的数组相乘。

  4. 最后,函数返回前述最终数组中的最大值。

注意 :与SUMPRODUCT函数一样,AGGREGATE可以在不使用Ctrl + Shift + Enter的情况下本地管理许多数组操作。

与前述函数密切相关的是MAXMAXIFS函数。

图 5.17 中,我们使用MAX函数查找数值函数。

=MAX( Payments[Amt]* (Payments[Invoice]=G100) )

以下是前述函数的工作原理:

  1. 我们首先将Invoice列中的每个单元格与单元格 G100 中的值进行比较,并返回一个 True 和 False 值的数组(Payments[Invoice]=G100)。

  2. 然后,我们将Amt列中的相应值与 True 和 False 的数组相乘。这将为所有 True 返回一个金额值,对于所有FALSE则返回零。

  3. MAX函数返回前述数组中的最大值。

图 5.18: 使用 MAX 函数查找数值数据

MAX函数可能难以理解和解释。替代方法是MAXIFS函数,如图 5.19所示:

=MAXIFS(Payments[Amt], Payments[Invoice],G100 )

图 5.19: 使用 MAXIFS 函数查找数值数据

语法:

=MAXIFS(max_range, criteria_range1, criteria1, criteria_range2, criteria2,...)

在上述示例中,Amount值是我们的最大范围,而条件范围是发票号码,我们的条件是存储在单元格 G100 中的值。

注意 :对于复杂的条件查找,请考虑使用MAXIFS而不是MAX函数。

查找图像

Excel 中的查找功能比仅限于文本和数字更全面。我们将学习如何查找图像,如图 5.20所示:

图 5.20: 查找图像

执行以下步骤:

  1. 创建一个产品列表,并在旁边的空白列中放置标志图像。

  2. 为每个产品复制一个标志图像,并将其粘贴到每个产品名称旁边的空白单元格中。调整大小以适应。

  3. 要将图像锁定到单元格,右键单击并选择格式图片。转到格式图片窗格,选择大小和属性,在属性部分选择随单元格移动和调整大小(见图 5.21 ):

    图 5.21: 将图像锁定到单元格

  4. 接下来的步骤涉及创建链接图像:

    1. 选择并复制任何带有图像的单元格。确保复制的是单元格而不是图像。

    2. 右键单击要存储查找图像的另一个单元格。

    3. 选择粘贴特殊,将其粘贴为链接图像(见图 5.22)。

    4. 你选择的单元格中的标志将被粘贴到新单元格中。

    图 5.22: 粘贴为链接图片

  5. 下一步是创建一个命名范围。这将确保复制的标志根据产品名称动态更改。

    1. 转到公式选项卡,选择定义名称。

    2. 在新名称对话框中,在名称字段中写入 ►:标志 ,在引用中写入:=INDEX($E$116:$E$120, MATCH($G$116,$D$116:$D$120,0))(见图 5.22)。

    3. 其中$E$116:$E$120 ► 包含标志图像的列,$G$116 ► 包含要查找其标志图像的产品的单元���,$D$116:$D$120 ► 包含产品名称的列。

    图 5.23: 创建名称范围

  6. 最后,选择我们在上一步中创建的链接图像,并用创建的名称范围中的动态引用替换其引用(见图 5.24 ):

    图 5.24: 将图像引用更改为创建的名称范围

注意 :定义的名称应该只返回一个单元格引用,因此我们使用INDEX/MATCH函数。其他函数如VLOOKUP不起作用,因为它们不返回引用。

查找单元格地址

在本节中,我们将学习如何使用 ADDRESS 函数查找单元格地址。

一般来说,ADDRESS函数将根据给定的行号和列号返回单元格地址。

请注意,返回的单元格地址是一个文本字符串,而不是实际引用。此外,根据所选的地址类型,返回的地址可能是相对的、混合的或绝对的。

图 5.25 所示,我们想知道作物"Traka"的最后一个单元格地址。

图 5.25: 查找带有条件的最后一个单元格地址

=ADDRESS(

MAX( (C125:C136=F125)*ROW(C125:C136) ),

COLUMN(C125:C136) )

以下是前述函数的工作原理:

  1. C125:C136=F125 返回一个由TRUEFALSE组成的数组,其中TRUE是符合条件的位置;否则为FALSE

  2. (C125:C136=F125)*ROW(C125:C136), 将相应的行号和TRUEFALSE数组相乘。这将返回所有TRUE的行号和所有FALSE的零。

  3. MAX函数从前述数组中返回最大的行号。

  4. COLUMN(C125:C136) 返回所有作物的列号。

  5. ADDRESS函数根据行号和列号返回绝对单元格引用。

注意: 默认情况下,ADDRESS函数返回绝对单元格引用。如果您想返回混合或相对地址,请按照图 5.26中所示的选项进行选择。

图 5.26: 在 ADDRESS 函数中返回相对或混合引用

使用数据透视表查找列表中的唯一项

数据透视表可以帮助您快速、轻松地总结和分析大量数据。它通过有意义地组织数据来帮助您理清数据。

它还可以用于查找列表中的唯一项,如图 5.27所示:

图 5.27: 使用数据透视表查找唯一项

以下是要遵循的步骤:

  1. 将您的范围转换为表格,单击 Excel 表格的任意位置,转到表格设计选项卡,然后单击使用数据透视表进行汇总(见图 5.28 ):

    图 5.28: 创建数据透视表

  2. 在弹出窗口中,单击现有工作表,然后在位置下拉菜单中选择放置数据透视表的单元格(见图 5.29 ):

    图 5.29: 选择放置数据透视表的位置

  3. 在数据透视表字段中勾选作物字段或将该字段拖放到行区域。这将生成一个唯一字段列表(见图 5.30 ):

    图 5.30: 选择数据透视表字段

结论

在本章中,我们了解到 Excel 提供了多种查找数据的方式。通过学习不同的方法,您可以灵活选择最佳方法。

这些替代方法中有些比已知的查找函数更高效或更快,这取决于数据集的大小或任务的复杂性。例如,DSUM函数可以处理更复杂的条件并在数字数据上比VLOOKUP函数计算更快。

总之,在 Excel 中学习查找数据的替代方法可以为您提供更广泛的技能集、增加效率、适应性和解决问题的能力。

在下一章中,我们将开始学习动态数组查找函数。

需要记住的要点

  • 学习在 Excel 中解决问题的替代方式可以增强您的问题解决能力。它鼓励您进行批判性思考,考虑不同的方法,并探索创造性的解决方案。这些技能是可转移的,并且在 Excel 之外也具有价值,使您在其他工作或生活领域受益。

  • Excel 被广泛应用于各行各业和各种职业。扩展对替代技术的了解,使您更能够处理各种问题并适应不断发展的需求或限制。

第六章

XLOOKUP

介绍

在本章中,我们将介绍第一个动态数组查找函数 --- XLOOKUP

当它在 2019 年推出时,被誉为"函数杀手","终极查找函数","最重要的函数"等等。它应该取代 LOOKUPVLOOKUPHLOOKUPINDEX/MATCH 组合。

现在让我们探讨可以使用此函数的领域以及它相对于其他函数的优势。

结构

在本章中,我们将讨论为什么 XLOOKUP 是比之前讨论的函数更好的选择的 15 个原因:

  • 默认为精确匹配

  • 轻松返回多个相邻和非相邻列

  • 轻松向左或向右查找

  • 轻松适应列的插入/删除

  • 轻松垂直或水平查找

  • 轻松从底部向上查找

  • 轻松在查找中集成通配符

  • 返回单元格引用

  • 在"无匹配"情况下返回值

  • 轻松进行双向或三向查找

  • 返回非相邻列

  • 返回最后一个空或非空单元格

  • 查找非连续数组

  • 轻松返回重复的查找值

默认精确匹配

以下是基本的 XLOOKUP 语法:

=XLOOKUP(lookup_value, lookup_array, return_array, [match_mode], [search_mode])

其中:

  • lookup_value: 我们想在 lookup_array 中搜索这个值。它可以是单元格引用或常量值。

  • lookup_array: 这是我们搜索上述值的范围或数组。它可以是单列或行,也可以是二维范围。

  • return_array: 这是我们要检索结果的范围或数组。它可以是单列或行,也可以是二维范围。

  • match_mode (可选): 此参数确定函数如何将 lookup_valuelookup_array 中的值进行匹配。可以指定为 0 (精确匹配),-1 (精确或下一个较小值),1 (精确或下一个较大值),或 2 (通配符匹配)。如果省略,XLOOKUP 将默认为精确匹配。

  • search_mode (可选): 此参数确定函数的搜索行为,即 1 (从头到尾),-1 (从尾到头),或 2 (二分搜索)。如果省略,XLOOKUP 将默认为 1 (从头到尾)。

这个默认的精确匹配使得使用 XLOOKUP 函数时比使用 VLOOKUP 函数时更不容易出错。

此外,与复杂的 VLOOKUP 函数语法不同,您需要计算列数,XLOOKUP 函数参数是自解释的 --- 易于阅读和理解。

例如,在 图 6.1 中,我们正在查找 1 月 15 日的销售额:

图 6.1: XLOOKUP 默认精确匹配

=XLOOKUP(H3,SalesTable[[ Date]],SalesTable[Amount])

使用 XLOOKUP,我们只需要三个参数:查找值(H3)、查找数组(日期)和返回数组(金额)。此外,与 VLOOKUP 不同,数据不需要排序。

结果必须使用 VLOOKUP 进行校正,如 图 6.2 所示,因为查找数组未排序,而且我们已跳过匹配模式。

图 6.2: VLOOKUP 近似匹配默认

=VLOOKUP(H3,SalesTable[[ Date]:[Amount]],2)

轻松返回多个相邻和非相邻列

XLOOKUP 属于 Excel 中的新动态数组公式,允许将多个结果返回到一系列单元格中。这个范围被称为溢出范围,可以是多行/列或一个表格。

动态数组函数被设计为通过自动填充相邻单元格来容纳它们的输出结果。这种溢出行为允许函数返回多个值或一组值,而不是单个结果。

溢出范围的大小取决于函数返回的值的数量。

如果我们使用类似 VLOOKUP 的传统数组函数,我们必须手动选择相邻单元格,并使用 Ctrl + Shift + Enter 来确认。这是它可以填充相邻单元格的唯一方式。

图 6.3 所示,我们正在查找客户"Luke Daly"的销售日期和金额。

=XLOOKUP(H3, SalesTable[Customer], SalesTable[[ Date]:[Amount]] )

返回多列的唯一技巧是确保将它们选择为返回数组。在前面的例子中,我们选择了日期和金额两列:SalesTable[[ Date]:[Amount]]

图 6.3: XLOOKUP 返回多个相邻列

要返回多个非相邻列,我们需要在返回数组参数中使用 CHOOSECOLS 函数来返回所选列(参见 图 6.4):

图 6.4: XLOOKUP 返回多个非相邻列

=XLOOKUP(I3,SalesTable[Customer],CHOOSECOLS(SalesTable[[ Date]:[Amount]],1,3))

在这个例子中,我们选择了三列:日期、项目和金额。使用 CHOOSECOLS(SalesTable[[ Date]:[Amount]],1,3),选择列仅返回第一列和第三列。

唯一需要记住的是,我们可以使用 CHOOSECOLS 函数返回所选的非相邻列在一个数组中。

轻松查找左侧或右侧的数据

与 VLOOKUP 函数不同,XLOOKUP 函数可以轻松地从左侧查找数据。

图 6.5 中,我们正在查找客户"Luke"的销售日期。

图 6.5: XLOOKUP 向左查找

=XLOOKUP(I3,SalesTable[Customer],SalesTable[Date])

即使日期存储在客户数据的左侧,XLOOKUP 仍然使用其简单的三个参数,不像 VLOOKUP 需要嵌套 IF 函数(参见 图 6.6):

=VLOOKUP(I3, IF({1,0}, SalesTable[Customer], SalesTable[Date]), 2, 0)

使用 VLOOKUP 时,您必须使用 IF 函数创建自定义表数组,就像我们在上一章中看到的那样。

图 6.6: VLOOKUP 向左查找

轻松适应列的插入/删除

VLOOKUP 函数不同,XLOOKUP 可以处理表中列的插入和删除。

例如,图 6.7 显示了在插入新列之前两个函数的结果。

图 6.7: 在插入列之前的 VLOOKUPXLOOKUP 函数

当您在表中插入列时,VLOOKUP 返回错误的值,但 XLOOKUP 可以动态处理插入(参见 图 6.8):

图 6.8: 在插入列后的 VLOOKUPXLOOKUP 函数

注意: VLOOKUP 无法处理插入,因为我们有一个硬编码的查找列,即第 4 列。

正如我们在 第二章,VLOOKUP 已死:还是吗? 中学到的,您可以通过将 MATCH 函数嵌套在 VLOOKUP 中来克服这个问题,如下所示:

=VLOOKUP(J3, SalesTable, MATCH(K2, SalesTable[#Headers], 0), 0)

当您删除列时,VLOOKUP 函数会返回错误,但 XLOOKUP 可以动态处理删除。参考在我们删除项目列后的 图 6.9

VLOOKUP 函数返回错误,因为找不到返回列,即第 4 列。

图 6.9: 在删除列后的 VLOOKUPXLOOKUP 函数

轻松垂直或水平查找数据

使用 XLOOKUP 函数,我们不再需要 HLOOKUP 或修改后的 VLOOKUP 函数来水平查找数据。

图 6.10 中,我们查找了最低报价的供应商:

图 6.10: 在删除列后的 VLOOKUPXLOOKUP 函数

=VLOOKUP(MIN(E67:G67), TRANSPOSE(IF({1;0}, E67:G67, Reps)), 2, 0)

=XLOOKUP(MIN(E67:G67), E67:G67, $E$66:$G$66)

正如我们从前述函数中看到的,XLOOKUP 很容易编写和解释。

这是 XLOOKUP 函数的工作原理:

  • MIN(E67:G67): MIN 函数返回每个项目的最低报价。这将成为我们的查找值。

  • E67:G67: 这是我们的查找数组,即所有价格范围。这是我们将找到最低价格位置的地方。

  • $E$66:$G$66: 这是我们的返回数组,即所有供应商。我们将返回位置对应于最低价格的供应商。

轻松从底部向上查找数��

默认情况下,XLOOKUPVLOOKUP 函数从上到下查找数据,并返回第一个 TRUE 值。

图 6.11 中,我们查找了最后一次客户"Clay Rozendal"向我们购买的日期:

图 6.11: XLOOKUP 函数从下到上查找

=XLOOKUP(H3,SalesTable[Customer],SalesTable[Date],,,-1)

这里唯一的诀窍是在XLOOKUP中指定正确的搜索模式,即-1。

这个搜索模式参数确定函数的搜索行为,即 1(从头到尾)、-1(从尾到头)或 2(二进制搜索)。如果省略,XLOOKUP将默认为 1(从头到尾)。

我们需要使用以下函数来使用VLOOKUP获得相同的结果。如图 6.12 所示,VLOOKUP函数复杂且难以理解:

=VLOOKUP(

MAX((SalesTable[Customer]=H3)*ROW(SalesTable[Customer])),

IF({1,0},(SalesTable[Customer]=H3)*ROW(SalesTable[Customer]),SalesTable[Date]),

2,0)

图 6.12: VLOOKUP 函数从底部向顶部查找

参考*第二章,VLOOKUP 已死:还是吗?*以了解前述VLOOKUP函数的工作原理。

轻松将通配符集成到查找中

使用星号(*)或问号(?)通配符字符创建了一个多功能且更简单的查找值。

例如,在图 6.13中,我们查找包含字母"P"的成本代码的日期。

图 6.13: 使用星号通配符的 XLOOKUP

=XLOOKUP(I3,SalesTable[Cost Code],SalesTable[Date],,2)

这里唯一的诀窍是记住使用 2 作为匹配模式。

匹配模式参数确定函数如何将查找值与查找数组中的值进行匹配。它可以指定为 0(精确匹配)、-1(精确或下一个较小值)、1(精确或下一个较大值)或 2(通配符匹配)。如果省略,XLOOKUP 将默认为精确匹配。

**注意:**星号()通配符代表文本字符串中的一个或多个字符。例如,P 将找到以字母 P 开头的任何单词,*P 将找到以字母 P 结尾的任何单词,P将找到包含字母 P 的任何单词。

还要记住XLOOKUP函数返回第一个TRUE值。

我们不仅限于使用星号通配符,而是可以将两者结合起来,如图 6.14所示。在这个例子中,我们查找第五个字符为"P"的成本代码的日期。

如讨论的,问号(?)通配符代表文本字符串中的单个字符。因此,查找值"???P*"将找到第五个字符为字母"P"后跟任意字符的任何文本字符串。

图 6.14: 使用问号和星号通配符的 XLOOKUP

返回单元格引用

XLOOKUP函数最不为人知的功能之一是它返回单元格引用,而不仅仅是值。

尽管单元格引用是看不见的,不像返回的值,但仍然可以使用,如图 6.15所示:

图 6.15: XLOOKUP 返回单元格引用

=SUM(XLOOKUP(I95,Customers,XLOOKUP(J95,Regions,Data)):

XLOOKUP(I95,客户, XLOOKUP(K95,地区,数据)))

公式的工作原理如下:

  • 步骤 1 :为公式中使用的部分创建命名范围。选择每个地区,如图 6.16 所示,转到名称框,并给它一个名称。

    图 6.16: 创建命名范围

  • 步骤 2 :编写嵌套的XLOOKUP函数:

    • 嵌套的XLOOKUP函数,XLOOKUP(J95,地区,数据),返回地区数据。这形成了主XLOOKUP函数的返回数组。

    • 使用嵌套的XLOOKUP函数作为返回数组,查找客户的位置:

      XLOOKUP(I95,客户, XLOOKUP(J95,地区,数据))

    • 要强制XLOOKUP函数返回单元格引用,使用范围运算符(:)在返回东部地区的XLOOKUP和返回西部地区的XLOOKUP之间(参见图 6.17):

      XLOOKUP(I95,客户, XLOOKUP(J95,地区,数据)):

      XLOOKUP(I95,客户, XLOOKUP(K95,地区,数据))

    图 6.17: XLOOKUP 返回单元格范围

  • 步骤 3:最后,对上述返回的范围求和:

    =SUM(

    XLOOKUP(I95,客户, XLOOKUP(J95,地区,数据)):

    XLOOKUP(I95,客户, XLOOKUP(K95,地区,数据))

    )

注意: XLOOKUP 无法返回多行/列引用;它仅限于单个单元格引用。对于多行/列引用,请使用多个以范围运算符(:)分隔的XLOOKUP

在没有匹配项的情况下返回值

与其他查找函数不同,如果未找到匹配项,XLOOKUP 具有内置的"如果未找到匹配项"参数。

例如,在图 6.19中,我们只应该为打折商品获得折扣,而对其他商品返回零。

图 6.18: XLOOKUP if_not_found 参数

我们必须使用if_not_found参数来捕获非打折商品的零,如图 6.18所示:

图 6.19: XLOOKUP 如果未找到匹配项则返回一个值

轻松进行三向查找

与 VLOOKUP 函数不同,嵌套的 XLOOKUP 函数可以轻松进行三向查找,如图 6.20所示:

图 6.20: XLOOKUP 三向查找

=XLOOKUP(J126&K126,销售代表&产品,

XLOOKUP(L126, 月份, 金额))

函数的工作原理如下:

  • 步骤 1 :为公式中使用的部分创建命名范围。选择每个地区,如图 6.20中突出显示的。要创建一个命名范围,突出显示数据,转到名称框,并给它一个名称。最后,按 Enter 键。

  • 步骤 2 :编写嵌套的XLOOKUP函数:

    • 嵌套的XLOOKUP函数,XLOOKUP(L126, 月份, 金额),返回准则月份数据。这形成了主 XLOOKUP 函数的返回数组。

    • 至于主要的XLOOKUP函数,首先创建一个连接的标准 --- J126&K126。这返回销售代表和产品标准的组合。然后创建组合的销售代表和产品列,如图 6.21 所示:

    图 6.21: XLOOKUP 连接列作为查找数组

  • 步骤 3:最后,获取组合条件在组合列中的位置。然后返回相同位置的金额。

注意: 连接条件的顺序应该与列的顺序相同。

例如,在前面的情景中,如果我们创建了一个SalesRep&Product组合标准,那么我们必须创建一个SalesRep&Product组合查找数组。任何其他顺序都不起作用。

轻松返回非相邻列

使用上面的示例,现在让我们使用 XLOOKUP 函数返回一月和三月的金额,如图 6.22所示:

图 6.22: XLOOKUP 返回非相邻列值

=XLOOKUP(J126&K126, SaleReps&Products, IF({1,0},Jan,Mar))

函数的工作原理如下:

  • 步骤 1 :为公式中使用的部分创建命名范围。选择如图 6.22中突出显示的每个区域。要创建命名范围,突出显示数据,转到名称框,并给它一个名称。最后,按 Enter 键。

  • 步骤 2 :使用 IF 函数返回非相邻列,如图 6.23所示。这是你需要记住的唯一技巧。

  • 步骤 3:创建一个连接的标准 --- J126&K126。这返回销售代表和产品标准的组合。然后创建销售代表和产品列的组合查找数组。

  • 步骤 4:最后,获取组合条件在组合查找数组列中的位置。然后返回相同位置的非相邻列中的金额。

注意: IF 函数的替代方案是CHOOSE函数,如下所示:

=XLOOKUP(J126&K126, SaleReps&Products, CHOOSE({1,2},Jan,Mar))

图 6.23: IF 返回非相邻列

另一种方法是使用 Filter 函数返回非相邻列,如图 6.24所示:

图 6.24: FILTER 函数返回非相邻列

=XLOOKUP(J126&K126, SaleReps&Products,FILTER(Amounts,{1,0,1}))

这里需要学习的唯一技巧是学习如何使用包含参数来获取非相邻行(有关更多信息,请参考下一章中的 FILTER 函数)。

Filter 函数的"包含"部分通常指定应在过滤结果中包含哪些给定列表或数组的元素的条件。如果条件为 TRUE(1),则包含;否则,不包含。

返回最后/第一个非空单元格

除了LOOKUP函数外,获取最后/第一个非空单元格的更好选择是XLOOKUP函数,如图 6.25所示:

图 6.25: XLOOKUP 最后/第一个非空单元格

要获得第一笔付款:

=XLOOKUP(FALSE,ISBLANK(E158:I158),$E$157:$I$157)

要获得最后一笔付款:

=XLOOKUP(FALSE,ISBLANK(E158:I158),$E$157:$I$157,,-1)

函数的工作原理如下。

  • 步骤 1 :使用 ISBLANK 函数检查单元格是否为空。这将返回一个 TRUE/FALSE 值数组,如图 6.26 所示:

    图 6.26: ISBLANK TRUE/FALSE 数组

  • 步骤 2 :要获得第一笔付款,在数组中搜索第一个 FALSE 值:=XLOOKUP(FALSE,ISBLANK(E158:I158),$E$157:$I$157)

  • 步骤 3 :要获得最后一笔付款,我们将-1 指定为 search_mode。XLOOKUP 函数将最后一个 FALSE 值与范围中的第一个 FALSE 值进行匹配:=XLOOKUP(FALSE,ISBLANK(E158:I158),$E$157:$I$157,,-1)

轻松查找非连续数组

嵌套的 XLOOKUP 函数还可以轻松地从非连续数组中获取值,如图 6.27所示:

图 6.27: XLOOKUP 非连续数组

=XLOOKUP(TRUE,[@Product]="Chairs",

XLOOKUP([@Amount], DiscountChairs[Amt], DiscountChairs[Disc],,-1),

XLOOKUP([@Amount], DiscountLaptops[Amt], DiscountLaptops[Disc],,-1))

函数的工作原理如下。

  • 步骤 1:检查产品是否为"椅子"。这将返回一个 TRUE/FALSE 值。

  • 步骤 2:由于我们使用"TRUE"作为查找值,如果前面的比较为 TRUE,则执行第一个嵌套的 XLOOKUP。它使用近似匹配(我们指定-1 作为匹配模式以进行近似匹配查找)从椅子的折扣表中获取折扣百分比。

    XLOOKUP([@Amount], DiscountChairs[Amt], DiscountChairs[Disc],,-1),

  • 步骤 3 :如果值为FALSE,我们执行XLOOKUP,该函数位于XLOOKUP的**"if_not_found"**参数中。这个XLOOKUP从笔记本电脑的折扣表中获取折扣百分比。注意:这也是一个近似匹配查找。

    XLOOKUP([@Amount], DiscountLaptops[Amt], DiscountLaptops[Disc],,-1)

轻松返回重复查找值

虽然,默认情况下,XLOOKUP函数在查找数组包含重复值时不返回多个匹配值,但它会返回第一个TRUE值。

但是,如果嵌套LARGE函数,则可以实现这一点,如图 6.28所示:

图 6.28: XLOOKUP 返回重复查找值。

=XLOOKUP(

LARGE((Vendors=$J$183)*ROW(Vendors),ROW(A1)),

ROW(Vendors),January,"")

函数的工作原理如下。

  • (Vendors=$J$183) 检查哪个供应商等于"Emily"并返回一个 TRUE/FALSE 数组。

  • (Vendors=$J$183)*ROW(Vendors) 将上述 TRUE/FALSE 数组与行号相乘。这将返回供应商 Emily 的行号数组;否则,返回零(见 图 6.29 ):

    图 6.29: 标准供应商的行号

  • 我们需要遍历这些行号列表,并逐个作为 XLOOKUP 的查找值返回。我们使用 LARGE 函数来完成此任务,它从最大到最小返回行号。注意 ROW(A1) 评估为 1,当您向下拖动函数时,它会增加,直到完整列表被迭代。LARGE((Vendors=$J$183)*ROW(Vendors),ROW(A1)),

  • XLOOKUP 返回每行号的一月金额。

结论

在本章中,我们探讨了新 XLOOKUP 动态函数的强大功能,并观察了它如何轻松查找值。

XLOOKUP 与其他函数区分开的一个独特特性是其搜索模式从后往前,而不是从上到下。

与其他函数不同,如果查找值未找到并且我们需要将它们嵌套在 IFERROR 函数中,XLOOKUP 不需要这样做,因为它有一个 If_not_found 参数,我们可以��回一个值或一个函数。

在下一章中,我们将了解一个更好的查找函数,如果 lookup_array 包含重复值,则可以返回多个值 --- FILTER 函数。

要记住的要点

  • XLOOKUP 函数同时返回值和单元格引用。

  • XLOOKUP 通常比传统的查找函数如 VLOOKUPHLOOKUP 更快,特别是处理大数据集时。对于升序排序的值,指定 2 以启用二进制搜索模式,对于降序排序的值,指定-2。

多项选择题

  1. XLOOKUP 函数中,lookup_value 是什么?

    1. 要在查找范围中搜索的值

    2. 要在其中搜索的值范围

    3. 要返回的值范围

    4. 用于过滤结果的条件

  2. 如果默认的 XLOOKUP 函数在查找范围中找不到 lookup_value,会发生什么?

    1. 它返回一个错误

    2. 它返回最接近的匹配值

    3. 它返回一个指定的默认值

    4. 它返回查找范围的平均值

  3. 以下哪项不是 XLOOKUP 函数中的有效参数?

    1. "lookup_value"

    2. "return_array"

    3. "criteria_range"

    4. "not_found"

  4. XLOOKUP 函数中的 "if_not_found" 参数的目的是什么?

    1. 指定如果找到匹配项要返回的值

    2. 指定如果找不到匹配项要返回的值

    3. 指定要搜索匹配项的范围

    4. 指定结果的数据类型

  5. 哪个 Excel 版本引入了 XLOOKUP 函数?

    1. Excel 2007

    2. Excel 2010

    3. Excel 2016

    4. Office 365 Excel

  6. XLOOKUP 函数的公式结构是什么?

    1. =XLOOKUP(lookup_value, lookup_array, return_array)

    2. =XLOOKUP(lookup_array, lookup_value, return_array)

    3. =XLOOKUP(return_array, lookup_value, lookup_array)

    4. =XLOOKUP(return_array, lookup_array, lookup_value)

答案

  1. a

  2. a

  3. c

  4. b

  5. d

  6. a

第七章

FILTER:最终查找函数

介绍

本章将讨论最终查找函数之一------Filter 函数。与XLOOKUP函数不同,FILTER函数轻松返回所有匹配项的数组,而不仅仅是第一个匹配项。这种返回数据子集的灵活性,而不仅仅是单个条目,使 FILTER 成为创建动态报告中最佳函数之一。现在让我们探讨不同的情况,我们可以使用FILTER函数以更定制 的方式分析数据,而无需复杂的公式。

结构

本章将讨论以下 15 种情况,其中FILTER函数最适用:

  • 返回多列和多行

  • 返回非相邻列

  • 轻松使用AND/OR进行多条件查找

  • 轻松查找所有 X 而不是 Y 的项目

  • 轻松查找前 n 个或后 n 个项目

  • 轻松查找 X 或 Y,但不是两者都有

  • 使用通配符查找数据

  • 查找工作日与周末数据

  • 查找排除假期的数据

  • 查找奇数/偶数

  • 查找重复出现 N 次的项目

  • 基于时间查找项目

  • 基于周数、月份、年份查找数据

  • 查找两个列表中常见/不常见的值

  • 仅返回月末日期项目

返回多列和多行

FILTER 函数具有最简单和最易于理解的语法之一------仅三个参数。

=FILTER(array, include, [if_empty])

  • array 是您要查找的数据范围/数组。这可以是表格或单个列/行。

  • include 是一个由TRUE/FALSE组成的数组,其中TRUE表示要返回的值,否则为FALSE

    注:如果筛选的数组在列中,则包含必须与此数组的长度相同。如果数组在行中,则包含必须与此数组的宽度相同。

  • [if_empty]- [可选] 当没有结果返回时要返回的值。

例如,在图 7.1中,我们想查找所有员工"卡尔·杰克逊"的贡献及相应日期。

图 7.1: 返回多行和多列

=FILTER(tblContribution[[Date]:[Amount]],tblContribution[Staff]=F3)

以下是前述函数的工作原理:

  • 选择要作为我们数组筛选的列。这里我们选择相邻列;在下一个示例中,我们将学习如何选择非相邻列→ tblContribution[[Date]:[Amount]]

  • 检查我们的标准(卡尔·杰克逊)在员工名单中出现的所有情况→ tblContribution[Staff]=F3. 这将返回一个布尔数组(参见图 7.2),确定要包含在筛选器中的值。

图 7.2: 创建包含参数

注意 :由于 FILTER 函数根据您的筛选数组在垂直/水平方向或两者之间溢出结果,请确保有足够的空单元格,否则将出现#SPILL!错误(参见图 7.3)。

图 7.3: 阻止文本导致溢出错误

返回多个非相邻列和行

图 7.4所示,我们已调整了前面示例中的数据以包括捐赠物品。

在这个例子中,我们想要返回所有捐赠物品和金额。

图 7.4: 返回非相邻列

=FILTER(CHOOSECOLS(tblContribution,2,4),tblContribution[Staff]=G3)

以下是前述函数的工作原理:

  • 要选择要筛选的非相邻列,我们将使用CHOOSECOLS函数。此函数需要一个表名和所需的列号 → CHOOSECOLS(tblContribution,2,4)

注意

  • 如果您不想在CHOOSECOLS函数中硬编码列,可以使用XMATCH函数(参见图 7.5)。

  • 检查所有员工列表中出现我们标准(卡尔·杰克逊)的情况→ tblContribution[Staff]=F3。这将返回一个布尔数组,确定筛选器中要包含的值**。**

图 7.5: CHOOSECOLS 函数动态返回非相邻列

返回非相邻列的另一种选择是使用嵌套的FILTER函数,如下所示:

=FILTER(

FILTER(tblContribution,tblContribution[Staff]=G3),

{0,1,0,1})

以下是前述函数的工作原理:

  • FILTER(tblContribution,tblContribution[Staff]=G3) 这个嵌套的 FILTER 函数返回所有员工等于存储在单元格 G3 中的卡尔·杰克逊的列。

  • 要仅获取第二和第四列,我们使用另一个FILTER函数,并在包含参数中指定这些列。正如我们在介绍部分中学到的那样,包含参数是一个TRUE (1) /FALSE (0)的数组,其中 TRUE 表示要返回的值,否则为 FALSE。因此,{0,1,0,1}将仅返回第二和第四列。

返回非相邻列的第三种选择是嵌套CHOOSE函数。就像CHOOSECOL函数一样,您不仅可以返回非相邻列,还可以重新排列它们。使用下面的公式,我们可以先返回金额列,然后是日期列。

=FILTER(

CHOOSE({1,2},tblContribution[Amount],tblContribution[Date]),tblContribution[Staff]=G51)

使用 AND/OR 轻松进行多个条件查找

如前面的示例所示,我们不限于单个标准。我们可以使用 FILTER 函数与多个标准和不同的逻辑(AND/OR)。

例如,在图 7.6 中,我们想要查找所有捐赠物品为ZARUSDCHF的捐赠者。

=FILTER(Donors, COUNTIF(List, Currency))

以下是前述函数的工作原理:

  • 选择捐赠者的命名范围(Donors)作为我们的过滤数组。

  • 使用COUNTIF函数计算我们的货币条件列表在我们的货币数据库列表中出现的次数。这将返回一个由 1/0 组成的数组,其中 1=TRUE,0=FALSE。

    {0 0 0 0 0 1 0 1 0 0 0 1}

  • Filter函数返回所有对应于值为 1 的捐赠者。

图 7.6: 使用 COUNTIF 函数的 FILTER 函数多条件 OR 逻辑

使用加号(+)表示 OR 逻辑是使用COUNTIF函数的替代方法,如图 7.7所示。

图 7.7: 使用加号(+)表示的 FILTER 函数多条件 OR 逻辑

图 7.8 中,我们想知道员工Carl Jackson何时以及捐赠了多少书籍。

图 7.8: 使用 FILTER 函数多条件 AND 逻辑

=FILTER($D$3:$E$14,($B$3:$B$14=G3)*($C$3:$C$14=H3))

以下是前述函数的工作原理:

  • 选择过滤数组($D$3:$E$14)

  • 检查员工是否等于 Carl Jackson ($B$3:$B$14=G3),物品是否等于 Books ($C$3:$C$14=H3)**。**这些返回一个布尔数组(TRUE/FALSE)。

  • 由于 FILTER 函数不接受AND函数的嵌套,我们使用星号()来表示 AND 逻辑。当你将前两个布尔数组相乘时,只有在满足所有条件时才会得到值为 1。参见图 7.9*。

图 7.9: 使用星号(*)表示 AND 逻辑

轻松查找所有 X 而不是 Y 的项目

在本节中,我们将学习如何在 FILTER 函数中使用 NOT 比较运算符(<>)。

图 7.10所示,我们想查找所有成绩为 A 但不在英语科目中的学生。

图 7.10: 使用 NOT 比较运算符(<>)过���数据

=FILTER(C49:C61,(F49:F61="A")=(D49:D61<>"English"))

以下是前述函数的工作原理:

  • 选择学生过滤数组**(C49:C61)**。

  • 检查成绩是否等于A (F49:F61="A") ,以及科目是否不等于EnglishD49:D61<>English)。这些返回一个布尔数组---TRUE(两个检查都为真)和FALSE(其中一个/两个测试为假)

使用大于比较运算符的替代方法,如图 7.11所示。

图 7.11: 使用大于(>)比较运算符过滤数据

=FILTER(C49:C61,(F49:F61="A")>(D49:D61="English"))

这里需要学习的唯一技巧是 Excel 将 FALSE 值视为零(0),将 TRUE 视为一(1);然后,只有在 1>0 的情况下结果才为 TRUE。参见图 7.12

图 7.12: 比较布尔值

轻松查找前 n 个或后 n 个项目

与先前学习的查找函数不同,FILTER 函数可以轻松返回前几项或底部项目,如 图 7.13 所示。

图 7.13: 过滤前几项或底部项目

要过滤前 3 个

=FILTER(Donors, Donations>=LARGE(Donations,3))

要过滤最后 3 个

=FILTER(Donors, Donations<=SMALL(Donations,3))

这里是上述函数的工作原理:

  • 选择捐赠者的命名范围过滤数组。

  • 使用 LARGE 函数返回第三大值 ( LARGE(Donations,3) ) 或使用 SMALL 函数返回第三小值 ( SMALL(Donations,3) ).

  • 要过滤前几项,请检查捐赠金额大于或等于第三大的 (Donations>=LARGE(Donations,3)). 要过滤底部项目,请检查捐赠金额小于或等于第三小的 (Donations<=SMALL(Donations,3)). 这些返回一个布尔数组---TRUE(两个检查都为真)和FALSE(一个/两个测试为假)。

  • 过滤函数返回所有对应于 TRUE 值的捐赠者。

轻松查找 X 或 Y 而不是两者都有

这不是一个经常出现的查找问题,但了解如何解决它是值得的。

我们需要查找所有得到 A 等级或参加英语考试的学生,但不是两者都有。参见 图 7.14

图 7.14: 过滤所有 X 或 Y 但不是两者都有

=FILTER(C82:C94,(F82:F94="A")-(D82:D94="English"))

唯一需要学习的技巧是使用减号(-)作为比较运算符。

这里是比较的工作原理。

如果一个比较是 TRUE(1) 而另一个是 FALSE(0),那么比较结果将是 1-0=1。因此,总体上是 TRUE。当比较两个 FALSE 条件时,0-0=0,因此总体上是 FALSE。当比较两个 TRUE 条件时,1-1=0,这也将是总体上的 FALSE。参见 图 7.15

图 7.15: 减号(-)比较运算符

注意

  • 在 Excel 中,FALSE 等于 0 值,而任何其他值等于 TRUE

  • 这就是为什么在 图 7.15 中,值为 -1 等于 TRUE

使用通配��查找数据

不幸的是,FILTER 函数不支持两个通配符字符(*?)。

然而,可以通过结合使用 SEARCH 和 ISNUMBER 函数来解决,如 图 7.16 所示。

任务是过滤所有产品中包含单词"牛奶"的生产商。

图 7.16: 使用通配符过滤数据

=FILTER(Producers, ISNUMBER(SEARCH("Milk", Product)))

这里是上述函数的工作原理:

  • 如果产品名称包含单词"牛奶",搜索函数返回一个数字,否则返回一个错误 (SEARCH("Milk", Product)).

  • ISNUMBER 函数返回一个 TRUE/FALSE 数组,将用作 FILTER 函数中的包含条件。如果 SEARCH 函数返回的值是一个数字,则 ISNUMBER 返回 TRUE;否则返回 FALSE

查找工作日或周末数据

根据工作日或周末分析交易是必要的,特别是对于销售分析师。

这可以通过 FILTER 函数和 WEEKDAY 函数的组合轻松完成,如 图 7.17 所示。

要筛选工作日销售的物品:

=FILTER(tblSportSale[Item],WEEKDAY(tblSportSale[Date],2)<6)

要筛选周末销售的物品:

=FILTER(tblSportSale[Item],WEEKDAY(tblSportSale[Date],2)>=6)

以下是前述公式的工作原理。

  • 给定销售日期,WEEKDAY 函数 ( WEEKDAY(tblSportSale[Date],2)) 返回一个介于 1 和 7 之间的数字,代表一周中的某一天。星期一(1)到星期日(7)

  • 对于工作日日期,这些日期的日期编号小于 6,而周末日期的日期编号大于或等于 6

图 7.17: 筛选工作日或周末数据

查找排除假期和周末的数据

在前面的示例中,我们看到了如何查找工作日或周末销售的物品。

假设我们有假期,如何查找仅在工作日销售的物品?如 图 7.18 所示,您可以使用 po 函数排除假期和周末。

=FILTER(SportSales[Item],WORKDAY(SportSales[Date]-1,1,Holidays)=SportSales[Date])

以下是前述函数的工作原理:

  • WORKDAY(SportSales[Date]-1, 1, Holidays) 将从销售日期减去一天以获取初始日期,然后添加一个工作日以找到该初始日期后的下一个工作日,同时排除"假期"列表中指定的任何日期。如果销售日期不是假期或周末,则 WORKDAY 函数将返回相同日期;否则,它将返回下一个工作日。

  • 将返回的工作日与销售日期进行比较,WORKDAY(SportSales[Date]-1,1,Holidays)=SportSales[Date]. 如果日期相同,则返回 TRUE,否则返回 FALSE

FILTER 函数仅返回与前述数组中的 TRUE 值对应的物品。

图 7.18: 仅筛选工作日数据

查找奇数/偶数数字

假设您是一名审计员,想要提取仅为偶数发票的物品,如 图 7.19 所示。

以下是您可以用于此任务的公式。

=FILTER(B147:B158,ISEVEN(0+B147:B158))

以下是前述函数的工作原理:

  • ISEVEN(0+B147:B158) ISEVEN 函数返回一个 TRUE/FALSE 数组。所有偶数发票返回 TRUE,否则返回 FALSE

注意

  • 要强制 ISEVEN 函数将整个范围作为数组进行评估,必须在引用的范围中添加零,否则函数将返回 #VALUE 错误。

  • FILTER 函数仅返回与先前返回的数组的 TRUE 值对应的发票。

  • 要过滤奇数发票号,将公式更改如下:

=FILTER(B147:B158,ISODD(0+B147:B158))

图 7.19: 仅过滤偶数值

查找重复 N 次的物品

利用之前的贡献数据,让我们看看如何过滤所有捐赠超过两次的员工,如 图 7.20 所示:

图 7.20: 过滤重复 n 次的项目

=UNIQUE(FILTER(Staff, COUNTIF(Staff, Staff)>2))

以下是前述函数的工作原理:

  • COUNTIF(Staff, Staff) COUNTIF 函数返回列表中员工重复次数的数组。参考 图 7.21

    图 7.21: COUNTIF 函数显示每个物品的重复次数

  • 接下来,我们检查哪些物品重复超过两次 COUNTIF(Staff, Staff)>2. 这将返回一个 TRUE/FALSE 数组。

  • FILTER 函数仅包括对应于 TRUE 值的员工,如 图 7.22 所示。

    图 7.22: 过滤重复值

  • 为了消除重复值,我们使用 UNIQUE 函数 UNIQUE(FILTER(Staff, COUNTIF(Staff, Staff)>2))

根据时间查找物品

大多数出勤数据以 DateTime 格式收集,如 图 7.23 所示。然而,我们需要仅使用 DateTime 的时间部分来查找该数据。

面对这样的问题,唯一需要记住的是时间值始终以 24 小时的分数存储,而日期存储为序列号。

因此,时间将是 DateTime 序列号中的小数部分。

图 7.23: 基于时间过滤

=FILTER(tblStudents,MOD(tblStudents[[Arrival ]],1)>G164)

以下是前述函数的工作原理:

  • MOD(tblStudents[[Arrival ]],1) 当除数为 1 时,MOD 函数始终返回数字的小数部分。

  • MOD(tblStudents[[Arrival ]],1)>G164 此条件检查计算出的 Arrival 时间的小数部分(MOD 结果)是否大于单元格 G164 中的值。这实质上是检查到达时间的分钟部分是否大于 G164 中的值。

  • FILTER 函数用于根据特定条件从 tblStudents 表中检索行。在这种情况下,它过滤了计算出的 Arrival 时间的小数部分大于单元格 G164 中的值的行。

根据周数、月份和年份查找数据

在前一节中,我们学习了如何根据工作日或周末筛选数据。在本节中,我们将学习如何根据周数、月份和年份查找数据。

图 7.24 中,我们正在查找所有在第 3 周售出的物品。

图 7.24: 基于周数筛选

=FILTER(SportSales[Item],WEEKNUM(SportSales[Date]+0)=3)

注意:

  • WEEKNUM 函数不接受数据范围。它会返回#VALUE错误。但是,我们可以通过在范围后添加零(SportSales[Date]+0)来强制执行。

  • WEEKNUM 函数返回一个周数的数组(参见图 7.25)。

  • 当我们将计算出的周数(来自前一步)与该值进行比较时,我们会返回一个由TRUEFALSE组成的数组。

  • FILTER函数用于筛选前一步中数值为TRUE的行。

图 7.25: WEEKNUM 返回一个周数数组

要筛选特定月份的数据,请使用如图 7.26所示的月份函数。

图 7.26: 基于月份筛选

=FILTER(SportSales[Item],MONTH(SportSales[Date])=6)

这里需要注意的是MONTH函数返回一个月份数字的数组。其他一切都如WEEKNUM函数中所解释的那样。

最后,图 7.27展示了如何使用年份值来筛选数据。

图 7.27: 基于年份筛选

=FILTER(SportSales[Item],YEAR(SportSales[Date])=2022)

这里需要注意的是YEAR函数返回一个年份数字的数组。其他一切都如前面的函数中所解释的那样。

查找两个列表中的共同/不常见项目

在 Excel 中比较列表中的值是一项常见的活动。例如,在图 7.28中,我们查找两个列表之间的共同和新客户。

获取新(不常见的)客户

=FILTER(Current_Customers, COUNTIF(LastYear_Customers,Current_Customers)=0)

获取老(共同的)客户

=FILTER(Current_Customers, COUNTIF(LastYear_Customers,Current_Customers)=0)

函数的唯一技巧是使用COUNTIF函数计算新列表中项目在旧列表中重复出现的次数。

►COUNTIF(LastYear_Customers, Current_Customers) 计算同时出现在 LastYear_Customers 范围和 Current_Customers 范围中的客户数量。它返回一个由 1 和 0 组成的数组。其中 1=两者共同,0=不常见。

图 7.28: 筛选列表之间的常见/不常见项目

仅返回月底日期项目

当您想要返回任何月份最后一天出售的物品时,就像在图 7.29 中所示,您必须使用EOMONTH函数。

图 7.29: 筛选在月底出售的项目

=FILTER(Sport_Sales[Item], EOMONTH(Sport_Sales[Date]+0,0)=Sport_Sales[Date])

注意:

  • EOMONTH函数不接受数据范围。它会返回#VALUE错误。但是,我们可以通过在范围后添加零(SportSales[Date]+0)来强制执行。

  • EOMONTH函数返回给定日期的月份的最后一天的数组(参考图 7.30 )。

    图 7.30: EOMONTH 返回月份的最后一天的数组

  • 当我们将计算得出的月底日期(来自上一步)与销售日期进行比较时,我们会返回一个由TRUEFALSE组成的数组。

  • FILTER函数用于过滤前一步骤中数值为TRUE的行。

结论

在本章中,我们学习了 Excel 中最易于理解和使用的查找函数之一------FILTER函数。当您想要返回多个数值时,这是最常推荐的函数。

FILTER函数是 Excel 工具中的一个强大工具,为用户提供了从庞大数据集中提取特定数据子集的动态和高效手段。通过本章,我们探讨了FILTER函数的复杂性,深入研究了其语法、参数和实际应用。

通过利用FILTER函数的功能,Excel 用户可以简化其数据分析流程,提高准确性和效率。该函数使用户能够轻松地根据复杂条件检索相关信息,促进明智决策,并促进对数据的全面洞察。

在下一章中,我们将学习有关 Power Query 的内容。

记住的要点

  • FILTER函数与其他 Excel 动态数组函数(如SORTUNIQUETRANSPOSE)无缝配合,允许您创建复杂的数据操作工作流程。

  • FILTER函数是非不稳定的。与其他一些在每次更改时重新计算的函数不同,FILTER函数仅在基础数据或条件更改时重新计算,提高了整体工作表性能。

  • FILTER函数不支持 AND/OR 函数。因此,在多个条件的情况下,使用星号(*)来调用 AND 操作,加号(+)来调用 OR 操作。

  • FILTER函数可以处理各种数据类型,包括数字、文本、日期等,使其适用于各种数据分析任务。

测验

  1. FILTER函数的哪个参数用于在未找到匹配结果时显示自定义消息或数值?

    1. 数组

    2. 条件

    3. [if_empty]

    4. [include]

  2. 使用FILTER函数而不是传统过滤技术的以下哪项不是其优点?

    1. 动态数组溢出

    2. 与其他动态数组函数兼容

    3. 不稳定的重新计算

    4. 简化多条件处理

  3. 如果根据条件未找到匹配结果,FILTER函数会返回什么 Excel 错误?

    1. #REF!

    2. #VALUE!

    3. #CALC!

    4. #NUM!

  4. 用于重新排序FILTER函数结果列的 Excel 函数是什么?

    1. SORT

    2. SUM

    3. VLOOKUP

    4. CHOOSE

  5. 以下哪个公式使用 FILTER 函数从表中提取"Region"列等于"East"的行?

    1. =FILTER(Table1, "Region", "East")

    2. =FILTER(Table1, "Region"="East")

    3. =FILTER(Table1, Table1[Region]="East")

    4. =FILTER(Table1, "East", "Region")

答案

  1. [if_empty]

  2. 可变重新计算

  3. #CALC!

  4. CHOOSE

  5. =FILTER(Table1, Table1[Region]="East")

第八章

Power Query:一站式解决方案

介绍

本章将讨论 Excel 中的一个改变游戏规则的工具,承诺彻底改变我们处理数据检索和转换的方式 --- Power Query。

Power Query 常被誉为数据查找的一站式解决方案,赋予用户无缝连接、重塑和清洗来自各种来源的数据的能力,以出色的效率和便捷性将原始信息转化为有价值的见解。

像 FILTER 函数一样,Power Query 具有返回数据子集的灵活性,而不仅仅是单个条目,这对于创建动态报告非常重要。

在 Excel 2010 和 Excel 2013 版本中,默认情况下未集成 Power Query 功能。您需要下载并安装 Power Query 加载项,该加载项可以在微软下载中心的加载项中找到。安装后,您将在 Excel 标签的Power Query选项卡中找到 Power Query 选项。

结构

在本章中,我们将讨论可以使用 Power Query 的 15 种场景:

  • 为 Excel 2010 和 Excel 2013 安装 Power Query 加载项

  • 精确查找

  • 返回多个结果和多列。

  • 近似查找

  • 使用表连接进行查找。

  • 查找前 n 个或后 n 个项目

  • 使用 List 函数进行查找。

  • 查找工作日与周末数据

  • 查找排除节假日的数据。

  • 查找重复 N 次的项目。

  • 仅返回月底日期项目

  • 模糊查找

安装 Power Query 加载项适用于 Excel 2010 和 Excel 2013

以下是如何操作的指南:

对于 Excel 2010:

  • 下载 Power Query 加载项**:**

    • 前往微软下载中心。

    • 搜索"Excel 2010 的 Power Query"并根据您的 Excel 版本和系统架构下载适当的版本(32 位或 64 位)。

  • 安装加载项:

    • 运行下载的安装程序。

    • 按照屏幕上的说明安装 Power Query 加载项。确保在此过程中关闭 Excel。

    • 安装完成后,打开 Excel 2010。

  • 启用加载项:

    • 在 Excel 中点击"文件"选项卡。

    • 选择"选项"。

    • 在 Excel 选项对话框中,点击左侧边栏的"加载项"。

    • 在底部的"管理"框中,选择"COM 加载项"并点击"前往"。

    • 选中"Microsoft Office Power Query for Excel"选项。

    • 点击"确定"以启用加载项。

对于 Excel 2013:

Power Query 已经集成,但您可能需要启用它。

以下是如何启用 Power Query 的方法:

  • 在 Excel 中点击"文件"选项卡。

  • 选择"选项"。

  • 在 Excel 选项对话框中,点击左侧边栏的"加载项"。

  • 在底部的"管理"框中,选择"COM 加载项"并点击"前往"。

  • 选中"Microsoft Office Power Query"选项。

  • 点击"确定"以启用 Power Query。

  • 启用 Power Query 后,您可以从功能区的"数据"选项卡中访问它。您将在那里看到"获取和转换"以及"获取数据"等选项。

使用 Power Query 的第一步是将数据导入其编辑器。有两种导入数据的方式如下:

  • 如果您的数据位于 Excel 工作簿中,请转到"数据"选项卡,并选择"从表/范围获取",如果您的��据位于结构化表中。

  • 如果您的数据位于不同的工作簿或不同的格式(CSV、文本文件、数据库、网络来源等),请转到"数据"选项卡,选择"获取数据",并选择适当的来源。

注意:

  • 如果您连接到不同的数据源,将出现一个导航窗口。导航到特定文件或数据库,选择您想要的表或查询,然后单击加载转换数据以打开 Power Query Editor。

精确查找

要使用 Power Query 进行精确查找,我们需要将准则和查找数据都放入表中。

例如,在图 8.1中,我们想要获取单元格 E2 中任何债务人的日期:

图 8.1: Power Query 精确匹配查找

以下是要遵循的步骤:

  1. 将包含准则的单元格转换为表。如图 8.2 所示,将表命名为准则:

    图 8.2: 创建一个准则表

  2. 将要查找的数据也转换为表,并将其命名为tblDebtors,如图 8.3 所示:

    图 8.3: 创建一个查找数据表

  3. 首先将准则表加载到 Power Query 中。要做到这一点,单击表中的任意位置 ► 转到"数据"选项卡 ► 单击"从表/范围获取"(参见图 8.4 ):

    图 8.4: 将准则表加载到 Power Query Editor

  4. 转到Power Query Editor,仅作为连接加载准则表,如图 8.5 所示:

    图 8.5: 仅作为连接加载准则表

  5. 按照第 3 步中概述的相同步骤加载 Power Query 中的数据表。现在,您应该在 Power Query Editor 中看到准则和查找表,如图 8.6 所示:

    图 8.6: Power Query Editor 中的准则和查找表

  6. 转到债务人表,并根据第一个债务人进行筛选,如图 8.7 所示:

    图 8.7: 在查找表上应用筛选器

  7. 通过右键单击值并展开,将准则表转换为值,如图 8.8 所示:

    图 8.8: 将准则表转换为值

  8. 用第 6 步中的准则值替换筛选值,如图 8.9 所示:

    图 8.9: 用准则值替换筛选值

  9. 由于我们想要返回日期值,我们应该选择并删除其他列,如图 8.10 所示:

    图 8.10: 用准则值替换筛选值

  10. 关闭并加载检索到的日期(参见图 8.11 ):

    图 8.11: 加载返回的数据

  11. 最后一步是将筛选后的客户/债务人的日期加载到现有工作表而不是连接(见图 8.12 ):

    图 8.12: 将数据加载到现有工作表

注意:

  • 要查找另一个客户/债务人的日期,只需替换名称。然后,转到"数据"选项卡。在查询和连接组中,单击"全部刷新"。

  • Power Query 存储并记住所有步骤,因此在标准发生变化时无需重复执行。

返回多个结果和多个列

现在,让我们假设我们有多个债务人的交易,并且希望返回所有交易和多个列,如图 8.13所示:

图 8.13: Power Query 返回多个项目和多个列

以下是要遵循的步骤:

您将按照前面概述的相同步骤进行操作,只是在第 9 步中有一个小变化。

在第 9 步中,我们删除不需要的列,这次我们只删除债务人的列,如图 8.14所示:

图 8.14: 允许返回多个列

前一节中的第 10 和第 11 步保持不变。

近似查找

与 Excel 不同,Power Query 没有可以进行近似查找的 VLOOKUP 或 XLOOKUP 函数。

在本节中,我们将学习使用近似查找来查找成绩的步骤,如图 8.15所示。请注意,您的成绩表需要按升序排序:

图 8.15: Power Query 近似匹配

以下是要遵循的步骤:

  1. 仅将成绩表(tblGrade)加载为连接,然后加载考试表(tblExams)。然后,按照前一节中概述的步骤 3-5 进行操作(见图 8.16 ):

    图 8.16: 为表命名并加载到 Power Query

  2. 单击考试表,转到"合并"选项卡,并追加查询为新的(见图 8.17 ):

    图 8.17: 在 Power Query 中追加查询

  3. 追加考试表(tblExams)和成绩表(tblGrade)(见图 8.18 ):

    图 8.18: 追加两个表

  4. 在追加的查询中,转到添加列选项卡并添加一个索引列。我们将在稍后使用此列对数据进行排序(见图 8.19 ):

    图 8.19: 为追加的查询添加索引列

  5. 将分数按升序排序(见图 8.20 ):

    图 8.20: 将分数按升序排序

  6. 单击成绩列,转到转换选项卡,然后在填充选项中点击"向下"(见图 8.21 ):

    图 8.21: 填充成绩

  7. 转到学生列并过滤掉空值。只需取消选中空值。

  8. 转到索引列并按升序排序。

  9. 高亮显示成绩表,然后转到主页选项卡,在删除列选项下,单击删除其他列。

  10. 单击附加的查询,转到主页选项卡,然后在关闭和加载选项下,单击关闭并加载到(见图 8.22 ):

    图 8.22: 从近似查找加载成绩

  11. 将成绩加载为一个表,放在考试表旁边(见图 8.23 ):

    图 8.23: 将成绩加载到考试表旁边

使用表连接查找

在 Power Query 中,学习的最重要的事情之一是不同形式的表连接。在这个例子中,我们将只使用两种连接:

  • 内连接: 结果中只包括两个表中值匹配的行。

  • 左反连接: 结果中只包括左侧(或第一个)表中的行。

在下面的示例中,见图 8.24 ,我���希望从tblCars中查找那些车辆已经服务过的客户(满意顾客)和那些车辆未服务过的客户(不满意顾客):

图 8.24: 使用表连接查找数据

以下是要遵循的步骤:

  1. 将汽车表(tblCars)和服务表(tblServiced)仅作为连接加载。按照先前提到的精确查找部分的步骤 3-5 进行操作。

  2. 单击汽车表,转到主页选项卡。在合并组下,选择合并查询,然后选择合并查询作为新查询(见图 8.25 ):

    图 8.25: 合并查询

  3. 在合并弹出表中,从第二个下拉菜单中选择tblServiced。然后从tblCars中选择Car Serviced列,从tblServiced表中选择Serviced Cars列。最后,从连接类型中选择内连接。这将只显示满意顾客的数据(见图 8.26 ):

    图 8.26: 内连接表合并

  4. 将查询重命名为满意顾客,选择客户列,然后单击删除其他列(见图 8.27 ):

    图 8.27: 重命名查询

  5. 重复前述步骤 1-3,创建一个新的合并查询。这次,不选择内连接,而是选择左反连接。这将只显示未服务车辆的不满意顾客的数据(见图 8.28 ):

    图 8.28: 左反连接表合并

  6. 将查询重命名为不满意顾客,选择客户列,然后单击删除其他列。

  7. 最后,将这两个新查询作为表加载到现有工作表中。

查找前 n 个或后 n 个项目

要动态查找前/后 n 个项目,我们将使用几乎与精确查找部分相同的步骤,只是稍作修改。

例如,图 8.29展示了如何查找前五名债权人:

图 8.29: 查找前五名债权人

下面是要遵循的步骤:

  1. 将前 5 名表(tblTop)仅作为连接加载,然后加载债权人表(tblCreditors)。按照前述精确查找部分的步���3-5 进行操作。

  2. 通过右键单击值并进行下钻,将tblTop表转换为值。请参考前面提到的精确查找部分的第 7 步。

  3. 点击债权人表,转到"主页 "选项卡,在"保留行"选项下,选择"保留前几行"。在弹出窗口中,输入 5 作为行数(参见图 8.30 ):

    图 8.30: 保留前五行

  4. 转到"查看 "选项卡,点击"高级编辑器 "(参见图 8.31 )。这一步的原因是将硬编码的五行替换为我们在tblTop表中的条件:

    图 8.31: 调用高级编辑器

  5. 在"tblTop"表中用我们的动态条件替换硬编码的 5(参见图 8.32 ):

    图 8.32: 用动态条件替换硬编码的条件

  6. 将筛选后的债权人加载为现有工作表中的表格。

  7. 为了测试动态筛选是否有效,请将前 5-7 行更改为其他数字,然后刷新查询。

注意*:要查找底部的 n 个项目,请按照前述步骤进行,但在第 3 步中选择"保留底部行"*

使用列表函数进行查找

Power Query 中有超过 45 个与列表相关的函数。让我们学习如何使用其中一些来查找数据。

我们将查找成绩和导师表,如图 8.33所示:

图 8.33: 使用列表函数的近似和精确函数

下面是要遵循的步骤:

  1. 将所有三个表仅作为连接加载。

  2. 选择班级表(tblClass),转到"添加列 "选项卡,点击"自定义列 "(参见图 8.34 ):

    图 8.34: 创建自定义列

  3. 将您的列重命名为Tutor,并按照图 8.35 所示编写函数:

    图 8.35: 使用 List.PositionOf 函数进行精确查找

tblTutor[Tutor]

{ List.PositionOf(tblTutor[Subject],[Subject]) }

函数的工作原理如下:

  • tblTutor[Tutor] ► 返回查找表tblTutor中所有导师的列表。在 Power Query 中,您可以使用方括号表示法([ColumnName])访问表的列**。**

  • 获取列后,我们需要使用位置索引运算符,即花括号({}),返回在tblclass中的主题与tblTutor中的主题匹配的行号

  • List.PositionOf(tblTutor[Subject],[Subject]) ► 为了动态返回每个科目的行,我们使用了函数 List.PositionOf。该函数用于在表的Subject列(tblTutor[Subject])中查找当前值([Subject])的位置。它返回值在列表中的位置(索引)。

  • 这个表达式的工作方式类似于我们在第三章,Index and Match 中学到的 INDEX 和 MATCH 组合函数。我们首先从tblTutor中查找列,然后在tblClass中匹配科目与tblTutor中的科目的行。

现在,让我们看看如何通过查找成绩来进行近似匹配。

下面是要遵循的步骤:

  1. 创建另一个自定义列并将其重命名为 grades。

  2. 按照图 8.36中显示的函数编写如下:

List.Last(

Table.SelectRows(Grades,(IT)=> IT[Marks]<=[Marks])[Grade])

图 8.36: 使用 Table.SelectRows 和 List.Last 进行近似查找

函数的工作原理如下:

  • Table.SelectRows(Grades, (IT)=> IT[Marks]<=[Marks]) ► 此函数根据条件过滤"Grades"表的行。第二个参数,(IT) => IT[Marks] <= [Marks],是一个内联函数(也称为 lambda 函数),指定了过滤条件。

    这里发生了什么:

    • (IT) 是代表内部表"Grades"的自定义变量,在"tblClass"表内我们将对其进行筛选。

    • IT[Marks] 指的是内部表"Marks"列中的值。

    • [Marks] 指的是"tblClass"每行中的成绩值。

因此,过滤条件检查"Grades"表的"Marks"列的值(IT[Marks])是否小于或等于"tblClass"中的"Marks"值,并返回那些 Marks 和相应 Grades 的表。

  • Table.SelectRows(Grades,(IT)=> IT[Marks]<=[Marks])[Grade]► 由于我们只对成绩感兴趣,我们使用字段列运算符( [] )来获取一个成绩列表。

  • 最后,我们使用List.Last函数查找列表中的最后一个成绩。

查找工作日与周末数据

要在 Power Query 中查找周末或工作日数据,我们使用Date.DayOfWeek函数。

例如,使用图 8.37中显示的数据,让我们看看如何查找我们在周末和工作日给信用的人。

图 8.37: 查找工作日和周末数据

下面是要遵循的步骤:

  1. 将表加���到 Power Query 中。

  2. 要查找工作日数据,转到"查看"选项卡,单击"高级编辑器",并编写以下函数:

    let

    Source = Excel.CurrentWorkbook(){[Name="tblCreditors"]}[Content],

    #"筛选行" =

    Table.SelectRows(

    Source, each Date.DayOfWeek([Date])>=1 and Date.DayOfWeek([Date])<6

    )

    in

    #"筛选行"

函数的工作原理如下:

  • let 子句用于定义一组命名步骤,每个步骤代表特定的转换或计算。

  • Source = Excel.CurrentWorkbook(){[Name="tblCreditors"]}[Content``] ► 将当前 Excel 工作簿中名为"tblCreditors"的表的内容分配给变量"Source"。

  • 使用 Table.SelectRows 函数定义一个新的"Filtered Rows"步骤,以根据涉及一周中某一天的特定条件过滤"Source"表的行。

  • Date.DayOfWeek([Date]) > 1 and Date.DayOfWeek([Date]) < 6 检查"Date"列的星期几是否大于或等于 1(星期一)且小于 6(星期五)。这有效地过滤掉对应于周末(星期六和星期日)的行。

  • in #"Filtered Rows"► in 关键字表示脚本的输出。此行指定脚本的结果,即"Filtered Rows"步骤生成的表。

注意

  • Date.DayOfWeek 函数返回一个数字(从 0 到 6),表示提供的日期是一周中的哪一天。

  • 将星期日视为一周的第一天。

  • 因此,要查找仅周末数据,请将先前提供的 Table.SelectRows 函数替换为以下函数,该函数仅返回 Date 的一周中的日期等于 0 或 1 的函数,即(星期日和星期六):

Table.SelectRows(Source, each Date.DayOfWeek([Date])=0 or Date.DayOfWeek([Date])=6)

查找不包括假期的日期

假设我们有以下收集的数据和假期日期,如 图 8.38 所示。让我们学习如何查找不包括假期的收集数据。

图 8.38: 查找不包括假期的日期

以下是要遵循的步骤:

  1. 仅将这两个表加载为连接。

  2. 转到查询和连接,右键单击已获取的表,然后单击 Merge(参见 图 8.39 ):

    图 8.39: 合并查询

  3. 在合并弹出窗口中,选择第二个下拉菜单中的假期表。然后,在已获取的表和假期中选择日期列。最后,选择左反连接以从已获取的表中排除假期(参见 图 8.40 ):

    图 8.40: 合并查询

  4. 最后,删除假期列并加载数据。

查找重复 N 次的项目

使用 图 8.41 中显示的数据,让我们学习如何从 Sports Sale 表中查找重复两次的项目。

请注意,我们希望一种解决方案,可以用任何数字替换 2,Power Query 将查找这些项目。

图 8.41: 查找重复 2 次的项目

以下是要遵循的步骤:

  1. 仅将这两个表加载为连接。

  2. RepeatN 表转换为值 ► 右键单击值并展开(参见 图 8.42 ):

    **图 8.42:**将表转换为值

  3. 转到SportSales表格,选择项目列。然后,转到"转换"选项卡,点击GroupBy。在操作下,选择CountRows,然后点击确定 (见图 8.43 ):

    **图 8.43:**按项目分组

  4. 转到新的计数列,并按 1 进行筛选(见图 8.44 ):

    **图 8.44:**按任意计数筛选

  5. 用我们的RepeatN值替换硬编码的筛选条件。转到查看选项卡,点击高级编辑器。删除硬编码的筛选条件(1),输入RepeatN (见图 8.45 ):

    **图 8.45:**按任意计数筛选

  6. 删除Count列并加载数据(见图 8.46 ):

    **图 8.46:**删除计数列并加载数据

仅返回月末日期项目

在上一章关于FILTER函数中,我们学习了如何查找发生在月末的交易。现在,让我们看看如何使用 Power Query 实现相同的功能。

使用图 8.47中显示的数据,仅返回每月末支付的债权人:

**图 8.47:**查找月末交易

以下是要遵循的步骤:

  1. 在 Power Query 中加载债权人表。

  2. 转到查看选项卡,点击高级编辑器。

  3. 按照图 8.48 中显示的方式编写函数:

    **图 8.48:**选择月末项目的 M 代码

    函数的工作原理如下:

    • let子句用于定义一组命名步骤,每个步骤代表特定的转换或计算。

    • Source = Excel.CurrentWorkbook(){[Name="Creditors"]}[Content] ►将当前 Excel 工作簿中名为"Creditors"的表的内容分配给变量"Source"。

    • 使用Table.SelectRows函数定义一个新的"筛选行"步骤,根据特定条件筛选"Source"表的行。

    • Date.Day([Paid Date])返回"支付日期"列的日期部分,而Date.DaysInMonth([Paid Date])返回一个从 28 到 31 的数字,表示该月的天数。

    • Date.Day([Paid Date]) = Date.DaysInMonth([Paid Date])检查支付日期的日期部分是否等于该月的总天数。如果相等,则表达式将返回 TRUE,表示支付日期是该月的最后一天。

    • Table.SelectRows函数仅返回前提条件为 TRUE 的行。

  4. 将筛选后的表加载到现有工作表中。

模糊查找

在 Power Query 中执行模糊匹配比使用函数更容易且更直观。

模糊匹配是指根据相似性比较非相同文本字符串的技术。模糊匹配评估字符串之间的相似度,而不是精确匹配,允许在数据集中识别相似或密切相关的术语。

例如,我们如何使用tblClean中的Lookup Company列查找tblDirty中的员工,如图 8.49所示:

图 8.49: 模糊查找

以下是要遵循的步骤:

  1. 仅将两个表作为连接加载。

  2. 单击tblDirty,然后单击合并。

  3. 选择tblClean,然后选择要匹配的列,如图 8.50所示。

  4. 单击使用模糊匹配执行合并并展开模糊匹配选项。这些选项允许您微调匹配过程。较低的相似性阈值降低了模糊匹配算法的严格性。

    图 8.50: 左外部模糊查找

  5. 展开合并表(见图 8.51 )并仅选择查找列。

    图 8.51: 展开合并表

  6. 删除脏列并将表加载出来。

结论

在本章中,我们学习了如何使用强大的数据转换和准备工具------Power Query 来解决不同的查找问题。在处理大数据集时,这是主要推荐的工具。

其中一个缺点是,创建 Power Query 查询和连接可能需要比使用简单的 Excel 公式更多的时间。正如我们所学到的,这涉及许多步骤。

另一个缺点是,与实时重新计算并在编辑电子表格时提供即时结果的公式不同,Power Query 要求您在数据更改时刷新查询。您可以设置查询在特定时间后刷新,但如果您有复杂的查询,这将是资源的浪费。

在下一章中,我们将学习如何在精通 Excel 中利用人工智能。

需要记住的要点

  • 如果您正在处理相对较小的数据集并且需要执行简单的查找,通常使用 Excel 公式设置和使用速度更快。但是,随着数据集大小和复杂性的增加或需要进行广泛的数据转换时,Power Query 将成为更高效和可扩展的选择。

  • 尽管涉及许多步骤,但 Power Query 提供了一个视觉、用户友好的界面,允许用户与数据转换进行交互。这些步骤比复杂的公式更直观。

  • 您可以创建可重复使用的 Power Query 查询,可应用于不同的数据集或在团队之间共享,确保数据准备和查找过程的一致性。

多项选择题

  1. Power Query 的主要目的是什么?

    1. 数据可视化

    2. 数据转换和准备

    3. 统计分析

    4. 数据备份和恢复

  2. 以下哪个不是您可以在 Power Query 中执行的步骤?

    1. 过滤行

    2. 创建数据透视表

    3. 合并表格

    4. 删除重复项

  3. 在 Excel 中哪个选项卡可以访问 Power Query?

    1. 数据

    2. 插入

    3. 格式

    4. 主页

  4. Power Query 中的哪个操作允许您基于共同列合并来自多个表的数据?

    1. 合并

    2. 连接

    3. 追加

    4. 按组

  5. 以下哪个是 Power Query 的有效数据源?

    1. 仅限 Excel 文件

    2. 仅限 CSV 文件

    3. Excel 文件,CSV 文件,数据库,Web 资源等等

    4. 仅限 Word 文档

  6. "模糊匹配"这个术语在 Power Query 中是什么意思?

    1. 匹配相同字符串

    2. 基于相似性匹配非相同文本

    3. 匹配区分大小写的文本

    4. 匹配数值

答案

  1. b

  2. b

  3. a

  4. a

  5. c

  6. b

第九章

ChatGPT:使用 ChatGPT 解决查找问题

介绍

在本章中,我们将讨论如何将人工智能(AI)融入到解决 Excel 中的查找问题中。

在我们了解外部人工智能之前,我们想要承认一些内置的 AI 功能,如 Flash Fill(使用模式识别)、Power Query 中的按列示例选项(也使用模式识别并编写可重用的 M 代码函数)、数据分析选项(创建图表和分析)、推荐图表(显示您可以从数据创建的各种图表)和推荐数据透视表(显示您可以从数据创建的各种数据透视表分析)。

ChatGPT 代表了由 OpenAI 领先的语言生成领域的尖端发展。它属于 GPT(生成式预训练变换器)模型系列。利用变换器架构,GPT 模型可以理解和生成类似人类语言的文本,借鉴它们所提供的输入。

在使用 ChatGPT 时最关键的技能是提示。提示是您提供的文本,用于开始聊天或要求模型给出特定回应。当您与 ChatGPT 交互时,您会以提示开始对话 ------ 一个问题,一个陈述,或任何传达您意图的文本。

您的提示的质量和具体性通常会影响您从 ChatGPT 收到的回应的实用性和相关性。提供清晰和详细的提示可以导致更准确和有用的答案。

结构

在本章中,我们将讨论以下五种更好地利用 ChatGPT 的方法:

  • 为获得最佳结果设置 ChatGPT

  • 掌握完美的 ChatGPT 提示

  • 提高 ChatGPT 提示的准确性

  • 高级 ChatGPT 使用技巧

  • 超越 ChatGPT

为获得最佳结果设置 ChatGPT

充分利用 ChatGPT 的第一步是创建自定义说明,这有助于避免在每个提示中重复偏好。

以下是要遵循的步骤:

  1. 要访问您的自定义说明设置,请单击您的个人资料,然后单击自定义说明,如图 9.1 所示:

    图 9.1: 访问自定义说明

  2. 告诉 ChatGPT 一些关于你自己的事情。这有助于 ChatGPT 给出更与你的工作/目标/兴趣相关的回应。例如,查看我的示例在图 9.2

    图 9.2: 为 ChatGPT 提供关于你自己的背景

  3. 下一步是告诉 ChatGPT 你希望它如何回应。回应是正式/随意的,长/短的,中立/主观的?例如,查看我的示例在图 9.3

    图 9.3: 为 ChatGPT 提供关于您希望回应的指示

  4. 保存并关闭,现在您可以开始提示。但在此之前,让我们学习如何创建说明。

注意

  • ChatGPT 以不时提供错误响应而闻名。作为该领域的新手,您可能不会立即注意到这些错误,但您可以通过要求包含置信水平和源 URL 来减少错误响应的可能性。

  • 通过可靠来源(URL)交叉参考来验证响应。

参见图 9.4,了解在 ChatGPT 中配置置信水平和 URL 设置。

图 9.4: 要求置信水平和事实 URL

掌握完美的 ChatGPT 提示

正如我们在介绍中学到的,您的提示的质量和具体性决定了响应的实用性和相关性。

现在让我们学习构成良好提示的四个基本要素,即任务、背景、示例和角色。

  1. 任务

    在您的提示中必须有一个任务。这通过以动作动词开始您的提示来表示。

    例如,"生成一个可以使用多个条件获取数据的 Excel 内置查找函数列表。"

    前述提示将列出所有查找函数以及如何使用它进行多条件查找的示例语法。

    前述提示的唯一问题是它只会提供 Excel 中的函数,而不会提供 Power Query,因为这是我们给定的上下文。那么,什么是上下文?

  2. 背景

    ChatGPT 可以提供无限量的信息,这可能不是您要寻找的。因此,您需要限制无尽的可能性。

    ChatGPT 限制可能性的一种方式是查看我们在上一节设置的自定义说明。

    此外,您需要指示环境作为一个限制因素。

    例如,如果您需要 Power Query 查找函数,则提示将是:"生成一个可以使用多个条件获取数据的 Power Query 查找函数列表。"

    环境可以缩小到特定函数。例如,"生成 Excel 中 FILTER 函数可以使用多个条件获取数据的方法列表。"

    另一种微调上下文的方法是告诉 ChatGPT 用户的背景。例如,"写出新手获取数据使用多个条件的最简单方法"。通过指示用户是新手,ChatGPT 将限制给出的响应。

  3. 示例

    这些只是 ChatGPT 可以了解所需响应更多信息的示例。在您的提示中包含示例显着提高了结果的准确性。

    例如,如果您希望公式包含加号(+)而不是 OR 函数(正如我们在第七章,FILTER:终极查找函数 中学到的FILTER函数),那么提示将是"使用加号而不是 OR 函数编写多条件INDEX/MATCH函数。"

  4. 角色

    这是您希望 AI 在执行任务时成为的人物。想想一个在线可访问且 ChatGPT 可以轻松访问的著名人物。人物角色为 ChatGPT 提供了在回应提示时所需的写作风格、领域和专业水平。

    例如,在 Excel 中,人物角色可以是著名的微软 MVP(最有价值的专业人士)。

    这是一个包含人物角色的提示示例:

    编写一个 Power Query 近似查找函数。将其编写为著名的 Excel 专家 Bill Jellen,又名"Mr. Excel",或 Mike Girvin,又名"Excel is Fun"。

    图 9.5所示,ChatGPT 将确保响应与提供的人物角色的写作风格相关且一致。

    图 9.5: 为 ChatGPT 提供人物角色

注意

  • 在您的提示中有一个任务是强制性的。

  • 包含相关背景和示例是重要的。

  • 拥有一个人物角色是有益的

提高 ChatGPT 提示的准确性

正如我们在前一节关于设置 ChatGPT 时学到的,准确性并不保证,这往往会让无法排除响应问题的新手感到沮丧。

除了在响应中请求置信度水平和 URL 之外,让我们探讨四种增加准确性的方法:

  1. 自我批评

    要求 ChatGPT 批评自己并优化其响应以提高准确性。

    例如,在掌握提示的前一节中,我们要求使用 Bill Jellen 或 Mike Girvin 的风格编写近���查找 M 代码。假设我们对 M 代码还不熟悉,我们希望 ChatGPT 在我们使用代码之前帮助我们解决问题。

    这是一个我们可以询问的后续自我批评问题,如图 9.6所示:

    图 9.6: 提出后续自我批评问题

  2. 简洁明了

    强制 ChatGPT 修改响应并将其限制在特定步骤或单词可以帮助提高其响应准确性。

    在继续研究用于近似查找的 M 代码功能时,我们可以进一步询问减少到三个步骤的步骤,如图 9.7所示:

    图 9.7: 限制响应的步骤或单词

    注意: 给 ChatGPT 的约束越多,通常响应就会更有创意。尝试每次添加一个约束,并测试你的功能,看看哪个会优化速度和准确性。

  3. 要求 ChatGPT 自我提示

    让 ChatGPT 发自内心地提示是让其发挥最佳作用的一种方式。这确保了它优化其提示并产生更丰富的响应。

    例如,ChatGPT 如何帮助您掌握 Excel 中的查找功能?(见图 9.8):

    图 9.8: ChatGPT 中的自我提示

    注意: 无论您是学生还是培训师,上述自我提示和后续问题都可以帮助您为掌握 Excel 中的任何概念制定有效的策略。

  4. 了解 ChatGPT 的局限性

    了解当前的弱点及其解决方法将极大地提高您的回应准确性。

这里列出了一些限制:

  • 了解 ChatGPT 可访问版本的知识基于其截至 2021 年 9 月最后更新的训练数据。它可能无法访问实时数据或最新事件。

  • 尽管 ChatGPT 已经接受了多样化主题的训练,但它可能不像某个特定领域的专家那样专业。其回应应该通过领域特定的来源进行验证以确保准确性。

  • ChatGPT 遭受"AI 幻觉"的困扰,即生成听起来正确但事实上错误或有偏见的答案的倾向。

  • 免费版本仅限于文本。它无法查看、解释或分析图像、图表或非文本数据。

高级 ChatGPT 使用的技巧和窍门

正如我们在本章中迄今所学到的------提示是您需要培养的终极技能,以最大限度地利用 ChatGPT。

以下是一些提升技能的有用方法:

  1. 每天设定一个学习提示的时间段。从这个免费网站开始:learnprompting.org/docs/intro

  2. 经常开始应用提示。这可以通过识别频繁的手动任务,然后创建和优化提示以自动化它来完成。例如,如果您每天需要 consololidate data from multiple worksheets,创建一个提示,它将为您生成一个 M 代码,以自动化这个过程。

  3. 创建一个有价值的提示数据库,您可以创建或在线找到。根据它们将帮助解决的问题而不是函数来组织提示,以便轻松访问和使用。例如,将提示存储在"如何在查找中返回多个项目"标题下,而不是"INDEX/MATCH 提示"下。

  4. 设定一个每日阅读时间,ChatGPT 正在解决真实案例。请参见以下链接中的示例:

    blog.enterprisedna.co/chat-gpt-for-excel-a-beginners-guide-with-examples/

  5. 加入一个新闻简报,以便及时了解人工智能领域的最新发展。Big Brains Newsletter 是一个推荐的选择。欲了解更多信息,请访问以下链接:

    www.bigbraindaily.com/

超越 ChatGPT

除了 ChatGPT 之外,还值得一提的是一些 AI 工具以及它们为什么是更好的替代品,如下所示:

  1. Bing Chat (www.bing.com/search?q=Bing+AI&showconv=1)

    与 ChatGPT 3.5 的免费版本不同,Bing Chat 的可访问版本提供了一种上传数据截图并要求 AI 分析的方法。

    通过上传的图片,您可以指向 AI 您的数据单元引用以及您希望返回结果的位置。

    图 9.9: 在 Bing 中上传数据截图

  2. AI Excel 机器人 (aiexcelbot.com/?anchor=features)

    这是一个带有 Excel 工作簿插件的免费服务。

  3. 公式机器人 (formulabot.com/)

    优势在于它具有插件,并且可以上传工作簿以进行更快的分析。它目前的局限性在于它只能���行 Python 代码而不能执行 Excel 函数。

  4. 在 Excel 中安装 AI 插件。

    对于我们的情况,我们将安装 AI 辅助公式编辑器。以下是步骤:

    • 转到插入选项卡,然后点击获取插件

    • 搜索AI 辅助公式编辑器,然后点击添加

      图 9.10: 添加 AI 辅助公式编辑器

    • 使用您的 Gmail 登录,您就可以开始使用它了。

    • 您可以升级到高级订阅或使用有限的免费版本来生成公式或解释公式。

结论

在本章中,我们探讨了将人工智能,特别是 ChatGPT,整合到 Excel 中以解决查找挑战的方法。了解提示的微妙之处并有效利用 ChatGPT 对于准确和定制的响应至关重要。

本章向我们介绍了 ChatGPT 的能力,强调了精确提示的重要性以产生准确的响应。内置 AI 功能如 Flash Fill 和 Power Query 选项的值得一提,为我们的探索提供了上下文背景。

与 ChatGPT 的旅程并没有结束;这只是一个开始。读者被邀请在 Excel 论坛中分享他们的经验或提出问题。让这成为一个双向对话。请专家分享他们如何将 ChatGPT 应用于 Excel 任务以及他们面临的挑战。他们的见解可以丰富您的学习以及社区中其他人的学习。提出问题,分享您的成功,让我们互相学习。

最后,鼓励读者踏上他们的学习之旅。他们可以探索权威的在线资源,加入论坛,或参加教程会话。ChatGPT 和 Excel 的世界充满活力,不断发展。通过寻求这些页面之外的知识,您可以赋予自己在人工智能驱动的数据解决方案不断变化的领域中航行的能力。

需要记住的要点

  • 清晰明确的提示:使用动作动词和详细说明所需结果,精心制作明确的提示。您的查询的清晰度确保 ChatGPT 提供准确和相关的响应。

  • 提供上下文:清晰地定义您 Excel 分析的上下文,指定数据类型和任务范围。上下文信息有助于 ChatGPT 根据您特定的数据需求调整其响应。

  • 参与对话:将 ChatGPT 视为合作伙伴。如果初始响应不准确,请提出后续问题并寻求澄清。迭代对话将引导 ChatGPT 朝着您寻找的精确解决方案前进。

  • 验证和学习:始终通过与可靠来源交叉参考和在 Excel 中进行额外分析来验证 ChatGPT 的回应。人类监督对于准确性至关重要。将 ChatGPT 的建议视为自己探索和学习的起点。

多项选择题

  1. 在使用 ChatGPT 进行 Excel 任务时,清晰和具体的提示的重要性是什么?

    1. 清晰的提示增强了 ChatGPT 的词汇量

    2. 具体的提示确保准确和相关的回应

    3. 清晰的提示对于 ChatGPT 在离线状态下运行至关重要

    4. 仅对复杂的 Excel 任务需要具体的提示

  2. 为什么在与 ChatGPT 互动进行 Excel 分析时提供上下文至关重要?

    1. 上下文增强了 ChatGPT 的通识知识

    2. 上下文信息帮助 ChatGPT 量身定制回应以满足特定数据需求

    3. 提供上下文可以提高 ChatGPT 的处理速度

    4. 在 Excel 任务中使用 ChatGPT 时上下文是无关紧要的

  3. 如果 ChatGPT 的回应不完全符合您的需求,您应该如何处理?

    1. 忽略回应并重新表述同一问题

    2. 将 ChatGPT 的回应视为最终答案

    3. 参与对话,提出后续问题,并寻求澄清

    4. 终止对话并开始新对话

  4. 在与 ChatGPT 进行 Excel 数据分析互动中,人类监督扮演什么角色?

    1. 人类监督是不必要的;ChatGPT 总是准确的

    2. 人类监督确保 ChatGPT 的道德行为

    3. 人类监督对于验证 ChatGPT 的回应并确保准确性至关重要

    4. 人类监督仅适用于初学者,而不适用于有经验的用户

  5. 以下哪项最好描述了在 Excel 任务中 ChatGPT 与用户之间的关系?

    1. ChatGPT 是一个独立的解决方案,不需要用户输入

    2. 应接受 ChatGPT 的回应而无需验证

    3. ChatGPT 和用户进行合作伙伴关系,用户提供清晰提示和监督

    4. ChatGPT 可以独立处理 Excel 任务;用户输入是可选的

答案

  1. b

  2. b

  3. c

  4. c

  5. c

相关推荐
封步宇AIGC16 分钟前
量化交易系统开发-实时行情自动化交易-Okex K线数据
人工智能·python·机器学习·数据挖掘
封步宇AIGC19 分钟前
量化交易系统开发-实时行情自动化交易-Okex交易数据
人工智能·python·机器学习·数据挖掘
z千鑫21 分钟前
【人工智能】利用大语言模型(LLM)实现机器学习模型选择与实验的自动化
人工智能·gpt·机器学习·语言模型·自然语言处理·自动化·codemoss
shelly聊AI23 分钟前
AI赋能财务管理,AI技术助力企业自动化处理财务数据
人工智能·财务管理
波点兔23 分钟前
【部署glm4】属性找不到、参数错误问题解决(思路:修改模型包版本)
人工智能·python·机器学习·本地部署大模型·chatglm4
佚明zj1 小时前
全卷积和全连接
人工智能·深度学习
qzhqbb4 小时前
基于统计方法的语言模型
人工智能·语言模型·easyui
冷眼看人间恩怨4 小时前
【话题讨论】AI大模型重塑软件开发:定义、应用、优势与挑战
人工智能·ai编程·软件开发
2401_883041084 小时前
新锐品牌电商代运营公司都有哪些?
大数据·人工智能
AI极客菌5 小时前
Controlnet作者新作IC-light V2:基于FLUX训练,支持处理风格化图像,细节远高于SD1.5。
人工智能·计算机视觉·ai作画·stable diffusion·aigc·flux·人工智能作画