classifica



  • classifica
    di Mauro (utente non iscritto) data: 06/08/2013 16:06:18

    Buon pomeriggio a tutti, ho bisogno di un aiuto, volevo stilare una classifica per le prime 10 posizioni:
    estraggo i dati dal foglio5 e li riporto nel foglio26. Dalla colonna B del foglio5 estraggo i nomi e dalla colonna Z estraggo i totali. I nomi li riporto nel foglio26 dalla riga 2,2 mentre i totali dalla riga 2,3.
    Non so da che parte iniziare, grazie per chi mi aiuta
    Mauro



  • di HarryBosch data: 06/08/2013 20:13:56

    Ciao Mauro,
    stai parlando di formule o vuoi risolvere con il vba?
    Nel primo caso, hai provato se l'utilizzo della funzione =GRANDE(matrice;K)
    fa al caso tuo?


  • classifica
    di Mauro (utente non iscritto) data: 07/08/2013 14:18:22

    Ciao HarryBosch, grazie per il tuo interessamento, volevo risolvere con vba
    Mauro



  • di HarryBosch data: 07/08/2013 23:33:52

    Il foglio5 lo puoi ordinare o i dati devono rimanere immutati?
    Perché in questo caso si potrebbe risolvere abbastanza facilmente:
    - ordini le colonne B:Z in base ai valori di Z, dal più grande ovviamente
    - recuperi i primi 10 valori e li riporti nel Foglio26
     
    Sub riporta_primi_dieci()
        Dim i As Byte
    
        Sheets("Foglio5").Activate
        Columns("B:Z").Sort Key1:=Columns("Z"), _
            Order1:=xlDescending, Header:=xlGuess
         
         With Sheets("Foglio26")
            For i = 1 To 10
                .Cells(i + 1, 2) = Cells(i + 1, "B")
                .Cells(i + 1, 3) = Cells(i + 1, "Z")
            Next
            .Select
         End With
    End Sub


  • classifica
    di Mauro (utente non iscritto) data: 08/08/2013 09:36:42

    Ho allegato un file di prova,
    Mauro



  • di HarryBosch data: 08/08/2013 10:32:42

    Nella prima riga hai delle celle unite (merge) il che ti impedisce l'ordinamento selezionando le colonne per intero. Ci vuole un aggiustamento, andando a selezionare l'intervallo che parte dalla seconda riga fino all'ultima cella della tabella.

    Due cose:
    - ho visto anche una routine che nasconde il foglio Top10: attenzione che se un foglio è nascosto non puoi selezionarlo (.select);
    - altra istruzione che hai utilizzato: With Sheets("Foglio1") che però in realtà non esiste perché stiamo parlando del foglio "Top10". Puoi riferirti in due modi ai fogli del progetto: o utilizzando il nome che assegni alla linguetta del foglio, e quindi:
    Sheets("Top10").select
    oppure utilizzando direttamente il nome del foglio assegnato via progetto, alla proprietà (Name):
    Foglio1.select

    il secondo caso è la via preferibile in quanto puoi rinominare il foglio senza dover metter mano al codice.

    Ti riallego il file, dove ti ho inserito anche i commenti nel codice.



  • classifica
    di Mauro (utente non iscritto) data: 08/08/2013 12:12:43

    Ho provato il codice, funziona , però volevo trovare la somma più alta nella colonna Z in base al cliente esempio ( cliente A - 2964,95 , cliente B - 2254,30 ecc.) e riportarlo nel foglio1 in ordine decrescente.
    Mauro



  • di HarryBosch data: 08/08/2013 14:21:11

    Ok, è un pò diverso:
    a te serve sapere per ogni cliente, l'importo maggiore, e quindi ordinare i risultati in base agli importi.
    Però i clienti nella tabella principale potrebbero essere più di dieci, almeno da quanto risulta nel tuo file.


  • classifica
    di Mauro (utente non iscritto) data: 08/08/2013 14:34:52

    Esatto, e i clienti sono molto più di diedi.



  • di HarryBosch data: 08/08/2013 14:56:07

    Ecco una revisione del file.
    La routine fa questo:
    - crea una collezione con i nomi univoci dei clienti lungo la colonna B
    - filtra la tabella passando uno a uno i nomi memorizzati nella collection
    - per ogni filtro trova il valore Max della colonna Z e lo riporta nel foglio Top
    - ordina il foglio Top in base ai valori decrescenti

    Ti faccio notare che una tabella Pivot potrebbe farti molto comodo e che con essa potresti ricreare lo stesso scenario che viene elaborato dalla macro.

    Il file è "classifica_2"


  • classifica
    di Mauro (utente non iscritto) data: 08/08/2013 15:45:36

    Creato il filtro per ogni cliente deve fare la somma degli importi della colonna Z e quindi ordinare i primi 10 risultati.
    (no l'importo maggiore)



  • di HarryBosch data: 08/08/2013 16:04:29

    Basta soltanto modificare il parametro della funzione SubTotale che per il valore max prende 4 mentre per la somma prende 9. Quindi modifica questa istruzione con l'inserimento del 9:

    'calcolo la somma della colonna Z filtrata
    M = WorksheetFunction.Subtotal(9, Range("z3:z" & ur))

    mi sono accorto anche di una piccola imperfezione nell'ordinamento, perché salta l'ultima riga; pertanto sostituisci anche la penultima istruzione in questo modo, aggiungendo +1 alla variabile i:

    'ordino la tabella con gli importi maggiori di ogni cliente
    .Range("B1:C" & i + 1).Sort Key1:=.[C1], Order1:=xlDescending, Header:=xlGuess



  • classifica
    di Mauro (utente non iscritto) data: 08/08/2013 17:53:04

    Il codice funziona, nel foglio di prova funziona correttamente mentre dove lo applico mi da valori sbagliati nella riga 9-10-11 , non capisco il motivo



  • di HarryBosch data: 08/08/2013 19:41:02

    Nel file dove applichi il codice, la struttura delle tabelle è identica al file di prova?


  • classifica
    di Mauro (utente non iscritto) data: 09/08/2013 09:14:36

    Si è identica, ho fatto copia incolla, in caso si può bloccare la classifica alle prime 5 posizioni.



  • di HarryBosch data: 09/08/2013 11:54:39

    E' strano questo fatto: se la struttura è identica, anche il risultato deve essere necessariamente lo stesso; deve esserci qualcosa che modifica il risultato.
    cit: "..dove lo applico mi da valori sbagliati nella riga 9-10-11"
    intendi che esce comunque un risultato, ma i valori non sono quelli attesi?

    Per "fermare" la classifica alle prime 5 posizioni, o a dove ti interessa, devi soltanto aggiungere questa istruzione:
    If i = 5 Then Exit For

    subito prima dell'ultimo "Next" che trovi nella routine.


  • classifica
    di Mauro (utente non iscritto) data: 09/08/2013 13:31:58

    Grazie HarryBosch, il codice era perfetto ho controllato e corretto alcuni nomi erano scritti con dei spazi alla fine.
    Grandissimo aiuto
    Mauro