Excel VBA Filter String enthält Zahlen

3

Ich habe eine Formel in Excel VBA erstellt. die Zeichenfolge mit der Zahl aus einer Zelle extrahieren. Ein String enthält zum Beispiel: "121A Nariman Street" Es wird "121A" extrahiert.

Unten ist der Code

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

Wenn sich jedoch zwei Zahlen in einer Zeichenfolge befinden, wird die zweite zurückgegeben, z. B. "121A Nariman Street, 12. Block". Es wird "12." zurückgegeben.

Ich möchte, dass diese Funktion nur die erste Zeichenfolge zurückgibt. Wie macht man das ?

Ich bin sehr neu in Excel VBA.

Akhil Kumar
quelle
1
Sie vermissen eineEnd If
Dave

Antworten:

1

Wenn alle Adressen mit einer Zahl beginnen, können Sie den ersten Artikel zurückgeben:

Public Function DoorNo1(ByVal address As String) As String

    DoorNo1 = Split(address)(0)

End Function

Andernfalls beenden Sie die Funktion, wenn die erste Ziffer gefunden wurde:

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
Paul Bica
quelle
2

Bei Ihrer Frage geht es darum, zu entscheiden, wann Sie zum ersten Mal auf etwas stoßen, bei dem die IsNumeric()Rückgabe wahr ist

Diese aktualisierte Version sollte es tun

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

Wenn Sie alle anderen Fehler ignorieren (und Ihre derzeitige Logik beibehalten, wo dies möglich ist), können Sie die Logik verwenden, indem Sie eine Exit For(und die IFAnweisung schließen).

Exit Forverlässt die ForSchleife. Sie tun dies, nachdem das erste Wort analysiert und erstellt wurde.

Dann prüfen Sie einfach, ob das neue erste Wort ( DoorNo) einen Wert hat oder nicht. Wenn dies der Fall ist, weisen Sie es zu und beenden Sie die Schleife

Da Ihre Funktion auch etwas zurückgibt, sollten Sie dies mit explizit angeben As

Es macht jedoch keinen Sinn, da Ihre gesamte aktuelle Logik prüft, ob ein Zeichen in der Zeichenfolge numerisch ist, und es zurückgibt, wenn dies der Fall ist! Dies bedeutet, dass die Adresse a12 (falls vorhanden) niemals abgeholt werden würde. Wo als mein Geschäft, das keine Nummer hat, aber den blöden Namen von hat, 5tars C3entrewürde von Ihrer Logik akzeptiert

Ohne die Situation, Ihre Logik und die Art der Werte zu kennen, die Sie erhalten (z. B. 12 House, 12 House, 12a House, House, Other usw.), ist es schwierig, mehr zu helfen, aber dies sollte Sie zum Laufen bringen

Dave
quelle
-2

Sie müssen dafür nicht einmal VBA verwenden.

Ich verwende das RegEx- Add-In " Suchen / Ersetzen" , um Funktionen für reguläre Ausdrücke in Excel zu erhalten.
( Ich bin in keiner Weise mit diesem Add-In oder seinem Autor verbunden, ich bin nur ein begeisterter Benutzer. )

Damit können Sie einfach diese Formel verwenden:
=RegExFind(A1,"\d+[a-zA-Z]*")

Bildbeschreibung hier eingeben


In Bezug auf Ihren Code:

Schnellkorrektur Sie sollten die äußere ForSchleife verlassen, sobald Sie eine Nummer gefunden haben

länger fix:

  • Ich würde hier nicht einmal ein verwenden for, do ... loopwäre effizienter (oder verwende reguläre Ausdrücke in Ihrem Code, wenn Sie davon überzeugt sind, Code zu schreiben)
  • Deklarieren Sie keine Variablen innerhalb einer Schleife
Máté Juhász
quelle