Condividi:        

[Excel] Ordinamento Numeri

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

[Excel] Ordinamento Numeri

Postdi sax » 15/11/06 15:59

Ho la necessità di ordinare 4 numeri che si trovano nelle colonne da W a Z ed inserire i numeri già ordinati nelle colonne da AA a AD senza avere i passaggi di mezzo come nel file in allegato, che ho trovato e modificato a secondo le mie esigenze.

http://www.freefilehosting.net/?id=rdj1lqXY8Q==

Grazie per l'aiuto
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Sponsor
 

Postdi sax » 15/11/06 20:52

Ho proposto un esempio errato infatti non sempre tutte le caselle sono piene come nel file di esempio, appena riesco posto un esempio
non riesco ad inviarlo

in ogni caso nella prima colonna vi dovra essere un numero fra 6.5 e 10.5 nella seconda un numero fra 10.51 e 13.50 nella terza un numero fra 13.51 e 15.5 e nella quarta un numero fra 15.51 e 23.99

[/url]
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Postdi Anthony47 » 16/11/06 01:57

Ciao,
prova in AA7 la formula
=SE(VAL.ERRORE(GRANDE($W$7:$Z$7;1));"";GRANDE($W$7:$Z$7;1))
che poi copi nelle celle adiacenti CAMBIANDO pero' il numero di posizione:
Se vuoi il piu' grande in AA e il piu' piccolo in AD, metti 1 in AA, 2 in AB, 3 in AC e 4 in AD
Se li vuoi in ordine inverso, 4 in AA etc

Facci sapere, ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi sax » 16/11/06 07:54

Adesso Dovrebbe Essere più chiaro
la soluzione di anthony che ho aggiunto nell'ultima riga dell'esempio mi consente sempre di ordinare i numeri ma non evita le caselle con lo zero ed ho lo stesso problema
Ciao
http://www.freefilehosting.net/?id=rdj1l63a/A==
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Postdi Anthony47 » 16/11/06 17:13

Mi pare che sei sempre alla ricerca di una soluzione per gestire orari di lavoro di una popolazione probabilmente indisciplinata…
Secondo me il problema non e’ risolvibile in modalita’ automatica, anche per l’ impatto economico e di assunzione di responsabilita’ che sono dietro a una cartolina presenze.

Detto cio’, rispondo alla tua domanda.
Potresti ottenere quello che chiedi con il seguente metodo:
-scrivi da Z5 ad AD5 i valori 0 – 10,5 – 13,5 – 15,5 – 24 (sono soglie di min e max per le colonne sottostanti)
-metti in AA7 la formula
Codice: Seleziona tutto
=$W7*(($W7>=Z$5)*($W7<AA$5))+$X7*(($X7>=Z$5)*($X7<AA$5))+$Y7*(($Y7>=Z$5)*($Y7<AA$5))+$Z7*(($Z7>=Z$5)*($Z7<AA$5))
che poi copi nelle altre 3 colonne e nelle righe che ti servono.
Il difetto di questo ragionamento e’ che se ci sono piu’ timbrature appartenenti alla stessa fascia oraria, esse sono indecifrabili e non se ne potra' mai decidere con cognizione il significato; la formula non esamina questi conflitti.

Come ulteriore ipotesi, potresti usare la seguente macro o meglio, funzione:
Codice: Seleziona tutto
Dim matror(4) As Single
Dim indice, IO, DeltaI As Integer
Option Explicit

Function Guess(Orari, Posiz) As Single
Dim MaxInMatt, MaxOutMatt, MaxInPom, WW1, WIO1 As Single
Dim I, IErr, Compilati, Flag As Integer
Dim matrerr(4) As Single

MaxInMatt = 10.49999
MaxOutMatt = 13.4999
MaxInPom = 15.4999

For I = 1 To 4
matror(I) = 0
matrerr(I) = 0
Next I
Compilati = Application.WorksheetFunction.Subtotal(2, Orari)
If Compilati = 4 Then GoTo Stand:
For I = 1 To Compilati

WW1 = Application.WorksheetFunction.Large(Orari, I)
Select Case WW1
Case 1 To MaxInMatt
IO = 4
Case MaxInMatt + 0.0001 To MaxOutMatt
IO = 3
Case MaxOutMatt + 0.0001 To MaxInPom
IO = 2
Case MaxInPom + 0.0001 To 24
IO = 1
End Select

WIO1 = matror(IO)
If matror(IO) > 0 Then
 matrerr(IO) = matror(IO)
 End If
matror(IO) = WW1
Next I

For I = 1 To 3
If matrerr(I) = 0 Then GoTo Skip
If matror(I + 1) = 0 Then
 If matrerr(I) > matror(I) Then
 matror(I + 1) = matror(I)
 matror(I) = matrerr(I)
 Else
 matror(I + 1) = matrerr(I)
 End If
 Flag = 1
End If
If Flag = 1 Then GoTo Skip
If matror(I - 1) = 0 Then
 If matrerr(I) < matror(I) Then
 matror(I - 1) = matror(I)
 matror(I) = matrerr(I)
 Else
 matror(I - 1) = matrerr(I)
 End If
End If
Skip:
Next I
Guess = matror(Posiz)
Exit Function
'esegui se 4 celle piene
Stand:
Guess = Application.WorksheetFunction.Large(Orari, Posiz)
End Function


E’ alquanto poco lineare, ma non ho trovato tempo per semplificazioni/ottimizzazioni.

La copi min un Modulo e poi usi in AA7 la formula:
=guess($W7:$Z7;4)
che poi copi nelle altre 3 celle orizzontali, cambiando ogni volta l’ indice 4 in 3, 2, 1; poi copi le formule sulle righe che ti servono.
Questa funzione, se sono presenti 4 timbrature le mette in ordine crescente sulle celle AA-AD; se invece ce ne sono meno, le alloca secondo le soglie impostate, e se ci sono doppie timbrature nella stessa fascia fa una “sua ipotesi”.

Mi permetto pero’ di ricordare un suggerimento che avevo dato in un post del 30/07/06 ore 12:42 a proposito del tuo topic con Oggetto: [Excel] Orario lavoro effettivo dipendenti:

Io suggerirei un foglio piu’ complesso, che presenta le 4 colonne delle timbrature (A-D) piu’ 4 colonne per le correzioni manuali (E-H), piu’ 4 celle che definiscono i valori di default; da queste colonne calcolerei la presenza etc etc.


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

Postdi sax » 16/11/06 21:40

Mi pare che sei sempre alla ricerca di una soluzione per gestire orari di lavoro di una popolazione probabilmente indisciplinata…

Si vero è indisciplinata, ma che ha una certa età, e siccome nel tesserino con il codice a barre, da un lato dovrebbero timbrare l'entrata e da un altro l'uscita, non avendo gli occhiali da lettura timbrano quello che capita prima, colpa anche del programmatore che non ha saputo semplificarmi la vita con una sola timbratura qualsiasi essa sia, inoltre vi è personale che rimane in officina qundi timbra "quasi" regolarmente le due entrate e le due uscite magari saltando ogni tanto qualche timbratura per distrazione, e personale che è addetto all'esterno che magari timbra solo l'entrata o solo l'uscita a seconda se è un intervento di un giorno, o che non timbra affatto per giorni in quanto pernotta fuori città.

Mi permetto pero’ di ricordare un suggerimento che avevo dato in un post del 30/07/06 ore 12:42 a proposito del tuo topic con Oggetto: [Excel] Orario lavoro effettivo dipendenti:


Citazione:
Io suggerirei un foglio piu’ complesso, che presenta le 4 colonne delle timbrature (A-D) piu’ 4 colonne per le correzioni manuali (E-H), piu’ 4 celle che definiscono i valori di default; da queste colonne calcolerei la presenza etc etc.

La soluzione che mi hai proposto a suo tempo la sto adottando in quanto effettivamente è comodo per ovviare qualsiasi problema, però è scomodo andare a verificare uno per uno tutte le entrate e le uscite, se si tratta solo di spostare alcuni orari di casella, in questo modo posso concentrarmi solo sugli errori piu evidenti

a proposito il codice/funzione in vba mi da un errore di debug e mi evidenzia in giallo la prima riga poi clikkando su ok evidenzia altre righe di altri codici presenti nei moduli poi si blocca, invece la prima soluzione sembra funzionare bene domani provo
Grazie
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Postdi sax » 16/11/06 22:58

Provando il
Codice: Seleziona tutto
=$W7*(($W7>=Z$5)*($W7<AA$5))+$X7*(($X7>=Z$5)*($X7<AA$5))+$Y7*(($Y7>=Z$5)*($Y7<AA$5))+$Z7*(($Z7>=Z$5)*($Z7<AA$5))

come mi hai consigliato, ho notato che se due numeri sono simili, la formula da come risultato la loro somma, non si potrebbe fare che mi restituisca il numero più grande dei due ?
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Postdi Anthony47 » 17/11/06 00:30

In prima battuta preferirei far lavorare la macro invece che elaborare una formula king size.
Hai detto che va in debug sulla prima riga:
-per prima riga intendi Function Guess(Orari, Posiz) As Single?
-quale e' il messaggio di errore?
Poi, per "altre righe di altri codici" intendi altre macro gia' presenti sul tuo file? Se SI, sono macro (Sub) o Funzioni (Function), e sono inserite su un "Modulo" o sono associate a un singolo FoglioX? Se sono associate a un FoglioX, sono macro di "gestione eventi"? (es. Sub Worksheet_Activate, Worksheet_SelectionChange, Worksheet_Calculate e cose simili)

Ma soprattutto il messaggio che esce quando evidenzia la prima riga.

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

Postdi sax » 17/11/06 14:59

Copiando il codice in un altro modulo non dà più errore
ma il risultato che ottengo è sempre lo stesso, cioè se vi sono due caselle vuote e due piene mette prima quelle vuote, mentre dopo in ordine quelle piene
Ciao
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Postdi Anthony47 » 17/11/06 19:21

Per gli altri "ascoltatori", l' errore era causato dall' Option Explicit che avevo volutamente settato nella mia macro, che causava errore di compilazione a tutte le macro presenti nello stesso "Modulo"; di qui la decisione di installare in un modulo a se' stante.

Per SAX:
Questo e' quello che mi calcola la funzione, in una serie varia di casi:
- 9 - 11 - - 16 Out---> 9 / 11 / 0 / 16
- 10 - 13 - 12 - Out---> 10 / 12 / 13 / 0
- - - 10 - 16 Out---> 10 / 0 / 0 / 16
- 9 - 8 - 14 - 18 Out---> 8 / 9 / 14 / 18
- 15 - - 14 - 16 Out---> 0 / 14 / 15 / 16
- 13 - 9 - 17 - 14 Out---> 9 / 13 / 14 / 17
- 7 - 15 - - Out---> 7 / 0 / 15 / 0
- - 10 - 13 - Out---> 10 / 13 / 0 / 0
- - 11 - - 7 Out---> 7 / 11 / 0 / 0
- 13 - - - 7 Out---> 7 / 13 / 0 / 0

A sx i 4 dati in ingresso separati dal trattino (quindi "- -" significa "vuoto), e a dx le uscite separate dalla barra.
Quindi i vuoti non sono posizionati nelle prime celle di Out, ma nelle posizioni che rimangono vuote dopo aver allocato le timbrature presenti; forse nelle celle W-Z la mancata timbratura non corrisponde a cella vuota? Se e' cosi', quale e' il contenuto di queste celle, cosi' vediamo come aggiustare la macro?

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

Postdi sax » 17/11/06 22:48

Scusami hai ragione le caselle non sono vuote presentano uno 0,0 come risultato di un operazione precedente
ciao
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Postdi Anthony47 » 18/11/06 00:24

Ok.

Se puoi, modifica la formula di entrata affinche' invece che 0 ci sia una stringa vuota ("").
Oppure cambia da
Compilati = Application.WorksheetFunction.Subtotal(2, Orari)
a
Codice: Seleziona tutto
Compilati = Application.WorksheetFunction.CountIf(Orari, ">0")


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

Postdi sax » 18/11/06 11:50

Grazie
Ho optato per la seconda soluzione

Le probabilità di errore si sono ridotte al minimo in questo modo.

Sei Grande
Ciao a tutti
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Ordinamento Numeri":


Chi c’è in linea

Visitano il forum: Nessuno e 50 ospiti