Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Excel中仅提取包含字母和数字的单元格?_Excel_Text_Postal Code - Fatal编程技术网

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

如何在Excel中仅提取包含字母和数字的单元格?,excel,text,postal-code,Excel,Text,Postal Code,我有一系列的地址,我需要从中提取邮政编码。数据的格式非常松散(没有分开,有些有空格,有些没有等等)这意味着我能想到的提取邮政编码的唯一方法是创建一列,其中只添加包含文本和数字的值,因为这些是唯一包含邮政编码的单元格 数据太混乱,无法准确地分离出邮政编码所在的位置,但我希望返回类似上面的结果 如何从K2:R2范围内仅返回单元格O2和P2 *这里的地址是由VBA结果组成的,您可以使用下面的代码。 在单元格T2中输入=GetPostCode(K2:R2), 或者在VBA中,您可以使用Debug.Pr

我有一系列的地址,我需要从中提取邮政编码。数据的格式非常松散(没有分开,有些有空格,有些没有等等)这意味着我能想到的提取邮政编码的唯一方法是创建一列,其中只添加包含文本和数字的值,因为这些是唯一包含邮政编码的单元格

数据太混乱,无法准确地分离出邮政编码所在的位置,但我希望返回类似上面的结果

如何从K2:R2范围内仅返回单元格O2和P2


*这里的地址是由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不是有效的邮政编码(),所以它找到了有效的邮政编码

尽管我相信@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
将其放入附加到工作簿的模块中,而不是工作表代码或此工作簿代码

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

=pcode(I5:P5)

是否总是有两个单元格有邮政编码?您是否能够在Office 365中使用最新的Excel?如果两者都不同意,那么VBA就是一条出路。不,有些人走到了一起,有些人没有。我不知道该用什么逻辑。这是返回单元的情况,包括1或2或3..和a或B或C..等?我在这里太深了!对不起,是的,我更改了地址的所有细节-不想惹麻烦!我将编辑问题是的,绝对不要使用真实数据。:)天才它适用于我95%的记录,但我有一些错误,这是因为我的数据很差,但不是你对我问题的回答!