estrazione substringa



  • estrazione substringa
    di max (utente non iscritto) data: 08/04/2014 14:57:48

    Ciao a tutti,
    sono nuovo nel forum ed ho un problema con excel di questo tipo:
    sto estraendo la parte numerica di questa funzione (al massimo può essere una polinomiale di 6° grado cioè X^6)
    y = 9,8864x4 - 166,24x3 + 982,08x2 - 2331,1x + 3028,6
    con la funzione nativa in VBA: Mid(stringa,inizio,numero di caratteri).
    Mi accorgo che il primo coefficiente viene estratto come 98.864 e non 9,8864 mentre gli altri vanno tutti bene (eppure uso la stessa routine!). Perché questa incongruenza?
    Qualcuno Sto arrivando! dirmi perché? Tantissime grazie.
    Max



  • di paolomath data: 08/04/2014 17:09:01

    Ciao,

    allega il pezzo di codice che usi per l'estrazione.

    Bye bye.



  • di lepat (utente non iscritto) data: 08/04/2014 17:11:41

    Cit.
    Qualcuno Sto arrivando! dirmi perché?
    ---------------
    che significa ?

    allega il file con la macro



  • di Vecchio Frac data: 08/04/2014 22:26:20

    cit. "Qualcuno Sto arrivando! dirmi perché? Tantissime grazie. "
    ---> Carino, sembra che sia intervenuto un meccanismo tipo il glossario automatico di Word, che converte alcune combinazioni di caratteri (quando ha digitato "sa" si è trasformato in "Sto arrivando!").
    Usi un editor tipo Word per scrivere i post da inviare al forum?

    Nel merito, mostra la funzione che utilizzi per estrarre la parte numerica dal testo altrimenti è impossibile dirti perchè c'è questa "incongruenza" (che è solo un errore di logica nel codice).





  • di Vecchio Frac data: 08/04/2014 22:35:57

    Nel frattempo ti regalo una funzioncina fatta al volo che si poggia sulle espressioni regolari per estrarre la parte numerica da un testo, esclusa la notazione delle incognite, naturalmente, e restituirla in una collezione che è possibile scorrere.

    Si usa molto semplicemente così (l'ho provata in finestra Immediata sulla tua stringa iniziale):
    for each v in coll_numbers("y = 9,8864x4 - 166,24x3 + 982,08x2 - 2331,1x + 3028,6 "):?v:next
    e restituisce questo risultato:
    9,8864
    166,24
    982,08
    2331,1
    3028,6


    Nota che fallisce per numeri interi senza virgola (cioè non troverebbe nulla in "y = 2x +1" e in tal caso restituirebbe semplicemente l'input passato in argomento). Ma è giusto per un esempio delle potenzialità delle regex :)
     
    Option Explicit
    
    Function coll_numbers(s As String) As Collection
    Dim re As Object, match As Variant, mycoll As Collection
        
        Set re = CreateObject("VBScript.RegExp")
        re.pattern = "d+(?:,)d+"
        re.IgnoreCase = True
        re.Global = True
        
        Set mycoll = New Collection
        If re.Test(s) Then
            For Each match In re.Execute(s)
                mycoll.Add match
            Next
        Else
            mycoll.Add s
        End If
        
        Set coll_numbers = mycoll
    End Function






  • di Vecchio Frac data: 08/04/2014 22:50:36

    Bè ho voluto provare ancora ^_^
    Il pattern migliore che tenta di individuare anche i numeri interi, seguiti o no da una x è il seguente.
    Non funziona ancora benissimo.
    I numeri a una cifra non vengono individuati correttamente.
    E inoltre la "x" da sola (che sta per 1x) non viene rilevata.
     
    re.pattern = "d+(?:,)d+|d+(?!x)d+"