Excel VBA 过滤字符串包含数字

Excel VBA 过滤字符串包含数字

我在 Excel VBA 中创建了一个公式。它从单元格中提取包含数字的字符串。例如,一个字符串包含:“121A Nariman Street”,它将提取“121A”

以下是代码

Function DoorNo(ADRESS)

Dim AddressArray() As String
AddressArray = Split(ADRESS)
Dim i As Integer
For i = 0 To UBound(AddressArray)
    Dim iCnt As Integer
    For iCnt = 1 To Len(AddressArray(i))
        If IsNumeric(Mid(AddressArray(i), iCnt, 1)) Then
            DoorNo = AddressArray(i)

    Next iCnt
Next i

End Function

但是当字符串中有两个数字时,它会返回第二个数字,例如它返回“121A Nariman Street, 12th Block”,它将返回“12th”

我希望此函数仅返回第一个数字字符串。如何做到这一点?

我对 Excel VBA 还很陌生。

答案1

如果所有地址都以数字开头,则可以返回第一项:

Public Function DoorNo1(ByVal address As String) As String

    DoorNo1 = Split(address)(0)

End Function

否则,当找到第一个数字时退出该函数:

Public Function DoorNo2(ByVal address As String) As String
    Dim addressArray() As String, i As Long, j As Long

    addressArray = Split(address)

    For i = 0 To UBound(addressArray)
        For j = 1 To Len(addressArray(i))
            If IsNumeric(Mid(addressArray(i), j, 1)) Then
                DoorNo2 = addressArray(i)
                Exit Function
            End If
        Next
    Next
End Function

答案2

您的问题是关于选择第一次遇到IsNumeric()返回 true 的事情

这个更新的版本应该可以做到

Option Explicit
Sub doIt()
    Dim dn As String
    dn = DoorNo("12A Street 12th")
End Sub

Function DoorNo(addy As String) As String

Dim door As String
Dim AddressArray() As String
AddressArray = Split(addy)
Dim i As Integer
For i = 0 To UBound(AddressArray)

    Dim iCnt As Integer
    For iCnt = 1 To Len(AddressArray(i))    'why are you looping here?
        If IsNumeric(Mid(AddressArray(i), iCnt, 1)) Then
            door = AddressArray(i)
        End If
    Next iCnt

    If Not IsEmpty(DoorNo) Or Not DoorNo = Null Then
        DoorNo = door
        Exit For
    End If
Next i

End Function

忽略所有其他错误(并尽可能保留现有的当前逻辑),您可以使用的逻辑是使用Exit For(以及关闭IF语句)。

Exit For将退出For循环。在分析并创建第一个单词后执行此操作。

然后你只需检查新的第一个单词(DoorNo)是否有值。如果有,则分配它并退出循环

此外,由于你的函数返回了某些内容,因此你应该使用As

然而,这毫无意义,因为您当前的所有逻辑都在检查字符串中是否有任何字符是数字,如果是,则返回它!这意味着地址 a12(如果存在)永远不会被拾取。而我的公司没有数字,但名字很蠢,5tars C3entre您的逻辑会接受它

如果不知道具体情况、你的逻辑、你收到的值的类型(例如,12 号房子、12 号房子、12a 号房子、房子、其他等等),就很难再提供任何帮助,但这应该可以让你继续前进

答案3

您甚至不需要使用 VBA。

我用RegEx 查找/替换插件来获取 Excel 中的正则表达式功能。
我与该插件或其作者没有任何关系,我只是一个狂热用户。

你可以使用这个公式:
=RegExFind(A1,"\d+[a-zA-Z]*")

在此处输入图片描述


关于您的代码:

For快速修复你应该在找到数字后退出外层循环

更长的修复:

  • 我甚至不会for在这里使用,do ... loop会更有效率(或者如果你确信要写代码的话,在你的代码中使用正则表达式)
  • 不要在循环内声明变量

相关内容