2016-01-21 21 views
7

Ho una stringa in una cella, diciamo che dice "Rif. Cliente: F123456PassPlus". E 'possibile che la stringa non abbia una lettera prima dei numeri, è possibile che ci sia un simbolo nei numeri ed è possibile che ci sia uno spazio tra la lettera ei numeri. Ho bisogno di estrarre solo i numeri come variabile. Ho il codice per farlo, ma non sa quando smettere di scorrere attraverso la stringa. Dovrebbe fermarsi quando c'è qualcosa di diverso da un numero o un simbolo, ma continua invece.Excel VBA esegue il ciclo attraverso una stringa di numeri finché non viene trovata una lettera

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 

Tutte le lettere variabili là che non hanno definizioni sono state precedentemente definiti, e dice il codice in cui per avviare la copia e x è la cella che contiene la stringa. Per ora funziona tutto bene, inizia dal numero e li copia e li costruisce in una stringa sempre più grande, ma si fermerà solo quando raggiunge quota 15.

+0

Ovunque si desideri terminare il sottotitolo, basta aggiungere "Esci sott.". – BruceWayne

+0

Ho bisogno della macro per sapere quando è contenuta una lettera (o preferibilmente prima), quindi userò il comando "Esci da" nel mio codice. Con quello che ho scritto, ho pensato che avrebbe dovuto farlo, ma apparentemente no. –

+1

Hai eseguito il debug.print Asc (ref) per vedere i valori? – CPMunich

risposta

3

mi sono liberato del controllo Asc e aggiunto un controllo contro ogni personaggio, come si passa prima di costruire la "stringa" numerica.

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 
2

Questo codice, liberamente basato sul tuo, funziona (produce "12345"). Per le stringhe di grandi dimensioni o per esigenze di estrazione più complesse, prenderei in considerazione l'apprendimento dell'oggetto COM regex.

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 
5

Non c'è nulla di sbagliato nel modo in cui il tentativo di eseguire questa operazione, ma non mi può aiutare dal suggerire regex :-)

Questo esempio eliminerà tutti i non-cifre dalla stringa si trova nella A1 e presentare il risultato in una finestra di messaggio. Il modello utilizzato è [^0-9]

Sub StripDigits() 
    Dim strPattern As String: strPattern = "[^0-9]" 
    Dim strReplace As String: strReplace = vbnullstring 
    Dim regEx As New RegExp 
    Dim strInput As String 
    Dim Myrange As Range 

    Set Myrange = ActiveSheet.Range("A1") 

    If strPattern <> "" Then 
     strInput = Myrange.Value 
     strReplace = "" 

     With regEx 
      .Global = True 
      .MultiLine = True 
      .IgnoreCase = False 
      .Pattern = strPattern 
     End With 

     If regEx.test(strInput) Then 
      MsgBox (regEx.Replace(strInput, strReplace)) 
     Else 
      MsgBox ("Not matched") 
     End If 
    End If 
End Sub 

Assicurati di aggiungere un riferimento a "Microsoft VBScript Regular Expressions 5.5"

Per ulteriori informazioni su come utilizzare regex in Excel, con esempi di collegamento in cascata gamme check out this post.

Risultati:

enter image description here

+0

Nice, stavo pensando di usare regex, ma non ne sai abbastanza da scrivere qualsiasi cosa Pensare bene! – BruceWayne

+0

Buon approccio. L'uso di 'vbnullstring' è un po 'più efficiente di" "" " – brettdj