【问题标题】:Add a space after colored text在彩色文本后添加一个空格
【发布时间】:2015-06-08 20:25:06
【问题描述】:

我正在使用 Microsoft Excel 2013。

我有很多数据需要在 Excel 中分开,这些数据位于单个单元格中。 “文本到列”功能效果很好,除了一个障碍。

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

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

JOHN DOEjohndoe@acmerockets.com

所以我需要在 DOE 之后放置一个空格,以便它显示:

JOHN DOE johndoe@acmerockets.com

我有大约 20k 行要查看,因此我们将不胜感激。我只需要在姓氏和电子邮件之间留一个空格或其他东西,这样我就可以使用“文本到列”功能并将它们分开。

【问题讨论】:

    标签: excel excel-2013 vba


    【解决方案1】:

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

    第 1 步摆脱格式:

    • 将所有文本复制到记事本中
    • 然后将文本从记事本复制粘贴到 Excel 文本中

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

    第 2 步 是使用 VBA 抓取电子邮件。我假设你所有的电子邮件都是小写的。因此,这样的事情应该可以解决问题(linklink2):

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

    第 3 步 是从正文中排除您从第 2 步提取的电子邮件。像这样通过简单的 Excel 函数:

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

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

    【讨论】:

    • 感谢您的评论。唯一将名称与电子邮件区分开来的是文本颜色。在我的示例中,我只使用了大写和小写来区分颜色。所以大多数名字看起来像这样:“John Doejohndoe@acmerockets.com”。我也尝试了你的记事本方法,但是,它没有解决任何格式问题,名称仍然会出现在电子邮件中(无论我是从源代码还是 excel 粘贴它)。
    • Data.com,不幸的是,我可以无限访问潜在客户,但我只能将 300 直接导入电子表格,其余的我必须复制/粘贴。
    • 您可以直接从 HTML 标记中查看 html 并解析电子邮件/名称,而不是从浏览器中复制文本吗?
    【解决方案2】:

    您可以利用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
    

    范围和结果图片

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

    如果没有发现颜色变化,您的相邻单元格也将是空白的,因此它对错误输入具有相当的鲁棒性。

    Edit 添加了更改原始字符串的功能,如果您愿意的话:

    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
    

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

    【讨论】:

    • 如果有多个颜色开关或者您想稍微提高速度,您可以在找到Null 后使用GoTo 或强制i 跳出循环大量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多