Condividi:        

Estrarre i 5 valori piú alti in una colonna

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Re: Estrarre i 5 valori piú alti in una colonna

Postdi RaeleaR » 26/02/15 21:02

lo faccio senz'altro Flash, avevo giá cominciato a studiarmi la tua soluzione e sono felice che l'equivoco si sia risolto.
Grazie
Rael
Win 8.1 - Office 2010 Esp
Avatar utente
RaeleaR
Utente Junior
 
Post: 70
Iscritto il: 26/09/14 08:55
Località: Argentina

Sponsor
 

Re: Estrarre i 5 valori piú alti in una colonna

Postdi Anthony47 » 26/02/15 23:44

Il DTPicker fa parte dei "common controls" contenuti nella libreria MSCOMCT2.OCX.
Se lo selezioni nella userform e apri la finestra proprieta' (si apre con F4) puoi vederne le varie proprieta'.
Una descrizione la trovi qui: https://msdn.microsoft.com/en-us/librar ... 60%29.aspx
Non credo che sia in grado di selezionare "persone o dati", credo che sia solo il frutto di una pessima traduzione dall' inglese.
Nella parte " WorksheetFunction.max(shLib.etc etc" MAX e' rimasto in minuscolo perche' non ho utilizzato la compilazione assistita (cioe' l'ho scritta tutta da tastiera).
Match corrisponde all' istruzione CONFRONTA (CORRESP?), la cui descrizione e' nell' help on line di Excel; con False si cerca una corrispondenza esatta; con 1 o -1 la funzione restituisce dei valori "di soglia", purche' l' elenco sia in ordine crescente o decrescente (non ricordo e non ha interesse ricordare quale sia l' ordinamento, lo leggo all'occorrenza nell' help on line). Nella nostra applicazione ci serve la ricerca del valore esatto, da cui l' uso di False.
E' esatta la tua lettura dell' "If Not IsError(CRow)"; e poiche' puo' anche andare in errore (es se cerchi il 5° valore in un elenco di 4 valori), quell' If non ha solo un Then ma anche un Else.

Per tranquillizzarti concludo dicendo che anche le mie macro "funzionano senza creare problemi (quando ben fatte)" :D

Ciao a tutti!
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Estrarre i 5 valori piú alti in una colonna

Postdi Flash30005 » 27/02/15 03:58

Leggi quanto scritto da Anthony
intanto ho voluto rendere più snella la macro eliminando la Select Case quindi nel comando optLib_Click inserisci questo codice
e Stop (non occorre alcuna macro nel modulo)

Codice: Seleziona tutto
'XXX Si vogliono visualizzare i 5 Libri piú venduti    '<<<<<<<<<<< tua informazione esistente
Private Sub optLib_Click()
Dim Miomax As Long, MioMin As Long, MMax As Long, RR1 As Long, URD As Long
Dim CM As Integer
Dim TxV, TxA, TMax
Miomax = Evaluate("Max(D:D)")
MioMin = Evaluate("Min(D:D)")
CM = 0
URD = Range("D" & Rows.Count).End(xlUp).Row
For MMax = Miomax To MioMin Step -1
    For RR1 = 5 To URD
    TxV = Range("A" & RR1).Value
    TxA = Range("B" & RR1).Value
    TMax = Range("D" & RR1).Value
        If Range("D" & RR1).Value = MMax Then
            CM = CM + 1
            UserForm1.Controls("txtRefLi" & CM) = TxV
            UserForm1.Controls("txtTitAut" & CM) = TxA
            UserForm1.Controls("txtQnt" & CM) = TMax
            If CM >= 5 Then Exit Sub
        End If
    Next RR1
Next MMax
End Sub


Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Estrarre i 5 valori piú alti in una colonna

Postdi RaeleaR » 01/03/15 06:14

Flash ..ho appena finito di studiarmi il codice che mi hai proposto e voglio ringraziare entrambi (Flash & Anthony) nuovamente..

..diró una cosa banale, forse.. la cosa piú interessante quando ci sono due apporti a questi livelli (ma in generale.. in definitiva non é solo una questione di livello) é che la mente ti si apre.. si ha la possibilitá di imparare a guardare e approcciare lo stesso problema da piú angolature ed é una cosa che arricchisce enormemente..

Adesso le domande.. :)

@Flash : - non conoscevo la funzione Evaluate..
- ho trovato molto interessante il sistema di ciclare tra i valori di miomax e miomin
- forse sbaglio ma, mi domando sarebbe possibile fare a meno delle due righe qui di seguito?
Codice: Seleziona tutto
    TxV = Range("A" & RR1).Value
    TxA = Range("B" & RR1).Value


lasciando il compito della verifica alla sola riga di TMax? :) vabbé dopo lo provo :)
- interessante per non dire 'figo' il sistema di CM che serve poi per indirizzare il dato corretto nei vari Controls :)

@Anthony : quando dicevo
..com'é che funziona con 'max' scritto minuscolo?

riferendomi a questa riga
cMax = Application.WorksheetFunction.max(shLib.Range("D5").Resize(l - 4, 1))

non mi ero ancora accorto che succede una moolto strana:
se correggo con la 'm' maiuscola, appena cambio riga la 'm' torna ad essere minuscola..
ho provato ad aprire un nuovo foglio di lavoro e questo non succede, ma quando ho provato a copiargli una parte del codice della Sub in questione la 'm' é diventata minuscola anche nel nuovo foglio di lavoro. Ho provato in tutti i modi, ma cambia sola.. qualche idea? ..in tutti i modi il codice anche con la m minuscola funziona.
Rael
Win 8.1 - Office 2010 Esp
Avatar utente
RaeleaR
Utente Junior
 
Post: 70
Iscritto il: 26/09/14 08:55
Località: Argentina

Re: Estrarre i 5 valori piú alti in una colonna

Postdi Flash30005 » 01/03/15 15:12

Avrai notato sicuramente che uso macro elementari e di facile comprensione, il motivo?
perché non dedico più tempo ad imparare quelle "professionali" e più sofisticate :D

veniamo alle risposte (che mi riguardano)
queste due righe
TxV = Range("A" & RR1).Value
TxA = Range("B" & RR1).Value
si possono eliminare (ma anche la terza variabile può essere eliminata "TMax ") se si inserisce nella condizione questo codice
Codice: Seleziona tutto
            CM = CM + 1  '<<<< esistente
            UserForm1.Controls("txtRefLi" & CM) = Range("A" & RR1).Value '<<< modificata
            UserForm1.Controls("txtTitAut" & CM) = Range("B" & RR1).Value '<<< modificata
            UserForm1.Controls("txtQnt" & CM) = Range("D" & RR1).Value '<<<< modificata

Credo che abbia capito che con Evaluate prefiggo il valore massimo e minimo di un range (non sapendo come potranno essere i dati se da 1 a 10 o da 201 a 25000 o oltre oppure da 1,1 a 203,3)
avendo i due valori effettuo un for next dal massimo al minimo e, nel tuo caso essendo numeri interi lo step è -1 (e non -0,1 che effettuerebbe la scansione dei decimali)
quindi mentre MMax passerà dal valore massimo al minimo (essendo step -1)
le UserForm1.Controls("...
acquisiranno il valore della cella corrispondente Riga = RR1 e colonna A, B, D

Supponendo di avere il massimo 10 e il minimo 1 distribuite in 6 righe consecutive
9 (riga1)
10 (riga2)
7 (riga3)
2 (riga4)
1 (riga5)
8 (riga6)
devo trovare il valore massimo che so essere 10 (con evaluate)
quindi
For MMax = Miomax To MioMin Step -1 (inizia da 10 e termina a 1)
For RR1 = 1 To 6 (inizia dalla riga 1 e arriva alla riga 6)
If Range("D" & RR1).Value = MMax Then (controlla se il valore in riga corrisponde al valore "MMax" che si sta considerando (in quanto diminuisce ad ogni step)
se corrisponde viene compilata una parte della maschera (i 3 textbox corrispondenti)

Spero di essere stato esaustivo e comprensibile
ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Estrarre i 5 valori piú alti in una colonna

Postdi Anthony47 » 01/03/15 21:23

Perdonate.... Calcolare in modo diretto quale e' il prossimo valore e non tramite un loop che scansiona tutti i numeri sotto una certa soglia non e' ne' professionale ne' sofisticato; e' semplicemente "logico".

Per quanto riguarda il mistero del "max", in effetti avevo detto una cavolata (anche se non si usa la compilazione assistita il vba mette sempre le maiuscole al punto giusto).
Nel caso in questione, ti hai avuto la cattiva idea di definire una variabile con lo stesso nome di una parola chiave (vedi Dim r, l, I, max), quindi il compilatore sintattico usera' "min" della variabile; fortunatamente il compilatore semantico ignorera' la variabile "max" e alla proprieta' WorksheetFunction associera' il metodo Max, e tutto funziona come deve funzionare.

Ciao a tutti
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Estrarre i 5 valori piú alti in una colonna

Postdi RaeleaR » 04/03/15 02:52

@ Flash, chiarissimo ed esaustivo, grazie Flash ne farò tesoro.

@ Anthony, solo un'ultima info.. ma questo problema della m minuscola.. per far si che scompaia l'unica è riscrivere il codice della userform, solo quello della Sub o non c'è nulla da fare? o meglio ho solo verificato che scompare aprendo un nuovo foglio di calcolo.. ma era ovvio..
Rael
Win 8.1 - Office 2010 Esp
Avatar utente
RaeleaR
Utente Junior
 
Post: 70
Iscritto il: 26/09/14 08:55
Località: Argentina

Re: Estrarre i 5 valori piú alti in una colonna

Postdi Anthony47 » 04/03/15 15:38

Elimina la dichiarazione della variabile "max", che nel codice che ti ho proposto non e' piu' utilizzata.
Cioe, invece di Dim r, l, I, max metti solo
Codice: Seleziona tutto
Dim r, l, I

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Estrarre i 5 valori piú alti in una colonna

Postdi RaeleaR » 04/03/15 19:28

Anthony, lo avevo già fatto (cambiare o cancellare max come variabile) dopo che mi hai fatto notare la cosa qualche post fa.. ho fatto anche un controllo in tutti i progetti con MZ-Tool per essere sicuro di non lasciare qualcosa in giro..

non voglio scocciare con questo problema, infondo funziona.. è solo per capire
Rael
Win 8.1 - Office 2010 Esp
Avatar utente
RaeleaR
Utente Junior
 
Post: 70
Iscritto il: 26/09/14 08:55
Località: Argentina

Re: Estrarre i 5 valori piú alti in una colonna

Postdi RaeleaR » 08/03/15 15:19

Anthony scusami, c'é ancora una cosa che non ho capito nella funzione Application.Match.

Nelle righe dove assegnamo il valore da mostrare nel Control ..

Me.Controls("txtRefLi" & i).Text = shLib.Range("B11").Offset(ValRga - 1, 0).Value

perché nell'Offset scriviamo (ValRga - 1) ? é il meno 1 che non capisco.. puoi aiutarmi?

grazie anticipatamente
Rael
Win 8.1 - Office 2010 Esp
Avatar utente
RaeleaR
Utente Junior
 
Post: 70
Iscritto il: 26/09/14 08:55
Località: Argentina

Re: Estrarre i 5 valori piú alti in una colonna

Postdi Anthony47 » 08/03/15 17:34

Faccio riferimento al codice che avevo usato io:
Codice: Seleziona tutto
            cMax = Application.WorksheetFunction.max(shLib.Range("D5").Resize(l - 4, 1))
            CRow = Application.Match(cMax, shLib.Range("D5").Resize(l - 4, 1), False)
            If Not IsError(CRow) Then
                Me.Controls("txtRefLi" & i).Text = shLib.Range("A5").Offset(CRow - 1, 0).Value

Poiche' CRow e' calcolato con la funzione Match = Confronta, esso sara' 1 per la prima riga dell' intervallo usato per il Match, 2 per la seconda, e cosi' via.
Per rimanere sulla prima riga, l' Offset deve essere pero' 0, se la riga di origine e' la stessa usata in Match (D5 e A5, rispettivamente).

Piu' chiaro?
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Estrarre i 5 valori piú alti in una colonna

Postdi RaeleaR » 08/03/15 19:07

ma si! cavolo.. che tonto.. trattandosi di un Offset i valori della riga partono da zero (cioé quando si tratta della riga stessa).. invece il CRow cicla in un range il cui primo valore é 1 quindi per "pareggiare" il conto ..devo sottrarre 1 a CRow..
Grazie Anthony
Rael
Win 8.1 - Office 2010 Esp
Avatar utente
RaeleaR
Utente Junior
 
Post: 70
Iscritto il: 26/09/14 08:55
Località: Argentina

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "Estrarre i 5 valori piú alti in una colonna":


Chi c’è in linea

Visitano il forum: Nessuno e 64 ospiti