我正在使用Microsoft Excel 2013。
我需要在单个单元格中的Excel中分离大量数据。 "文本到列"功能很好,除了一个障碍。
在单个单元格中,我有First Name
,Last Name
& Email address
。姓氏和电子邮件地址之间没有空格,但名称的颜色与电子邮件不同。
示例(所有大写字母代表彩色名称RGB(1,91,167),小写字母是仅标准黑色文本的电子邮件):
JOHN DOEjohndoe@acmerockets.com
所以我需要在DOE之后放一个空格,使其显示为:
JOHN DOE johndoe@acmerockets.com
我有大约20k行要经过,所以任何提示都会受到赞赏。我只需要在姓氏和电子邮件之间留一个空格或者其他东西,这样我就可以使用" Text to Columns"功能并将它们分开。
答案 0 :(得分:0)
不是一个完整的答案,但我会这样做:
第1步以摆脱格式化:
我认为这应该删除所有格式问题
第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
范围和结果的图片
这种方法的好处是所涉及的实际颜色并不重要。您也不必手动搜索开关,尽管这将是下一步。
如果没有找到颜色变化,你的相邻单元格也将是空白的,因此它对于不良输入非常强大。
修改会增加更改原始字符串的功能:
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
结果图片再次使用与上面相同的输入。