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
3 Réponses :
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
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 Assurez-vous d'ajouter une référence à "Microsoft VBScript Expressions régulières 5.5" P> Pour plus d'informations sur l'utilisation de Regex dans Excel, y compris des exemples de boucle via des gammes Découvrez ce message . P> résultats: p> A1 code> et présentez le résultat dans une boîte de message. Le motif utilisé est [^ 0-9] code> p>
Nice, je pensais utiliser Regex, mais je ne sais pas assez pour écrire quoi que ce soit. Bien pensé!
Bonne approche. En utilisant vbnullstring code> est un peu plus efficace que "" code>
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
Où que vous souhaitiez mettre fin au SUB, ajoutez simplement
Quitter Sub CODE>.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 code> 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.