se o non se



  • se o non se
    di Alessandro (utente non iscritto) data: 21/08/2015 13:56:05

    Buon giorno,

    avrei bisogno di una formula che mi permetta di scrivere automaticamente un valore di testo (BASSA; MEDIA; ALTA)

    mi spiego meglio:

    da 0 a 50 deve apparire nella cella BASSA
    da 50 a 100 deve apparire MEDIA
    da 100 a 150 deve apparire ALTA

    COME DEVO FARE?

    grazie infinite...

    Alessandro



  • di Vecchio Frac data: 21/08/2015 14:31:19

    Buono studio della funzione :)

    (p.s. i limiti superiore di un intervallo e inferiore dell'intervallo successivo non possono essere uguali).
     
    Option Explicit
    
    Function choose_between(valore As Integer) As Variant
    'se valore è:
    'da 0 a 49 restituisce "BASSA"
    'da 50 a 99 restituisce "MEDIA"
    'da 100 a 149 restituisce "ALTA"
        If valore < 0 Then
            choose_between = Null
        Else
            choose_between = Choose((Split(Partition(valore, 0, 150, 50), ":")(0)  50) + 1, "BASSA", "MEDIA", "ALTA")
        End If
    End Function






  • di BS (utente non iscritto) data: 21/08/2015 14:35:43

    ciao Alessandro mi è capitato di eseguire un comando simile
    a prescindere che non hai dato indicazioni sulle celle dove inserisci i valori da 0 a 150
    e che i valori 50 e 100 non possono essere in più di una fascia
    quindi quando digiti in 50 cosa deve apparire? BASSA o MEDIA? il 100 deve ritornare MEDIA o ALTA?

    io ho considerato il 50 BASSA mentre il 50,1 MEDIA
    così come il 100 MEDIA ed il 100,1 ALTA

    copia la seguente formula dove devi ottenere BASSO MEDIO ALTO
    =SE(E(A1>=0;A1<=50);"BASSA";SE(E(A1>50;A1<=100);"MEDIA";SE(E(A1>100;A1<=150);"ALTA";"Inserire Valore Più Basso")))

    ho considerato A1 la cella di inserimento valori (da 0 a 150) "quindi modifica A1 con la tua cella"

    spero che sia quello che cercavi
    ciao



  • di Vecchio Frac data: 21/08/2015 14:48:01

    Sia in B2:D5 la tabella di riferimento:

    Range1	Range2	Value
    
    0 49 basso
    50 99 medio
    100 149 alto


    Sia in D7 il valore da cercare.
    Soluzione 1)
    =INDICE(D3:D5;MATR.SOMMA.PRODOTTO(--($D$7<=C3:C5);--($D$7>=B3:B5);RIF.RIGA(A1:A3)))

    Soluzione 2)
    =CERCA.VERT($D$7;B3:D5;3;VERO)

    Spero che qualche esperto di formule me le spieghi, soprattutto mi spieghi perchè la seconda è più piccola della prima e sembra funzionare altrettanto bene ^_^






  • di Vecchio Frac data: 21/08/2015 14:49:47

    @BS
    Grazie del tuo intervento!
    Finalmente non sempre i soliti ^_^





  • di BS (utente non iscritto) data: 21/08/2015 15:00:36

    Vecchio Frac .. ciao un onore per me .. ahahhaah
    la seconda formula quella con il CERCA.VERT
    funzionerebbe anche senza la seconda colonna (quella con i dati 49,99,149)
    in quanto cerca il valore inserito in data cella D7 nella colonna più a sinistra del campo selezionato (B2:D5) e restituisce il contenuto della terza cella (basso, medio, alto) .. quindi anche i valori intermedi tra 0 e 50 tra 50 e 100 danno basso e medio ... unica cosa è che se dovessi scrivere un valore più alto di 150 ti da sempre alto non fissando il limite.
    spero di non aver fatto confusione ..ahahaha



  • di Vecchio Frac data: 21/08/2015 15:02:40

    Buh... meglio VBA, è più comprensibile ^_^





  • di BS (utente non iscritto) data: 21/08/2015 15:20:14

    Devo rettificare la mia formula con questa

    =SE(E(A1>=0;A1<=50);"BASSA";SE(E(A1>50;A1<=100);"MEDIA";SE(E(A1>100;A1<=150);"ALTA";"Inserire Valore da 0 a 150")))

    ho fatto caso solo dopo averla riletta ... in caso che si inserisse un valore negativo sarebbe impensabile un messaggio che mi dica di inserire un valore più basso ..... ahahaha



  • di ninai data: 21/08/2015 15:29:08

    altre possibilità:
    =SCEGLI((A1>=0)+(A1>50)+(A1>100);"BASSA";"MEDIA";"ALTA")

    =SE(A1>100;"alta";SE(A1>50;"media";"bassa"))


    Vecchio Frac
    cit.
    "Buh... meglio VBA, è più comprensibile "
    ci vuole coraggio a dire certe cose



  • di Vecchio Frac data: 21/08/2015 15:33:02

    LOL ^_^
    Bè dai, nel mio esempio ho messo insieme Choose, Split e Partition che sono delle perle di chiarezza ^_^





  • di Luca73 data: 21/08/2015 15:43:53

    Ciao
    ne aggiungo qualcuna anche io (tutte senza appoggio, meno male che c'e' F9 )
    =SCEGLI(INT(D7/50)+1;"Basso";"Medio";"Alto")
    =SCEGLI(--(D7>0)--(D7>50)--(D7>100);"Basso";"Medio";"Alto")
    oppure
    =INDICE({"Basso""Medio""Alto"};INT(D7/50)+1)
    =INDICE({"Basso""Medio""Alto"};--(D7>0)--(D7>50)--(D7>100))

    Nota: le formule con INT(D7/50) valgono proprio perchè i limiti sono multipli di 50 (0, 50, 100) le altre invece sono più generiche e varrebbero per qualsiasi limite

    La formula di VF semplificata da BS senza colonna di appogio diventa
    =CERCA.VERT($D$7;{0,"Basso"50,"Medio"100,"Alto"};2;VERO)
    Senza analisi del sopra 150

    Per il VBA io avrei usato un SELECT CASE (vedi sotto), però ogni riga che posta VF per mè è una scoperta (Choose non lo avevo mai sentito)

    La formula di BS può essere semplificata
    =SE(E(A1>=0;A1<=50);"BASSA";SE(A1<=100;"MEDIA";SE(A1<=150;"ALTA";"Inserire Valore Più Basso")))
    e' inutile ripetere nella seconda condizione che sia superiore all limite espresso nel se precedente in quanto se fosse in tale condizioni non sarebbe arrivato lì'

    Per esempio il pezzo SE(E(A1>50;A1<=100) se A1 fosse < 50 il se precedente lo avrebbe già intercettato.
    Ciao
    Luca



     
    Function choose_between(valore As Integer) As Variant
    Select Case valore
        Case 0 To 50
            choose_between = "BASSA"
        Case 50 To 100
            choose_between = "MEDIA"
        Case 100 To 150
            choose_between = "ALTA"
        Case Else
            choose_between = ""
    End Select
    End Function
    






  • di Luca73 data: 21/08/2015 15:53:57

    @ VF, scusami anche partition mi suona nuovo.....Split me lo avevi già insegnato...





  • di Vecchio Frac data: 21/08/2015 16:08:04

    Partition non si usa praticamente mai. Ci avevo costruito sopra uno dei primi Esercizi ^_^
    Però ci sono tante belle funzioni ancora tutte da scoprire... Switch, StrConv, LSet, CallByName, ecc ^_^





  • di Raffaele_53 data: 21/08/2015 16:37:38

    Nel minestrone, non bastava solo le carote, cipolle, patate?
    Anche partition...,ecc ecc



  • di scossa data: 21/08/2015 16:51:49

    Questa mi sembra che manchi:
    =SCEGLI(SOMMA(--(A1>={100.50.0}));"BASSA";"MEDIA";"ALTA")

    Come udf propongo il codice sotto.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)

     
    Function scegli_tra(valore As Long) As String
      Dim aRet() As Variant
      
      aRet = Array("BASSA", "BASSA", "MEDIA", "ALTA")
      scegli_tra = aRet(-(valore >= 0) - (valore >= 50) - (valore >= 100))
      
    End Function



  • di Raffaele_53 data: 21/08/2015 17:08:06

    Ciao scossa
    Un problema che se la cella A1, non è numerica..sbaglia la formula



  • di mandoz (utente non iscritto) data: 21/08/2015 18:16:47

    ciao a tutti

    approfitto per una domanda
    scossa.... in passato mi hai spiegato a cosa serve un meno ad inizio formula. ma due?

    grazie. come sempre.



  • di Vecchio Frac data: 21/08/2015 18:59:39

    @scossa
    mi piace sempre vederti pasticciare con la logica booleana ^_^

    @mandoz
    cito cromagno in una discussione simile:
    "La funzione del doppio trattino vale per ogni formula che restituisca VERO o FALSO.
    Parti dal fatto che VERO e FALSO corrispondono ai valori 1 e 0, quindi se scrivi:
    =--(VERO) è come se scrivessi
    =--(1) cioè =-(-1) e siccome "meno*meno=più" avrai =1
    Stesso risultato se al posto dei due trattini moltiplichi per 1.

    =1*(VERO) ti darà 1
    =1*(FALSO) ti darà 0 "

    Il doppio segno meno trasforma, nel caso servisse, un booleano in numero.







  • di scossa data: 21/08/2015 19:17:34

    cit. Raffaele_53: "Un problema che se la cella A1, non è numerica..sbaglia la formula"

    Se ti riferisci alla UDF scegli_tra() mi sembra più che corretto, visto che il parametro da passarle deve essere un Long.
    Del resto anche la funzione nativa SOMMA() da errore se le passi una stringa.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)



  • di m (utente non iscritto) data: 21/08/2015 19:27:23

    copierò nuovamente la risposta sperando di non perderla

    grazie. ciao.



  • di Raffaele_53 data: 21/08/2015 22:31:58

    Ciao scossa

    >>>=SCEGLI(SOMMA(--(A1>={100.50.0}));"BASSA";"MEDIA";"ALTA")
    Intendevo la formula, dove con un semplice Se (capisco se testo/numerico in A1)

    Ps Penso pure in Function?



  • di scossa data: 22/08/2015 10:46:06

    cit.: "ntendevo la formula,"

    Non ho capito cosa vuoi dire. Intendi che se scrivi b in A1 restituisce ALTA anziché riportare l'errore #VALORE!?


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)



  • di Raffaele_53 data: 22/08/2015 12:07:09

    Ciao scossa
    >>>=SE(VAL.NUMERO(A1);SCEGLI(SOMMA(--(A1>={100;50;0}));"BASSA";"MEDIA";"ALTA");"Cella con valore TESTO")
    Se mi permetti vorrei chiedere un'altra cosa.
    Mettere il ".", nel mio caso ";", visto altri usare il "/" e forse altri "". Dipende solo la versione Excel?