穆罕默德在工作表中有一长串公司名称。每个公司的名称都以某种方式删除了所有空格,因此(例如)它们显示为“ AstroPhysics”而不是“ Astro Physics”。穆罕默德(Muhammad)需要一种处理所有公司名称的方法,以便在大写字母出现的任何位置之间插入一个空格,但单元格中的第一个字母除外。他想知道是否有简单的方法可以做到这一点。

您可以通过几种方法添加空格。在使用不可避免的基于宏的解决方案之前,您可能需要检查公司名称。名称中的每个单词之间可能只是一个非打印字符,而不是空格。您可以通过编辑单元格,将插入点定位在大写字母之前几个字符,然后按几次向右箭头来确定。每按一次,您应该看到插入点向右移动一个空格;如果似乎“犹豫”了该空间应在的位置,则那里是一个非打印字符。

在这种情况下,最好的解决方案是执行“查找和替换”操作,以将非打印字符替换为实际空间。 (您可以选择非打印字符-按住Shift键,同时按向右箭头,然后复制该字符。然后将其粘贴到“查找内容”框中以进行搜索。)

||假设数据中没有任何非打印字符,您也可以尝试使用非宏方法。也许最简单的方法是添加一两个助手列。在第一个中,您可以输入公式来找出公司名称中第二个大写字母的位置。假设公司名称位于单元格A1中,则应将以下公式作为数组公式输入:

=SMALL(FIND(0,SUBSTITUTE(A1,CHAR(ROW(INDIRECT("65:90"))),0)&0),2)

如果将此公式输入到单元格B1中,则可以使用以下命令在原始公司名称中插入空格:

=LEFT(A1,B1-1)&" " & RIGHT(A1,(LEN(A1)-B1)+1)

但是,此方法有一个很大的缺点:假定原始数据遵循非常严格的格式。它与以大写字母开头且只需要插入一个空格的公司名称配合使用非常好。如果名称不适合这些参数,则它将无法按预期工作。

当然,如果使用宏插入空格,则可以克服这些问题。以下是查看单元格中每个字符的简单方法。如果字符是大写字母,则在字符之前插入一个空格。完成宏后,字符串将被填充回单元格中。

Function Add_Spaces(ByVal sText As String) As String    Dim CharNum As Long    Dim FixedText As String    Dim CharCode As Long

FixedText = Left(sText, 1)



For CharNum = 2 To Len(sText)

CharCode = Asc(Mid(sText, CharNum, 1))

If CharCode >= 65 And CharCode <= 90 Then          FixedText = FixedText & " " & Mid(sText, CharNum, 1)

Else          FixedText = FixedText & Mid(sText, CharNum, 1)

End If    Next CharNum

Add_Spaces = FixedText End Function

使用宏很简单;如果公司名称在单元格A1中,则使用以下内容:

=Add_Spaces(A1)

更加紧凑的方法是依靠正则表达式来找到大写字母并插入一个空格,如下所示:

Function SplitCaps(str As String) As String     Dim objRegex As Object     Set objRegex = CreateObject("vbscript.regexp")



With objRegex         .Global = True         .Pattern = "([a-z])([A-Z])"

SplitCaps = .Replace(str, "$1 $2")

End With End Function

这种特殊的宏技术要求您启用正则表达式。您可以通过选择工具|在VB编辑器中执行此操作。引用,然后滚动浏览可用的引用,以找到Microsoft VBScript Regular Expressions 5.5选项。确保选中引用左侧的复选框,然后单击“确定”。然后,可以像使用Add_Spaces函数一样从Excel中使用SplitCaps函数。

当然,任何方法的适当性在很大程度上将取决于您使用的数据的特征。如果您的原始公司名称包含多个连续的大写字母(例如“ ABCCorp。”),那么最终将在输出中添加太多空格,例如“ ABCCorp”。成为“ A B C Corp.”而不是“ ABC Corp.”。另外,非字母字符可能会在作品中使用扳手,例如“ H&M”

变为“ H&M”或保留为“ H&M”(取决于您使用的宏方法)。

为了克服某些奇怪的公司名称,您可以尝试使用另一种宏方法来检查是否存在多个连续的大写字母,并相应地调整输出。

Sub AddSpaces()

Dim i As Integer     Dim j As Integer     Dim PriorCap As Boolean     Dim temp As String

j = 1

Do While Cells(j, 2) <> ""

Cells(j, 3) = ""

PriorCap = True         For i = 1 To Len(Cells(j, 2))

Select Case Mid(Cells(j, 2), i, 1)

Case "A" To "Z", "-"

If PriorCap = False Then                         Cells(j, 3) = Cells(j, 3) & " " & _                           Mid(Cells(j, 2), i, 1)

Else                         Cells(j, 3) = Cells(j, 3) & _                           Mid(Cells(j, 2), i, 1)

End If                     PriorCap = True                 Case Else                     Cells(j, 3) = Cells(j, 3) & _                       Mid(Cells(j, 2), i, 1)

PriorCap = False             End Select         Next i         j = j + 1     Loop End Sub

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

链接:/ excelribbon-ExcelTipsMacros [点击此处在新的浏览器标签中打开该特殊页面]。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(12810)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。