如何只提取Excel中包含字母和数字的单元格?

时间:2016-04-26 15:13:46

标签: excel text postal-code

我有一系列地址,我需要从中提取邮政编码。数据格式非常粗糙(没有分开,有些间距有些没有等等。)意味着我能想到提取邮政编码的唯一方法是创建一个列,只添加包含 Text Number 的值,因为这些是包含邮政编码的唯一单元格。

enter image description here

数据太乱了,无法准确隔离邮政编码所在的位置,但我想要回复上面的结果。

我怎么能只返回O2& P2范围为K2:R2?

*此处的地址已解决

2 个答案:

答案 0 :(得分:1)

对于VBA结果,您可以使用以下代码 在单元格T2中输入=GetPostCode(K2:R2)
或者在VBA中,您可以使用Debug.Print GetPostCode(Sheet1.Range("K2:N2"))

我无法记住我从哪里获得模式,但可能会有所改进。

Public Function GetPostCode(AddressRange As Range) As Variant

    Dim rCell As Range
    Dim sAddressString As String

    For Each rCell In AddressRange
        sAddressString = sAddressString & " " & rCell.Value
    Next rCell
    sAddressString = Trim(sAddressString)

    GetPostCode = ValidatePostCode(sAddressString)

End Function

Public Function ValidatePostCode(strData As String) As Variant

    Dim RE As Object, REMatches As Object

    Dim UKPostCode As String

    'Pattern could probably be improved.
    UKPostCode = "(?:(?:A[BL]|B[ABDHLNRST]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[CHNX]?|F[KY]|G[LUY]?|" _
                & "H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EKL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTWY]?|" _
                & "T[ADFNQRSW]|UB|W[ACDFNRSV]?|YO|ZE)\d(?:\d|[A-Z])? \d[A-Z]{2})"

    Set RE = CreateObject("VBScript.RegExp")
    With RE
        .MultiLine = False
        .Global = False
        .IgnoreCase = True
        .Pattern = UKPostCode
    End With

    Set REMatches = RE.Execute(strData)
    If REMatches.Count = 0 Then
        ValidatePostCode = CVErr(xlErrValue)
    Else
        ValidatePostCode = REMatches(0)
    End If

End Function

编辑:我认为它不起作用,因为它只返回Walthamstow中的 E17 3RU ,但 HE17 3RU 不是有效的邮政编码( http://www.royalmail.com/find-a-postcode)所以它找到了有效的。

答案 1 :(得分:1)

虽然我相信@ DarrenBartrup-Cook有更好的答案。这个快速脏的小UDF将基于数字和文本的混合,如问。

Function pcode(rng As Range)
Dim rngt As Range
Dim chr As String
Dim i As Integer

For Each rngt In rng
    If Not IsNumeric(rngt) Then
        For i = 1 To Len(rngt)
            If IsNumeric(Mid(rngt, i, 1)) Then
                pcode = Trim(pcode & " " & rngt.Value)
                Exit For
            End If
        Next i
    End If
Next rngt
End Function

将此文件放在工作簿附带的模块中,工作表代码或ThisWorkbook代码。

您可以使用以下公式从工作表中调用它:

=pcode(I5:P5)

enter image description here