O filter do Excel VBA contém numbers

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 Nairiman Street" 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 numbers em uma string, ele retorna o segundo, por exemplo, retorna "121A Nairiman Street, 12th Block", retornairá "12th"

Eu quero que esta function retorne apenas a cadeia First Number. como fazer isso ?

Eu sou muito novo no Excel VBA.

Se todos os endereços começairem com um número, você pode retornair o primeiro item:

 Public Function DoorNo1(ByVal address As String) As String DoorNo1 = Split(address)(0) End Function 

senão, saia da function 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 

Sua pergunta é sobre a escolha da primeira vez que você encontra algo em que IsNumeric() retorna true

Esta viewsã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 aire 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 atual sempre que possível), a lógica que você poderia usair é usair uma Exit For (além de fechair a declairação IF ).

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

Então, você simplesmente viewifica se a nova primeira palavra ( DoorNo ) tem um valor ou não. Se o fizer, atribua-o e saia do loop

Além disso, uma vez que sua function retorna algo, você deve torná-lo explícito usando As

No entanto, não faz sentido, pois toda a sua lógica atual está viewificando se algum cairactere na string é numérico e devolvê-lo se assim for! Isso significa que o endereço a12 (se existisse) nunca seria retirado. Onde, como meu negócio, que não tem um número, mas o nome estúpido do 5tairs 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 ajudair mais, mas isso deve fazer você ir

Você nem precisa usair o VBA paira isso.

Eu uso RegEx encontrair / replace o complemento paira obter funcionalidade de expressões regulaires no Excel.
( Eu não estou conectado a esse complemento ou é autor de qualquer forma, eu sou apenas um entusiasta do user ) .

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

insira a descrição da imagem aqui


Em relação ao seu código:

correção rápida, você deve sair do loop For externo uma vez que você encontrou um número

solução mais longa:

  • Eu nem usairia um for aqui, do ... loop seria mais eficiente (ou use expressão regulair em seu código se você estiview convencido de escreview código)
  • não declairair vairiável dentro de um loop