Evaluate con Like



  • Evaluate con Like
    di marinoernestoch data: 27/02/2015 11:54:06

    Buon giorno a tutti.
    Mi sto scervellando per capire dove sbaglio: le istruzioni sono lo studio per la successiva implementazione di una macro molto complessa. L'istruzione "risultato_altro =. ..." è scritta per capire se sbagliavo la formulazione;
    L'istruzione "risultato_like = ...." è quella incriminata.
    Chi mi trova l'errore?
    1000 grazie
     
    Sub valuta()
    Dim risultato_altro As Boolean, da_valutare_altro As String
    Dim risultato_like As Boolean, da_valutare_like As String
    Dim risultato_chiaro As Boolean
    
    Dim pippo As String
    pippo = "ABC"  '<<==== simulo valore casuale
    '
    '
    '
    '
    da_valutare_altro = """" & pippo & """ > ""A"""
    risultato_altro = Evaluate(da_valutare_altro)   ' OK
    
    risultato_chiaro = IIf(pippo Like "[A-C][A-C][A-C]", True, False) ' OK
    
    da_valutare_like = """" & pippo & """ Like ""[A-C][A-C][A-C]"""
    risultato_like = Evaluate(da_valutare_like)      '<<<<<<<<<<<<<<  da' errore
    
    End Sub



  • di Mister_x (utente non iscritto) data: 27/02/2015 12:53:18

    ciao

    primacosa Boolean ritorna True o false
    avaluate() o valuta testo Variant quindi la variabile --risultato_like As Boolean-- deve essere dichiarata (Variant)
    Evaluate e una funzione non piu' contemplata in excel ma esistente in VBA quindi
    Application.Evaluate()

    ciao








  • di Vecchio Frac data: 27/02/2015 14:51:18

    cit. "Evaluate e una funzione non piu' contemplata in excel"
    ---> la versione italiana di =EVALUATE è =VALUTA.TESTO ma funziona solo in certi contesti (ad esempio con range nominati). Qualche anno fa ci avevo scritto un articoletto.

    Evaluate() funziona in VBA anche senza Application e valuta l'espressione stringa restituendo un risultato.
    Il problema nel codice di marinoernestoch è che Like non può essere valutata all'interno di un'espressione da valutare.
    Al masismo puoi dire
    da_valutare_like = pippo Like "[A-C][A-C][A-C]"
    ma questo restituisce già vero o falso e valutarlo dà errore.

    Come mai vuoi costruire un'espressione stringa da valutare poi? è abbastanza inusuale e inutile.





  • di marinoernestoch data: 27/02/2015 20:40:57

    Rispondo a vecchio_frac:
    Ricordi tempo addietro la macro che generava una userform generica, valida per un foglio generico, ma governata da un foglio di documentazione contenente i nomi dei campi, la lunghezza ecc. che tanto ci aveva fatto penare, poi risolta quando mi hai suggerito l'uso del ME, passato come parametro alle routines esterne?
    Bene. Dopo aver per circa un mese fatto altro, ora posso continuare nel progetto e sono arrivato ai controlli formali dei dati immessi. Una colonna del foglio di governo contiene la regola che questi dati devono rispettare e la colonna successiva il valore di confronto. Per cui in un caso potrei avere "> 0"; in un altro "< 100"; nel caso del CF. avrò "Like "[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][0-9]..." " eccetera.
    Se trovavo una formulazione valida volevo usare la EVALUATE e i tre valori interessati (campo sorgente, operatore e fattore di confronto) trasformati in costante. Così avrei scritto un limitato numero di istruzioni. Tanto la risposta può solo essere TRUE o FALSE (valido/ non valido)
    La bozza di istruzioni ipotizzata (e scritta nella discussione) mi dimostra la validità dell'idea, nel complesso, ma non quando incontro il Like per controllare il codice fiscale.
    L'alternativa sarebbe stata: if operatore di confronto = ">" then... if operatore di confronto = "Like" then... e così via. Ma è brutto! Non ti pare?
    Ovviamente se non c'è una soluzione elegante, sarò costretto a farmi tante if.. (o select case).
    by



  • di Vecchio Frac data: 28/02/2015 08:54:31

    Ciao ricordo tutto il progettone :o)
    Ora hai messo operatori e valori di confronto in colonne perchè vuoi realizzare una specie di parser che in base alle immissioni dell'utente valuta un'espressione costruita al volo.
    Evaluate purtroppo non ce la fa, come non riesce a fare Evaluate("1 AND 2"), bisogna pensarla come una formula da inserire in cella: funziona quindi Evaluate("AND(1, 2)") ma non con Like perchè Like non è una funzione del foglio di lavoro.
    L'alternativa che citi (verificare ogni operatore di confronto) è un'ottima idea, in fondo non sono molti e con una serie di select case te la puoi cavare.





  • di marinoernestoch data: 28/02/2015 15:26:16

    Si, volevo proprio costruire costanti al volo con i dati inseriti dall'utente e con i fattori di confronto. (mi sembrava una finezza...)
    Pace! Se il Like non è supportato nell'Evaluate, mi farò una "select case" con vari "case" e, come direbbe oggi la volpe all'uva,: "forse è meglio così, avrò l'opportunità di sviscerare meglio i test!"
    Grazie dell'attenzione dedicatami.