在彩色文本后添加空格

时间:2015-06-08 20:25:07

标签: excel excel-vba excel-2013 vba

我正在使用Microsoft Excel 2013。

我需要在单个单元格中的Excel中分离大量数据。 "文本到列"功能很好,除了一个障碍。

在单个单元格中,我有First NameLast Name& Email address。姓氏和电子邮件地址之间没有空格,但名称的颜色与电子邮件不同。

示例(所有大写字母代表彩色名称RGB(1,91,167),小写字母是仅标准黑色文本的电子邮件):

JOHN DOEjohndoe@acmerockets.com

所以我需要在DOE之后放一个空格,使其显示为:

JOHN DOE johndoe@acmerockets.com

我有大约20k行要经过,所以任何提示都会受到赞赏。我只需要在姓氏和电子邮件之间留一个空格或者其他东西,这样我就可以使用" Text to Columns"功能并将它们分开。

2 个答案:

答案 0 :(得分:0)

不是一个完整的答案,但我会这样做:

第1步以摆脱格式化:

  • 将您拥有的所有文字复制到记事本
  • 然后将文本从记事本复制粘贴到excel作为文本

我认为这应该删除所有格式问题

第2步是使用VBA抓取电子邮件。我假设您将所有电子邮件都设为小写。因此,这样的事情应该成功(link link2):

([a-z0-9\-_+]*@([a-z0-9\-_+].)?[a-z0-9\-_+].[a-z0-9]{2,6})

第3步是从主文本中排除从Step2中提取的电子邮件。通过简单的Excel函数来完成这样的事情:

=TRIM(SUBSTITUTE(FULLTEXT,EMAIL,""))

由于您删除了Step1中的所有格式,因此可以在完成后将其应用回来

答案 1 :(得分:0)

你可以很快地利用Font如何为一组不具有相同颜色的字符返回Color来解决这个问题:它返回Null!知道了这一点,你可以一次遍历字符2并找到它抛出的第一个位置Null。您现在知道颜色偏移在那里并且可以使用Mid吐出碎片。

代码使用此行为,IsNull遍历固定的Range。定义Range然而你想要获取单元格。默认情况下,它会使用Offset将它们分散到相邻的两列中。

Sub FindChangeInColor()

    Dim rng_cell As Range
    Dim i As Integer

    For Each rng_cell In Range("B2:B4")
        For i = 1 To Len(rng_cell.Text) - 1
            If IsNull(rng_cell.Characters(i, 2).Font.Color) Then
                rng_cell.Offset(0, 1) = Mid(rng_cell, 1, i)
                rng_cell.Offset(0, 2) = Mid(rng_cell, i + 1)
            End If
        Next
    Next
End Sub

范围和结果的图片

ranges and results

这种方法的好处是所涉及的实际颜色并不重要。您也不必手动搜索开关,尽管这将是下一步。

如果没有找到颜色变化,你的相邻单元格也将是空白的,因此它对于不良输入非常强大。

修改会增加更改原始字符串的功能:

Sub FindChangeInColorAndAddChar()

    Dim rng_cell As Range
    Dim i As Integer

    For Each rng_cell In Range("B2:B4")
        For i = 1 To Len(rng_cell.Text) - 1
            If IsNull(rng_cell.Characters(i, 2).Font.Color) Then
                rng_cell = Mid(rng_cell, 1, i) & "|" & Mid(rng_cell, i + 1)
            End If
        Next
    Next
End Sub

结果图片再次使用与上面相同的输入。

edit results