将句子拆分为单元格(Microsoft Excel)
Pieter在A列中有很多包含文本的单元格。具体来说,单元格包含几个文本句子。他想将句子拆分成单个单元。他知道他可以使用“文本转列”工具,但这并不完全有用,因为句子可以以不同的标点符号结尾,而某些标点符号可以在句子中间使用。 (例如,在先生或女士这样的头衔之后的一段时期),Pieter怀疑是否有更好的方法将句子拆分为不同的单元格。
要手动完成此任务,可以采用两种方法。
首先,您可以使用帮助程序列来处理数据。例如,您可以将此公式放入单元格B1中:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"Mr.", "Mr#"), "Mrs.", "Mrs#"), "Ms.", "Ms#")
然后,将公式复制到需要许多单元格的地方。您最终得到的是用唯一的字符序列(Mr#,Mrs#和Ms#)代替您的常用标题(先生,夫人和女士)。将B列的结果作为值复制回B列(因此将删除公式),然后使用“文本到B列上的列”。最后,使用“查找和替换”将#字符的所有实例更改为一个句点。
这样做的缺点是,公式仅说明了该期间的三种常见用途,您实际上可能需要处理更多这种用途。例如,您的句子可能具有诸如Dr.之类的标题或诸如Ph.D之类的凭据指示器。或Esq。这种满载时间的缩写的列表可能会很长。在这些情况下,您可以通过以下方式手动进行更改:
。使用“查找并替换”来查找文本中的所有句点,用标记字符(上述技术中的#)替换非句子结尾的句点。
。使用“文本到列”工具将句子分开。
。使用“查找并替换”将标记字符的所有实例改回到句点。
同样,如果您有很多非句子结束期,则此过程可能需要一段时间才能完成。
当然,这些方法处理实际上是一个复杂的主题。
真正的问题是如何定义一个句子?在英语中,只有三个标点符号可以终止一个句子,即句点,感叹号和问号。但是,这有一些变体和例外。例如,一个句子可以以引号结尾,但是该引号将始终在其前面带有三个终止标点符号之一。此外,如前所述,可以使用句点标记缩写。
如果您开始使用“查找并替换”来处理所有这些标点符号和异常,那么您很快就会遇到一系列复杂的步骤。最好尝试使用宏进行拆分。这是可以正确处理大多数句子和缩写的一种:
Sub SplitSentences() Dim c As Range Dim sException(8) As String Dim sReplacement(8) As String Dim sTerm(6) As String Dim sTemp As String Dim J As Integer Dim sExp As Variant ' These are the valid ways for a sentence to end sTerm(1) = ". " sTerm(2) = "! " sTerm(3) = "? " sTerm(4) = "." & Chr(34) sTerm(5) = "!" & Chr(34) sTerm(6) = "?" & Chr(34) ' These are the exceptions to the rule ' of a period ending a sentence sException(1) = "Mr." sException(2) = "Mrs." sException(3) = "Ms." sException(4) = "Dr." sException(5) = "Esq." sException(6) = "Ph.D." sException(7) = "a.m." sException(8) = "p.m." ' Set up the replacements for the exceptions For J = 1 To 8 sReplacement(J) = Replace(sException(J), ".", "[{}]") Next J For Each c In Selection sTemp = c.Value ' Convert all the exceptions For J = 1 To 8 sTemp = Replace(sTemp, sException(J), sReplacement(J)) Next J ' Demarcate sentences with a tab For J = 1 To 6 sTemp = Replace(sTemp, sTerm(J), Trim(sTerm(J)) & Chr(9)) Next J ' Split sentences into an array sExp = Split(sTemp, Chr(9)) For J = 0 To UBound(sExp) ' Replace the code for valid periods sExp(J) = Replace(sExp(J), "[{}]", ".") ' Place sentences into adjacent cells on row c.Offset(0, J).Value = Trim(sExp(J)) Next J Next c End Sub
请注意,可接受的语句终止在sTerm数组中记录,可接受的缩写在sException数组中。如果您的文本可能还有其他缩写,那么您将需要扩展sException数组以包括这些缩写。
宏会逐步遍历您选择的所有单元格,并替换所有可接受的异常。然后,它将所有可接受的句子终止词替换为该终止词,然后是制表符。
然后,根据制表符的位置将句子分开。最后,它恢复缩写中的所有有效句点,并将句子放在同一行中的相邻单元格上。
请注意,宏将替换所选单元格中的所有内容,但是在选择右侧需要许多单元格才能存储句子。因此,您可能需要确保在选择一系列单元格并运行宏之前保存原始工作表。
最后,您可能要注意宏不是完美的。从语法学家的观点来看,缩写一个句子是完全可以接受的。发生这种情况时,适当的标点符号指示缩写的最后一个句段也用作句子的终止句段,就像下面两个短句一样:
Sheila earned her Ph.D. She was very happy.
现在,考虑以下单个句子:
Sheila earned her Ph.D. from an Ivy League school.
当比较两个示例(两个句子与单个句子)时,无法通过编程的方式来区分博士。结束一个句子或它是否出现在句子中间,而无需检查后面的单词是否以大写字母或引号引起来。这很快就会变得很复杂。另外,这适用于所有缩写,而不仅限于博士学位。上面提到的宏并没有尝试预期和处理所有此类出现,而是什至没有尝试辨别缩写是否结束了句子,它只是将所有缩写视为出现在句子中间。
_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。
本技巧(12549)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。