Condividi:        

[Excel] Ordinamento a condizione

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 a condizione

Postdi -Io- » 17/01/07 17:16

Ciao a tutti,
è un po' che manco dal forum, ma... beh, rieccomi qui :D .
Il mio problema odierno è il seguente: ho una tabella contenente i seguenti dati: Codice, Cognome, Nome, Titolo di studi, Scuola, Data diploma, Voto (tutti i dati inseriti sono di tipo "Generale", tranne "Data diploma" che è di tipo "Personalizzato" -gg/mm/aaaa). Ora, a me serve una funzione che ordini tutti questi dati in ordine crescente secondo la data di conseguimento del diploma (primo criterio di ordinamento) e, poi, in base al codice (secondo criterio di ordinamento)... Non avrei problemi a farlo, ma il problema sorge qui: io devo fare in modo che questa tabella si ordini automaticamente ogni volta che inserisco una nuova riga (tenendo presente che Titolo di studi, Scuola e Voto possono rimanere vuoti). Qualche buon'anima che mi aiuti c'è ancora al mondo :P ?
Grazie.
-Io-
Utente Senior
 
Post: 137
Iscritto il: 20/02/06 14:44
Località: Gargnano

Sponsor
 

Postdi Anthony47 » 18/01/07 13:31

Ciao –Tu-,
Secondo me la soluzione piu’ realistica per realizzare quello che chiedi e’ in pulsante a cui associ la macro che esegue l’ ordinamento, che puoi facilmente registrare.
Sarebbe anche possibile utlilizzare eventi quali Worksheet_Change per comandare l’ ordinamento in automatico, ma questa soluzione credo che determini delle situazioni ambigue nel determinare quando una nuova linea e’ stata inserita “completamente”.

Alternativa piu’ valida sarebbe quella di gestire la compilazione / variazione SOLO tramite Form, ma forse la complessita’ che ne deriva non e’ giustificata dalla tua applicazione.

Una via di mezzo potrebbe essere quella del pulsante (come suggerito sopra) con l’ aggiunta di un promemoria che ricorda all’ utente la necessita’ di eseguire l’ ordinamento; ad esempio:
-in cella I1 scrivi la formula =SE(SOMMA(F2:F65536)=J1;"";"Eseguire Ordinamento !")
-nella macro che ordina, inserisci queste istruzioni prima di End Sub:
Codice: Seleziona tutto
Set FRange = Range("F2:F65536")
Range("J1").Value = Application.WorksheetFunction.Sum(FRange)

PRESUPPONE che I1 e J1 siano libere!; adatta formula in I1 e la macro (istruzione Range(“J1”).Value etc etc ) se usi altre celle.

In questo modo, se e’ stata inserita una nuova data o cambiata una data esistente, in I1 compare il messaggio “Eseguire Ordinamento !”. Inserisci il pulsante di “Ordinamento” accanto alla cella I1, quindi accanto a questo promemoria e in modo da nascondere il contenuto di J1, e us il "Blocca riquadi" in modo da tenerlo sempre visibile.

Se hai bisogno di altro, fatti sentire.
Ciao,
Avatar utente
Anthony47
Moderatore
 
Post: 19222
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi -Io- » 18/01/07 14:58

Grazie del suggerimento: presenterò la tua soluzione alternativa a chi mi ha chiesto di risolvere il problema da me esposto. Però, mentre aspettavo aiuto, ho dovuto lavorarci sopra comunque e ho risolto in questo modo: una volta in VB, seleziono il foglio in cui mi interessa eseguire l'ordinamento e ci scrivo questo codice
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("F1:F65536")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then
    ThisWorkbook.ordina

End If

End Sub


Dopodichè, seleziono ThisWorkbook e lì ci inserisco quest'altro codice:
Codice: Seleziona tutto
Sub ordina()
MsgBox ("Ordinamento in corso...")
 Range("A2:G65536").Select
    Selection.Sort Key1:=Range("F2"), Order1:=xlAscending, Key2:=Range("A2") _
        , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
        False, Orientation:=xlTopToBottom
End Sub


In questo modo ordina in base ai criteri che mi servivano (data e codice) sia che tutti i campi siano compilati, sia che qualcuno sia vuoto, purchè il campo Data diploma sia pieno perchè l'ordinamento avviene soltanto una volta popolata la cella corrispondente alla data. Quindi, almeno nelle prove che ho fatto, inserivo il codice, Cognome e Nome diplomato e poi la data e, finito di inserire quest'ultima, compariva il messaggio ed eseguiva l'ordinamento.

Ah, giusto per rendere giustizia a colui che mi ha dato lo spunto: ho controllato anche qui e "corretto" secondo i suggerimenti che ho trovato sul sito della Microsoft, mi pare.
-Io-
Utente Senior
 
Post: 137
Iscritto il: 20/02/06 14:44
Località: Gargnano

Postdi Anthony47 » 18/01/07 19:43

Il problema che nasce usando l' evento Worksheet_Change e' che appena si compila la data il foglio viene riordinato; a quel punto, dove ritrovo la riga che stavo compilando, se voglio aggiungere anche il campo "Voto"? E' chiaro che se parliamo di 20 righe il problema e' minimo, ma se sono "qualche paginata" diventa dura.
O no?

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

Postdi -Io- » 19/01/07 10:13

Non è un problema mio, questo ;) , cmq grazie per l'appunto. Farò presente anche questo, oltre alla tua soluzione ;) .
Adesso, xò, ho un altro problema (non c'entra con l'ordinamento, ma fa sempre parte di questo progetto, quindi non mi sembra giusto aprire un altro topic e intasare il forum): devo calcolare una specie di scadenza, cioè, per esempio: la mia data inserita è 1/5/84; io devo calcolare 6 mesi meno un giorno dopo, in pratica mi deve risultare 30/11/84. Come si può risolvere questo (anche senza macro se non servono, eh ;) )?
-Io-
Utente Senior
 
Post: 137
Iscritto il: 20/02/06 14:44
Località: Gargnano

Postdi Anthony47 » 19/01/07 11:37

Hai bisogno di calcolare esattamente 6 mesi (useremo le funzioni DATA e MESE) o ti basta una approssimazione tipo +180 gg (faremo solo Data1+180)? e la data di partenza e' quella segnata qualsiasi essa sia, o l' ultimo gg del mese (come nel caso di una scadenza fattura)? E se il giorno risultante e' un festivo devi fare qualche altra elaborazione?

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

Postdi -Io- » 19/01/07 11:55

Anthony47 ha scritto:Hai bisogno di calcolare esattamente 6 mesi (useremo le funzioni DATA e MESE)

Non possono essere, credo, 6 mesi esatti: devono essere 6 mesi meno un giorno (es: 2/2/02 -> 1/8/02)

o ti basta una approssimazione tipo +180 gg (faremo solo Data1+180)?
L'approssimazione in giorni non credo che vada bene: sto facendo delle prove per testarla e mi sballa, per esempio nel caso 2/5/84 -> dovrebbe venire 1/11/84 e invece dà 29/10/84.
e la data di partenza e' quella segnata qualsiasi essa sia, o l' ultimo gg del mese (come nel caso di una scadenza fattura)?

No no, la data di partenza è quella, qualsiasi essa sia.
E se il giorno risultante e' un festivo devi fare qualche altra elaborazione?
Ciao.

Non ho ricevuto disposizioni per questo, ma credo proprio di sì (tipo, se la scadenza cade di sabato, bisogna anticiparla a venerdì). Su questo punto fornirò maggiori indicazioni domani.

Avrei trovato una funzione che fa al caso mio, ma con Office 2000 non c'è! Tale funzione è DATA.MESE(data_inziale;numeri mesi da aggiungere).
-Io-
Utente Senior
 
Post: 137
Iscritto il: 20/02/06 14:44
Località: Gargnano

Postdi Anthony47 » 20/01/07 00:57

Ciao –Io-
Dici che DATA.MESE non la trovi in Excel 2000, eppure sono quasi certo che c’ era gia’ in Excel 97…
Allora, se la data di partenza e’ in A2, puoi usare questa formula: =DATA(ANNO(A2)+SE(MESE(A2)>6;1;0);MESE(A2)+6-SE(MESE(A2)>6;12;0);GIORNO(A2))-1

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

Postdi -Io- » 20/01/07 11:59

Non dico che non ci sia nel 2000, dico che sul computer dell'ufficio non c'è ;) (non hanno fatto un'installazione completa di Office -per esempio, non c'è il salvataggio automatico- e quindi, credo posso dipendere da quello la mancaza della funzione in questione).
Cmq adesso provo subito quella formulina magica che mi hai postato e verifico se funziona secondo il volere di chi mi ha commissionato il compito. Intanto ti ringrazio tanto per l'aiuto fornito :)
-Io-
Utente Senior
 
Post: 137
Iscritto il: 20/02/06 14:44
Località: Gargnano

Postdi -Io- » 20/01/07 14:44

Ho testato la tua formula... Beh, devo dire che sei un vero mostro (in senso buono, naturalmente ;) ): è perfetta! Grazie.

Adesso xò, non ti arrabbiare: mi servirebbe aiuto per un'altra cosa :D ... Ora ti spiego: mi hanno fatto creare un foglio di supporto (non mi chiedere x', ma è così) in cui compare una tabella Codice-Cognome che contiene i codici ed i rispettivi Cognomi. Mi hanno chiesto, dapprima di fare in modo che, se nel foglio inziale (quindi quello a cui ci siamo sempre riferiti), scrivo il codice, nella casella Cognome mi compaia automaticamente il cognome corrispondente; e fin qui nessun problema: uso un semlicissimo CERCA.VERTICALE e risolvo il problema. Ma mi hanno complicato la vita, adesso: ora vogliono "poter scegliere", cioè vogliono la possibilità di far comparire automaticamente il codice nel caso inseriscano il cognome (senza però togliere loro l'opzione precedente, cioè: se inseriscono il codice, il cognome compare automaticamente). Come posso risolverla sta cosa, adesso?
-Io-
Utente Senior
 
Post: 137
Iscritto il: 20/02/06 14:44
Località: Gargnano

Postdi Anthony47 » 21/01/07 00:04

Lo puoi fare con macro attivata dall' evento Worksheet_Change:
-controlli da quale colonna l' evento viene attivato
--se da colonna del codice allora attivi la WorksheetFunction.Vlookup (che sarebbe il Cerca.Verticale) per mettere il cognome; la sequanza di parametri da inserire e' la stessa, e puoi vedere l' help on line
--se da colonna Cognome, e se il Codice e' vuoto, allora attivi sempre WorksheetFunction.Vlookup per cercare il codice.

Ma ho l' impressione che l' analisi iniziale sia debole: mentre e' ragionevole che ci sia un solo cognome a fronte di un codice, e' difficile pensare che ci sia un solo codice a fronte del cognome Rossi.

Non ricordo quale e' la tua familiarita' con il vba, comincia e man mano che hai domande prova a chiedere.

Per quanto riguarda il salvataggio automatico, io ce l' ho su Strumenti/Opzioni, Tab Salva.

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

Postdi -Io- » 21/01/07 11:00

Anthony47 ha scritto:Lo puoi fare con macro attivata dall' evento Worksheet_Change:
-controlli da quale colonna l' evento viene attivato
--se da colonna del codice allora attivi la WorksheetFunction.Vlookup (che sarebbe il Cerca.Verticale) per mettere il cognome; la sequanza di parametri da inserire e' la stessa, e puoi vedere l' help on line
--se da colonna Cognome, e se il Codice e' vuoto, allora attivi sempre WorksheetFunction.Vlookup per cercare il codice.

Ma ho l' impressione che l' analisi iniziale sia debole: mentre e' ragionevole che ci sia un solo cognome a fronte di un codice, e' difficile pensare che ci sia un solo codice a fronte del cognome Rossi.

Non ricordo quale e' la tua familiarita' con il vba, comincia e man mano che hai domande prova a chiedere.

Ok, comincerò a lavorarci su ;) , grazie.

Per quanto riguarda il salvataggio automatico, io ce l' ho su Strumenti/Opzioni, Tab Salva.

Ciao.

Io, invece, ho controllato e richiede proprio il cd d'installazione (cmq, questa questione era portata solo come esempio; inoltre, l'ho già fatto loro presente, e mi è stato detto di non installare questa funzione.).
-Io-
Utente Senior
 
Post: 137
Iscritto il: 20/02/06 14:44
Località: Gargnano

Postdi -Io- » 29/01/07 20:21

Ehi,
oggi, mentre ero in ufficio, cercavo soluzioni alternative (purtroppo non mi fanno usare internet :( quindi ...) al mio problema e, così, per curiosità, ho tentato di fare un cerca verticale che mi inserisse automaticamente il codice corrispondente al cognome digitato. Beh, mi restituiva errore e non ho capito il perchè :eeh: ...

La soluzione illustratami da Anthony47 devo implementarla da casa, quindi non prima di sabato sicuramente, purtroppo.
-Io-
Utente Senior
 
Post: 137
Iscritto il: 20/02/06 14:44
Località: Gargnano

Postdi Anthony47 » 29/01/07 23:34

Se ti esce l' errore #N/D e' perche' la stringa che cerchi non esiste nell' elenco: guarda eventuali spazi in coda o caratteri spuri.

Se e' un altro errore, allora ..dipende.

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

Postdi -Io- » 06/02/07 12:39

Niente, non è + necessario che io ci provi: sono ufficialmente fuori dal progetto che stavo realizzando, quindi, se volete, si può anche chiudere la discussione.
Grazie per l'aiuto fornito.
-Io-
Utente Senior
 
Post: 137
Iscritto il: 20/02/06 14:44
Località: Gargnano


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Ordinamento a condizione":


Chi c’è in linea

Visitano il forum: Nessuno e 47 ospiti

cron