在Excel

时间:2016-11-01 19:23:46

标签: excel excel-formula

喂!

我在excel中遇到了一些真正的脏数据(很好!)的问题,我很乐意帮助。

我的单元格有很长的文本字符串。其中有电子邮件地址。我试图只提取电子邮件地址。我尝试使用FIND函数和substitute我的字符串中的所有其他内容,但字符串太长了。

我的第二个解决方案是简单地将整个字符串发送到列,然后在其中找到带有“@”的单元格,并将它们放在不同的工作表中。出于某种原因,我完全陷入困境,现在我的大脑已经融化了,所以我希望你们中的一些人能帮助我!

目前,我在

=COUNTIF(Email!D8:ZZ8,"*@*")

这给了我大量列中@的数量。但是,我似乎无法在第二张纸上找到实际打印电子邮件的方式。我在考虑使用INDEX或MATCH,但似乎无法找到该死的东西。

简而言之:我正在尝试在非常大的列范围内获取包含@的单元格的值,或者在非常大的文本字符串中提取电子邮件。我的大脑已经融化了。

谢谢!

编辑:示例文本,因为我被问到数据是什么样的:

其中有机密信息,因此我已将其更改为隐藏所有机密信息的内容,但会让您了解格式:

  

从网络自动生成1800个字符的内容   表单,发送到excel文档,虽然优化不佳,因为   政府在计算机方面非常糟糕。内容有   从Web表单自动生成1800个字符,发送到   excel文档,虽然因政府很好而优化不佳   可怕的电脑东西。电子邮件是由A HUMAN通过电子邮件服务器发送的,这是一个允许电子邮件的网站   一些各种各样的事情。根据网络协议A NUMBER   我们已将此电子邮件的FROM字段设置为我们的通用无回复   地址在EMAILFORWARDIDONTWANT@example.com,但是提供了A HUMAN   我们的电子邮件地址(thisistheemailadressIwant@gmail.com)   包含在REPLY-TO字段中。请回复人类   thisistheemailadressIwant@gmail.com了解有关AN EMAIL的更多信息   SERVER访问webadress.com了解有关Web协议A NUMBER的更多信息   访问:网站/   http://anemailserver.emailautomaticallysent.com/wf/open?upn=a0CozdHDIYk-2F-2FE-27BDepiWoypG2sQgscftG6HHFFnds8gumLwFG5a91q5dYWchJq-2FS-2FxPwyA-2BRmi77imC9JC2ukUdYS8sqn0WplhHLgUkBT4OVuD4FxAUMSv1sBHGrqdEvBLARp6Ppqth1SdmKl2k4kG5IXQ73J2qGBxZ2FFgSa5wmQXQ9XyFyUsLSPvy4goLbRzaMIfl3u-2BNA1zx5FC2P6mN0komOQDVcbfPsUv2Qm57Fwc95UAD0E2f7ZsxOBXRKmwKSQjnA9ImBwK3wf3TY8vgTeV4N0jD05Oj4F8IK3JIssog6GVNNZ1-2BvLQnZmlVGa7h0WeuauDrGVDCeFcuFa-2BeXVdzpcwlWii2i

1 个答案:

答案 0 :(得分:0)

将以下代码复制到工作簿的VBA模块中。

(如果您对VBA模块和宏一无所知,请参阅http://www.excel-easy.com/vba/examples/run-code-from-a-module.html

运行Extract宏,选择包含电子邮件的单元格,单击“确定”,电子邮件将放置在活动单元格及其下方。

GetEmails函数也可以直接从一个范围调用(数组公式)。

Function GetEmails(Text As String)

    Set Regex = CreateObject("vbscript.regexp")
    Regex.Pattern = "\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"
    Regex.Global = True

    Set Matches = Regex.Execute(Text)

    Dim I As Integer, Count As Integer, Arr()

    Count = Matches.Count

    If Count Then
        ReDim Arr(1 To Count, 1 To 1)
        For I = 1 To Count
            Arr(I, 1) = Matches(I - 1)
        Next
        GetEmails = Arr
    Else: GetEmails = xlErrNA
    End If

End Function

Sub Extract()

    Dim Cell As Range
    On Error GoTo Err
    Set Cell = Application.InputBox("Select the cell containing emails.", Type:=8)
    On Error GoTo 0
    Dim Arr, P As Range
    Arr = GetEmails(Cell(1).Value)
    If TypeName(Arr) <> "Variant()" Then Exit Sub
    Set P = ActiveCell.Resize(UBound(Arr, 1))
    P = Arr
    P.Select

Err:
End Sub