Funzione Piccolo e Grande



  • Funzione Piccolo e Grande
    di MAX (utente non iscritto) data: 12/01/2013 21:21:40

    Salve. Ho questo problema in excel.
    Ho 2 colonne la "A" con 1 numeri da 1 a 50 e la "B" con dei numeri a caso. Nella cella I8 ho la formula =PICCOLO(B5:B54;1) nella I9 la formula =PICCOLO(B5:B54;2) nella I10 la formula =PICCOLO(B5:B54;3) fino alla I17 dove ho la formula =PICCOLO(B5:B54;10); poi alla I22 ho la formula =GRANDE(B5:B54;1) nella I23 la formula =GRANDE(B5:B54;2) fino alla I26 dove ho la formula =GRANDE(B5:B54;5). Io vorrei che affianco a ogni cella dalla I8 alla I17 e dalla I22 alla I26 precisamente nella J8 fino alla J17 e nella J22 fino alla J26 mi riportasse il valore della cella affianco alla B ad esempio se nella I8 ho come numero l'1 che si trova nella B6 vorrei che il numero 2 che si trova nella A6 me lo riportasse nella J8, se nella I9 ho il numero 2 che si trova nella A8 nella J9 e poi a seguire; spero di essermi spiegato bene; aggiungo che sia nelle celle con la formula PICCOLO che GRANDE ci sono numeri uguali. Grazie per la collaborazione



  • di Vecchio Frac data: 12/01/2013 22:49:34

    Penso che un piccolo file di esempio con dati preconfezionati sarebbe di aiuto per non ricostruirsi uno scenario magari errato :)





  • di MAX (utente non iscritto) data: 13/01/2013 00:32:25

    Ho allegato un immagine di quello che avevo scritto, spero che vada bene.



  • di Vecchio Frac data: 13/01/2013 11:45:41

    Dunque (a parte la scomodità di doversi rifare la tabella quando poteva essere utile che tu postassi il file direttamente), ci ho pensato su parecchio prima di capire che associ la frequenza al valore posizionale di ogni valore trovato.
    Nell'esempio postato, l'1 compare una volta sola nell'elenco dei dati casuali e a quell'1 è associata la posizione 2 (colonna A). Parimenti, ci sono sette numeri 2, nelle posizioni 1, 3, 4, 23, 43, 48 e 50.
    Credo di aver capito.
    Non me la cavo tanto bene con le sole formule.
    Magari posso suggerirti due righe di codice.





  • di Vecchio Frac data: 13/01/2013 13:03:34

    Ecco qui.
    Ho usato un piccolo trucco... riordino la tabella secondo le frequenze (colonna B) poi estraggo le prime dieci posizioni e le incollo nella tabella dei valori PICCOLI.
    La stessa cosa può essere fatta con quella dei valori GRANDI naturalmente applicando l'ordinamento discendente.
     
    Sub estrai_posizioni()
    
        [A1:B40].Sort key1:=[B1], header:=xlNo, order1:=xlAscending
        [B1:B10].Copy [E2]
        [A1:A10].Copy [F2]
        
        [A1:B40].Sort key1:=[A1], header:=xlNo, order1:=xlAscending
        
    End Sub






  • di MAX (utente non iscritto) data: 13/01/2013 15:01:25

    Ho allegato l'immagine perchè oltre al file .jpg può essere caricato un file .rar o .zip ed attualmente non ho installato sul pc nè winrar ne winzip, se si potesse allegare un file .xls o .xlsx sarebbe più comodo, con lo strumento di cattura ho fatto quell'immagine; comunque ti chiedo scusa lo stesso. A me interesserebbe di più una formula da mettere nella cella J8:J17 e J22:J26; per il vba che hai scritto come funzionerebbe precisamente? Scusami ma sono un pò ignorante....



  • di MAX (utente non iscritto) data: 13/01/2013 15:18:27

    Ho scaricato winzip ed ho allegato il file così è più comprensibile.



  • di Vecchio Frac data: 13/01/2013 15:22:07

    Il sistema accetterebbe anche file xls di piccole dimensioni :)
    Per il codice:
    premi Alt-F11 e Inserisci - Modulo
    Copia incolla il codice che ti ho postato e provalo. Poi in Excel Alt-F8 ed esegui la macro.
    Se non hai dimestichezza chiaramente bisogna espanderlo per ricomprendere anche la seconda parte della frequenza, quella che riguarda i valori più Grandi.
    Ma dai un'occhiata al codice, ti aiuterà a comprenderlo meglio in fondo non è così difficile.
    Se trovo un minuto, riposto qui un allegato basato sul tuo esempio.





  • di MAX (utente non iscritto) data: 13/01/2013 15:39:13

    I file .xls non diceva di poterli allegare, sicuramente mi sarò confuso io! Nel file .xls che ti ho allegato ho già scritto il tuo codice ma quando clicco sulla macro mi dà un errore di debug, lo puoi constatare pure tu.



  • di Vecchio Frac data: 13/01/2013 15:52:39

    Sì, l'indicazione è di non allegare preferibilmente file che non siano compressi, per una questione di risparmio di spazio.
    Nello specifico, il codice va adattato: nel mio esempio, l'area dati partiva dalla prima riga, nel tuo file invece si parte da riga 5. Poichè in A2 ci sono celle unite, va in errore.
    Modifica il codice come segue... ho aggiunto la modifica che ti serviva, cioè adesso calcola le frequenze associate sia ai più grandi che ai più piccoli.
     
    Sub estrai_posizioni()
    
        [A5:B54].Sort key1:=[B5], Header:=xlNo, order1:=xlAscending
        [B5:B14].Copy [I8]
        [A5:A14].Copy [J8]
        
        [A5:B54].Sort key1:=[B5], Header:=xlNo, order1:=xlDescending
        [B5:B9].Copy [I22]
        [A5:A9].Copy [J22]
        
        [A5:B54].Sort key1:=[A5], Header:=xlNo, order1:=xlAscending
        
        MsgBox "Fatto!"
    End Sub






  • di MAX (utente non iscritto) data: 13/01/2013 16:14:42

    Ok, sei un grande; ora funziona bene. Sei stato gentilissimo. Ma solo per curiosità: invece del vba esiste una formula che sarebbe riuscita a fare lo stesso inserendola nella cella J8:J17 e J22:J26? Ti saluto



  • di Vecchio Frac data: 13/01/2013 16:41:41

    Confesso che ho provato a pensare sia a RANGO che a FREQUENZA, ma non ho ricavato niente.
    Allora ho giocato sporco con l'ordinamento, una soluzione rapida e indolore :)
    Non escludo che la possibilità ci sia.





  • di MAX (utente non iscritto) data: 13/01/2013 16:54:31

    Ok, va bene lo stesso. Grazie ancora



  • di MAX (utente non iscritto) data: 22/01/2013 20:32:03

    Ciao Frac. Il file che hai fatto va benissimo, però io l'ho modificato e adesso non funziona; ti spiego meglio. La colonna B prima conteneva un numero mentre adesso ho messo la formula =Z10 per esempio contenente sempre un numero ma quando attivo la macro è come se quelle celle con la formula le ignorasse. Come mai?



  • di Vecchio Frac data: 22/01/2013 20:44:03

    Non ho più il file su cui avevo fatto le prove: ti chiedo di allegare un file con dati di esempio in modo da riprodurre la condizione che dà errore.
    Il problema è al 99% dovuto a Copy, il quale copia anche i riferimenti di formula.
    Probabilmente basterà fare l'incolla-speciale dei soli valori.
    A occhio e croce (non l'ho provato) un codice come quello che segue:
     
    Sub estrai_posizioni()
    
        [A5:B54].Sort key1:=[B5], Header:=xlNo, order1:=xlAscending
        [B5:B14].Copy 
        [I8].PasteSpecial xlPasteValues
        [A5:A14].Copy 
        [J8].PasteSpecial xlPasteValues
        
        [A5:B54].Sort key1:=[B5], Header:=xlNo, order1:=xlDescending
        [B5:B9].Copy 
        [I22].PasteSpecial xlPasteValues
        [A5:A9].Copy 
        [J22].PasteSpecial xlPasteValues
    
        Application.CutCopyMode=false
        
        [A5:B54].Sort key1:=[A5], Header:=xlNo, order1:=xlAscending
        
        MsgBox "Fatto!"
    End Sub






  • di MAX (utente non iscritto) data: 22/01/2013 20:51:06

    Appena provo ti faccio sapere. Se non va ti allego il file.



  • di Vecchio Frac data: 22/01/2013 21:12:02

    Perfetto, speriamo vada bene :)





  • di MAX (utente non iscritto) data: 24/01/2013 07:15:40

    Ho provato ma non va bene e quindi ti ho mandato sia il file con la vecchia formula che andava bene sia con quella nuova.



  • di Vecchio Frac data: 24/01/2013 19:08:35

    Allego il codice modificato...
    è stato necessario copincollare i valori delle celle con formula nella colonna C, quindi ripetere il procedimento già visto, con in più l'onere di recuperare il formato di celle (blu) da applicare al risultato della copia, altrimenti venivano "piatti" come in colonna C.
    La macro poi cancella i valori della colonna di appoggio.
    Importante diventa quindi non scrivere niente in colonna C, da riga 5 a riga 54 perchè viene sovrascritto dalla macro.
    Non ti riallego il file, la modifica puoi farla anche tu nel tuo file, sostituendo il codice con quello sottostante.
     
    Sub estrai_posizioni_2()
    
        [B5:B54].Copy
        [C5].PasteSpecial xlPasteValues
        
        [A5:C54].Sort key1:=[C5], Header:=xlNo, order1:=xlAscending
        [C5:C14].Copy [I8]
        [B5:B14].Copy
        [I8].PasteSpecial xlPasteFormats
        [A5:A14].Copy [J8]
        
        [A5:C54].Sort key1:=[C5], Header:=xlNo, order1:=xlDescending
        [C5:C9].Copy [I22]
        [B5:B9].Copy
        [I22].PasteSpecial xlPasteFormats
        [A5:A9].Copy [J22]
        
        Application.CutCopyMode = False
        
        [C5:C54].ClearContents
        [A5:B54].Sort key1:=[A5], Header:=xlNo, order1:=xlAscending
        
        MsgBox "Fatto!"
    End Sub






  • di MAX (utente non iscritto) data: 25/01/2013 22:04:19

    Ok, ora funziona bene. Grazie e tante belle cose