Excel非统一数据提取

时间:2016-06-17 23:34:32

标签: excel excel-vba excel-formula vba

我很难找到解决方案 - 尽管我确信它已经存在了。只是不确定准确的措辞来获得我正在寻找的东西。

我有一个巨大的数据集,其中一些数据缺少信息,所以它不统一。我想只将名称提取到一列,然后将电子邮件提取到下一列。

我可以缩小范围的最佳方法是每个唯一条目之间都有一个空格,名称始终位于第一个框中。

示例:

John Doe
John Doe的公司
(555)555-5555
John.doe@johndoe.com

John Doe
(555)555-5555

John Doe
Jane Doe的公司
John.doe@johndoe.com

结果需要(在两个excel列中):

John Doe | john.doe@johndoe.com
John Doe |
John Doe john.doe@johndoe.com

任何有关最佳方法的建议都将受到赞赏。如果没有电子邮件会使其变得复杂,我会想完全忽略该设置,但我可以手动检查。

2 个答案:

答案 0 :(得分:0)

提取电子邮件地址应该不会太困难,因为您只需要搜索包含@字符的字符串。可以使用一系列search()和mid()函数来分离单个单词。搜索空间的每个实例并在mid()函数中使用该值。然后在结果中搜索@,您应该找到电子邮件地址。如果原始数据非常混乱,提取名称会更加困难。

然而,我在上面关于使用外部脚本的评论,尤其是对于大型数据集。 Excel并不是真的设计用于你在这里描述的那种东西。

答案 1 :(得分:0)

VBA编码:
1.在Row1中指示数据开始的第一行 2.在这种情况下放置一个标志“" end"表示信息的结束。
3.创建第二张表

Sub ToList()
Row1 = 1 'Row initial from data
Row2 = 1 'Row initial to put list
Do
    Name = False
    Do
        field = Trim(Sheets(1).Cells(Row1, 1))
        If field <> "" And LCase(field) <> "end" And Not Name Then
            Sheets(2).Cells(Row2, 1) = field
            Name = True
        End If
        Row1 = Row1 + 1
    Loop Until (IIf(field = "" Or LCase(field) = "end", True, False))
    fieldprev = Sheets(1).Cells(Row1 - 2, 1)
    If InStr(fieldprev, "@") > 0 Then
        Sheets(2).Cells(Row2, 2) = fieldprev
    End If
    Row2 = Row2 + 1
Loop Until (IIf(LCase(field) = "end", True, False))
End Sub