按条件绑定文本

我已经写过有关如何快速将多个单元格中的文本粘合到一个单元格中的文章,相反,将长文本字符串解析为组件。 现在让我们看一个接近但稍微复杂一点的任务——如何在满足某个特定条件时从多个单元格中粘贴文本。 

假设我们有一个客户数据库,其中一个公司名称可以对应其员工的几封不同的电子邮件。 我们的任务是按公司名称收集所有地址并将它们连接起来(用逗号或分号分隔),以便为客户制作例如邮件列表,即获得类似以下的输出:

按条件绑定文本

换句话说,我们需要一个工具来根据条件粘合(链接)文本——函数的类似物 苏梅斯利 (苏米夫),但对于文本。

方法0.公式

不是很优雅,但最简单的方法。 您可以编写一个简单的公式来检查下一行中的公司是否与上一行不同。 如果没有区别,则粘贴下一个以逗号分隔的地址。 如果它不同,那么我们“重置”累积的,重新开始:

按条件绑定文本

这种方法的缺点很明显:从获得的附加列的所有单元格中,我们只需要每个公司的最后一个单元格(黄色)。 如果列表很大,那么为了快速选择它们,您必须使用该功能添加另一列 DLSTR (伦),检查累积字符串的长度:

按条件绑定文本

现在您可以过滤掉那些并复制必要的地址粘贴以供进一步使用。

方法一、一条件上胶的宏功能

如果原始列表未按公司排序,则上述简单公式不起作用,但您可以在 VBA 中使用一个小的自定义函数轻松解决。 按键盘快捷键打开 Visual Basic 编辑器 Alt + F11键 或使用按钮 Visual Basic中 标签 开发人员 (开发商). 在打开的窗口中,通过菜单插入一个新的空模块 插入 - 模块 并在那里复制我们函数的文本:

Function MergeIf(TextRange As Range, SearchRange As Range, Condition As String) Dim Delimeter As String, i As Long Delimeter = ", " 粘合彼此不相等 - 我们以错误退出 If SearchRange.Count <> TextRange.Count Then MergeIf = CVErr(xlErrRef) Exit Function End If '遍历所有单元格,检查条件并将文本收集到变量 OutText For i = 1 To SearchRange 中。 Cells.Count If SearchRange.Cells(i) Like Condition Then OutText = OutText & TextRange.Cells(i) & Delimeter Next i '显示没有最后一个分隔符的结果 MergeIf = Left(OutText, Len(OutText) - Len(Delimeter)) End功能  

如果您现在返回 Microsoft Excel,则在函数列表中(按钮 fx 在编辑栏或选项卡中 公式 - 插入函数) 将有可能找到我们的函数 合并如果 在类别中 用户自定义 (用户自定义). 该函数的参数如下:

按条件绑定文本

方法 2. 通过不精确的条件连接文本

如果我们替换宏第 13 行的第一个字符 = 到近似匹配运算符 喜欢,则可以通过初始数据与选择标准的不精确匹配来执行粘合。 例如,如果公司名称可以写成不同的变体,那么我们可以用一个函数来检查和收集它们:

按条件绑定文本

支持标准通配符:

  • 星号 (*) – 表示任意数量的任意字符(包括它们的缺失)
  • 问号 (?) – 代表任何单个字符
  • 井号 (#) – 代表任何一位数字 (0-9)

默认情况下,Like 运算符区分大小写,例如,将“Orion”和“orion”理解为不同的公司。 要忽略大小写,您可以在 Visual Basic 编辑器中的模块开头添加该行 选项比较文本,这将切换 Like 不区分大小写。

通过这种方式,您可以编写非常复杂的掩码来检查条件,例如:

  • ?1##??777RUS – 选择 777 地区的所有车牌,从 1 开始
  • LLC* – 名称以 LLC 开头的所有公司
  • ##7## – 所有带有五位数字代码的产品,其中第三位是 7
  • ??? – 所有五个字母的名称,等等。

方法三、两种情况下粘贴文字的宏功能

在工作中,当您需要将文本链接到多个条件时,可能会出现问题。 例如,假设在我们之前的表格中,添加了一个带有城市的列,并且不仅应该对给定的公司进行粘合,还应该对给定的城市进行粘合。 在这种情况下,我们的函数必须通过添加另一个范围检查来稍微现代化:

Function MergeIfs(TextRange As Range, SearchRange1 As Range, Condition1 As String, SearchRange2 As Range, Condition2 As String) Dim Delimeter As String, i As Long Delimeter = ", " '分隔符(可以用空格或;等代替) e.) '如果验证和粘合范围彼此不相等,则退出并出错 If SearchRange1.Count <> TextRange.Count Or SearchRange2.Count <> TextRange.Count Then MergeIfs = CVErr(xlErrRef) Exit Function End If '遍历所有单元格,检查所有条件并将文本收集到变量 OutText For i = 1 To SearchRange1.Cells.Count If SearchRange1.Cells(i) = Condition1 And SearchRange2.Cells(i) = Condition2 Then OutText = OutText & TextRange.Cells(i) & Delimeter End If Next i '显示没有最后分隔符的结果 MergeIfs = Left(OutText, Len(OutText) - Len(Delimeter)) End Function  

它将以完全相同的方式应用——现在只需要指定更多参数:

按条件绑定文本

方法 4. Power Query 中的分组和粘合

如果您使用免费的 Power Query 加载项,则无需在 VBA 中编程即可解决问题。 对于 Excel 2010-2013,可以在此处下载,在 Excel 2016 中,它已默认内置。 动作顺序如下:

Power Query 不知道如何使用常规表,因此第一步是将我们的表变成“智能”表。 为此,选择它并按下组合 按Ctrl+T 或从选项卡中选择 主页 – 格式为表格 (首页——表格格式). 在随后出现的选项卡上 构造函数 (设计) 你可以设置表名(我离开了标准 表1):

按条件绑定文本

现在让我们将表加载到 Power Query 加载项中。 为此,在选项卡上 时间 (如果您有 Excel 2016)或在 Power Query 选项卡上(如果您有 Excel 2010-2013)单击 从表 (数据——来自表):

按条件绑定文本

在打开的查询编辑器窗口中,通过单击标题选择列 公司 然后按上面的按钮 团队 (通过...分组). 在分组中输入新列的名称和操作类型—— 所有线路 (所有行):

按条件绑定文本

单击确定,我们将获得每个公司的分组值的迷你表。 如果您左键单击结果列中单元格的白色背景(而不是文本!),则表格的内容清晰可见:

按条件绑定文本

现在让我们再添加一列,使用该函数,我们将每个迷你表中的地址列的内容粘合起来,用逗号分隔。 为此,在选项卡上 添加栏 我们按 自定义列 (添加列 - 自定义列) 并在出现的窗口中,输入新列的名称和Power Query内置的M语言的耦合公式:

按条件绑定文本

请注意,所有 M 函数都区分大小写(与 Excel 不同)。 点击后 OK 我们得到一个带有胶合地址的新列:

按条件绑定文本

它仍然删除已经不必要的列 表地址 (右击标题) 删除列) 并通过单击选项卡将结果上传到工作表 主页 — 关闭并下载 (首页 - 关闭并加载):

按条件绑定文本

重要的细微差别:与以前的方法(函数)不同,Power Query 中的表不会自动更新。 如果将来源数据有任何变化,那么您需要右键单击结果表中的任意位置并选择命令 更新并保存 (刷新).

  • 如何将长文本字符串分成几部分
  • 将不同单元格中的文本粘合到一个单元格中的几种方法
  • 使用 Like 运算符针对掩码测试文本

发表评论