如何只提取 Excel 中包含字母和数字的单元格?
How to extract only cells which contain a letter AND a number in Excel?
我有一系列地址,我需要从中提取邮政数据 codes.The 数据格式非常草率(没有分隔,有些有间距,有些没有等等)这意味着我能想到的唯一提取方法邮政编码是创建一个列,其中仅添加包含 Text 和 Number 的值,因为这些是唯一包含邮政编码的单元格代码。
数据太乱,无法准确区分邮政编码所在的位置,但我想要 return 像上面这样的结果。
我怎么能 return 只有 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
编辑:我认为它不起作用,因为它只有 return E17 3RU 在 Walthamstow,但是 HE17 3RU 不是有效的邮政编码 (http://www.royalmail.com/find-a-postcode),因此它找到了有效的邮政编码。
虽然我相信@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
将其放入附加到工作簿的模块中,不是工作sheet代码或 ThisWorkbook 代码。
您可以使用以下公式从 sheet 调用它:
=pcode(I5:P5)
我有一系列地址,我需要从中提取邮政数据 codes.The 数据格式非常草率(没有分隔,有些有间距,有些没有等等)这意味着我能想到的唯一提取方法邮政编码是创建一个列,其中仅添加包含 Text 和 Number 的值,因为这些是唯一包含邮政编码的单元格代码。
数据太乱,无法准确区分邮政编码所在的位置,但我想要 return 像上面这样的结果。
我怎么能 return 只有 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
编辑:我认为它不起作用,因为它只有 return E17 3RU 在 Walthamstow,但是 HE17 3RU 不是有效的邮政编码 (http://www.royalmail.com/find-a-postcode),因此它找到了有效的邮政编码。
虽然我相信@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
将其放入附加到工作簿的模块中,不是工作sheet代码或 ThisWorkbook 代码。
您可以使用以下公式从 sheet 调用它:
=pcode(I5:P5)