7
votes

Excel VBA boucle à travers une chaîne de chiffres jusqu'à ce qu'une lettre soit trouvée

J'ai une ficelle dans une cellule, disons qu'il dit "Client Ref: F123456Passplus". Il est possible que la chaîne ne possède pas une lettre avant les chiffres, il est possible qu'il existe un symbole dans les chiffres et il est possible qu'il existe un espace entre la lettre et les chiffres. Je dois extraire uniquement les chiffres comme une variable. J'ai le code pour le faire, mais cela ne sait pas quand arrêter de boucler dans la chaîne. Il devrait s'arrêter quand il y a autre chose qu'un chiffre ou un symbole, mais il effectue à la place.

IsNumber = 1
ref = ""
If branch = "" Then
    e = b
Else
    e = b + 1
End If
f = 1
While IsNumber = 1
    For intpos = 1 To 15
        ref = Mid(x, e, f)
        f = f + 1
        Select Case Asc(ref)
            Case 45 To 57
                IsNumber = 1
            Case Else
                IsNumber = 0
                Exit For
        End Select
    Next
    IsNumber = 0
Wend


4 commentaires

Où que vous souhaitiez mettre fin au SUB, ajoutez simplement Quitter Sub .


J'ai besoin de la macro pour savoir quand elle a une lettre dedans (ou de préférence juste avant), alors j'utiliserais la sortie pour dans mon code. Avec ce que j'ai écrit, je pensais que cela devrait le faire, mais apparemment pas.


Avez-vous débogué.Print ASC (REF) pour voir les valeurs?


Actuellement, avec un nombre long de 5 caractères, REF se termine par la valeur "12345Passplus ::", car elle continue d'ajouter à la variable de référence jusqu'à ce que l'INTOS atteigne 15.


3 Réponses :


2
votes

Ce code, basé sur votre, fonctionne, fonctionne (produit "12345"). Pour les grandes chaînes ou des besoins d'extraction plus complexes, j'envisagerais d'apprendre à propos de l'objet COMGEX COM.

Function ExtractNumber(ByVal text As String) As String

  ExtractNumber = ""

  foundnumber = False

  For e = 1 To Len(text)
    ref = Mid(text, e, 1)
        Select Case Asc(ref)
            Case 45 To 57   'this includes - . and /, if you want only digits, should be 48 to 57
                foundnumber = True
                ExtractNumber = ExtractNumber & ref
            Case Else
                If foundnumber = True Then Exit For
        End Select
  Next

End Function


0 commentaires

5
votes

Il n'y a rien de mal avec votre tentative d'accomplir cette tâche, mais je ne peux pas m'en empêcher de suggérer une regex: -)

Cet exemple dépassera tous les non-chiffres de la chaîne située dans A1 et présentez le résultat dans une boîte de message. Le motif utilisé est [^ 0-9] xxx

Assurez-vous d'ajouter une référence à "Microsoft VBScript Expressions régulières 5.5"

Pour plus d'informations sur l'utilisation de Regex dans Excel, y compris des exemples de boucle via des gammes Découvrez ce message .

résultats:

 Entrez la description de l'image Ici


2 commentaires

Nice, je pensais utiliser Regex, mais je ne sais pas assez pour écrire quoi que ce soit. Bien pensé!


Bonne approche. En utilisant vbnullstring est un peu plus efficace que ""



3
votes

Je me suis débarrassé du chèque ASC et j'ai ajouté un chèque contre chaque personnage lorsque vous le transmettez avant de construire la "chaîne" numérique.

IsNumber = 1
ref = ""
If branch = "" Then
    e = b
Else
    e = b + 1
End If
f = 1
While IsNumber = 1
    For intpos = 1 To 15
        char = Mid(x, e + intpos, 1)
        f = f + 1
        If IsNumeric(char) Then
            ref = Mid(x, e, f)
            IsNumber = 1
        Else
            IsNumber = 0
            Exit For
        End If
    Next
    IsNumber = 0
Wend


0 commentaires