O filtro do Excel VBA Cadeia contém números

3

Eu criei uma fórmula no Excel VBA. qual extrair seqüência contendo o número de uma célula. por exemplo, uma string contém: "121A Nariman Street" irá extrair "121A"

Abaixo está o código

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

mas quando há dois números em uma string retorna segundo, por exemplo, ele retorna "121A Nariman Street, 12th Block" e retornará "12th"

Eu quero que esta função retorne apenas a string First Number. como fazer isso?

Sou muito novo no Excel VBA.

    
por Akhil Kumar 03.07.2017 / 14:07

3 respostas

1

Se todos os endereços começarem com um número, você poderá retornar o primeiro item:

Public Function DoorNo1(ByVal address As String) As String

    DoorNo1 = Split(address)(0)

End Function

else, saia da função quando o primeiro dígito for encontrado:

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
    
por 03.07.2017 / 23:41
2

Sua pergunta é sobre como escolher a primeira vez que você encontra algo em que IsNumeric() retorna verdadeiro

Esta versão atualizada deve fazê-lo

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

Ignorando todas as outras coisas erradas (e mantendo sua lógica atual existente sempre que possível), a lógica que você pode usar é usar um Exit For (assim como fechar a instrução IF ).

Exit For sairá do loop For . Você faz isso depois que a primeira palavra foi analisada e criada.

Depois, você simplesmente verifica se a nova primeira palavra ( DoorNo ) tem um valor ou não. Em caso afirmativo, atribua-o e saia do loop

Além disso, como sua função retorna alguma coisa, você deve explicitar usando As

No entanto, não faz sentido, pois toda a sua lógica atual está verificando se algum caractere da string é numérico e retornando-o em caso afirmativo! Isso significa que o endereço a12 (se existir) nunca seria escolhido. Onde, como o meu negócio, que não tem um número, mas tem o nome estúpido de 5tars C3entre seria aceito pela sua lógica

Sem conhecer a situação, sua lógica, tipo de valores que você está recebendo (por exemplo, 12 House, Twelve House, 12a House, House, Other etc) é difícil ajudar mais, mas isso deve fazer você ir

    
por 03.07.2017 / 16:10
-1

Você nem precisa usar o VBA para isso.

Uso o suplemento RegEx localizar / substituir para obter a funcionalidade de expressão regular no Excel.
( Eu não estou conectado a esse add-in ou é autor de qualquer forma, eu sou apenas um usuário entusiasta. )

Com isso, você pode usar esta fórmula: =RegExFind(A1,"\d+[a-zA-Z]*")

Em relação ao seu código:

correção rápida, você deve sair do loop For externo depois de encontrar um número

correção mais longa:

  • Eu nem usaria um for aqui, do ... loop seria mais eficiente (ou usaria expressões regulares no seu código se você estiver convencido de escrever código)
  • não declare variável dentro de um loop
por 03.07.2017 / 14:14