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。