› Sviluppare funzionalita su Microsoft Office con VBA › trovare il primo, secondo, terzo, ecc, numero piu frequente
-
AutoreArticoli
-
Buongiorno ho una colonna con dei numeri ad esempio 332 - 332 - 820 - 820 - 820 - 331 - 290 - 290 ecc. vorrei sapere quale è il primo numero più frequente - il secondo ecc. fino al quinto. Spero che non sia una questione troppo complessa. Vi ringrazio anticipatamente.
Una moda?
Option Explicit Function Moda() Dim n As Long Dim j As Long Dim i As Long Range("B2:C8", "Z:Z").ClearContents Range("A2:A8").Copy Range("Z2") n = Range("Z2").CurrentRegion.Cells.Count Range("Z2:Z" & n).RemoveDuplicates Columns:=1, Header:=xlNo n = Range("Z2").CurrentRegion.Cells.Count j = 2 For i = 1 To n Cells(j, "B") = Cells(i + 1, "Z") Cells(j, "C") = Application.CountIf(Range("A2:A8"), Cells(i + 1, "B")) j = j + 1 Next End FunctionPerfetto! Ma mi sceglie il primo numero ripetuto piu volte vorrei che ci sia la possibilità di scegliere il primo o il secondo o il terzo o il quarto o il quinto. Nel mio esempio 820 è il primo, 290/332 il secondo, 331 il terzo. Ti ringrazio della cortese attenzione.
Ovviamente i dati primo secondo terzo verrebbero messi su celle differenti ed editate come grafico.
Mi sembrava di aver colto il senso della domanda. Allego il file così mi dici se ho sbagliato scenario.
Ho anche modificato leggermente il codice rispetto a quello precedente ma solo per introdurre il sorting del risultato. Che secondo me risponde alla domanda 🙂
Allegati:
You must be logged in to view attached files.Grazie comunque spero che l'esempio sia esaustivo
Allegati:
You must be logged in to view attached files.Alla luce della diversa disposizione dei range nel tuo nuovo file, allego la nuova modifica. Incollo qui anche il codice utilizzato.
Option Explicit Function Moda() Dim n As Long Dim j As Long Dim i As Long Range("E2:F8,Z:Z").ClearContents Range("Z1") = "header" n = Application.CountA(Range("B:B")) Range("B2:B" & n).Copy Range("Z2") n = Range("Z2").CurrentRegion.Cells.Count Range("Z:Z").RemoveDuplicates Columns:=1, Header:=xlYes n = Range("Z2").CurrentRegion.Cells.Count j = 2 For i = 1 To n Cells(j, "E") = Cells(i + 1, "Z") Cells(j, "F") = Application.CountIf(Range("B2:B8"), Cells(i + 1, "E")) j = j + 1 Next Range("E2:F" & j).Sort Range("F2"), xlDescending, Header:=xlYes Range("Z:Z").ClearContents End FunctionAllegati:
You must be logged in to view attached files.Non capisco mi trova sempre il primo e non il secondo ecc. Ciao e grazie dell'interessamento
Sì, il refuso c'era (nel range da cui ricavare i dati). Con la correzione seguente (allego anche il file completo) il comportamento dovrebbe essere quello giusto. Il range dei risultati si riordina correttamente mostrando in ordine decrescente dal maggiore al minore in base alla sequenza di occorrenze rinvenute. Se non è ancora questa la risposta che aspettavi, credo che servirà un esempio del risultato atteso.
Option Explicit Sub Moda() Dim n As Long Dim j As Long Dim i As Long Dim rng As Range Range("E2:F8,Z:Z").ClearContents Range("Z1") = "header" n = Application.CountA(Range("B:B")) Set rng = Range("B2:B" & n) rng.Copy Range("Z2") n = Range("Z2").CurrentRegion.Cells.Count Range("Z:Z").RemoveDuplicates Columns:=1, Header:=xlYes n = Range("Z2").CurrentRegion.Cells.Count - 1 j = 2 For i = 1 To n Cells(j, "E") = Cells(i + 1, "Z") Cells(j, "F") = Application.CountIf(rng, Cells(i + 1, "E")) j = j + 1 Next Range("E1:F" & j - 1).Sort Range("F2"), xlDescending, Header:=xlYes Range("Z:Z").ClearContents End SubAllegati:
You must be logged in to view attached files.Bene, però attenzione che il codice è pesantemente influenzato dalla struttura del file. Se cambi la posizione dei range devi adattare il codice di conseguenza (sarebbe meglio generalizzarlo ricorrendo a nomi definiti invece che riferimenti di range e celle).
Se per adesso ti accontenti, puoi marcare come Risolto il thread 🙂
-
AutoreArticoli
