Condividi:        

Excel Eliminare numeri doppi

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: Excel Eliminare numeri doppi

Postdi Statix » 28/05/09 12:43

Ciao Flash
tutto ok,grazie
la macro funziona benissimo,ed è molto veloce.
colgo l'occasione per ringraziare anche Ricky53
Statix
Windows 10,
Office 2013,
Statix
Utente Senior
 
Post: 1287
Iscritto il: 12/05/06 21:55
Località: Provincia di Caserta

Sponsor
 

Re: Excel Eliminare numeri doppi

Postdi ricky53 » 28/05/09 18:38

Ciao,
alla prossima.
Buon proseguimento.

Ciao da Ricky53
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Excel Eliminare numeri doppi

Postdi ricky53 » 29/05/09 00:38

Ciao a tutti,
ho riletto con attenzione la macro di Flash.
Mi permetto di scrivere alcune note su questa macro con l’intento di essere utile ad alcuni utenti per migliorare ed ottimizzare il codice che scriveranno in futuro:

1. le variabili vanno sempre definite, per le numeriche preferibilmente evitare Integer (accetta come valore massimo 65536)
2. utilizzare sempre “option explicit” (controlla che le variabili siano state definite)
3. evitare “GoTo”
4. si può sostituire
Worksheets("Foglio1").Range("U" & R & ":IV" & R).Delete Shift:=xlToLeft
(cancella tutte le celle fino alla colonna “IV”: è eccessivo)
con
Worksheets("Foglio1").Range(Cells(R, 21), Cells(R, 30)).ClearContents
5. si possono anche eliminare le variabili di appoggio Valore e Valore2 utilizzando al posto di:
If Valore = Valore2 then
la seguente
if Worksheets("Foglio1").Cells(R, I).Value = Worksheets("Foglio1").Cells(R, e).Value then


Riporto la macro di Flash (che funziona bene ed è veloce): ho tolto i “GoTo”
uno era inutile essendo l’IF in un ciclo,
un altro l’ho sostituito con “Exit For”
nell’ultimo ho invertito l’IF.
Ho tolto, infine, le tre label diventate inutili.

Ecco come l’ho modificata: è più leggibile ed anche ottimizzata:

Codice: Seleziona tutto
 
Option Explicit
Public UC As Single, UR As Single, E As Single, I As Single, R As Single
Sub EliminaCol_New()
    Application.ScreenUpdating = False
    Worksheets("Foglio1").Activate
    UR = Worksheets("Foglio1").Range("A" & Rows.Count).End(xlUp).Row
    For R = 1 To UR
        UC = Worksheets("Foglio1").Range("IV" & UR).End(xlToLeft).Column
        For I = 1 To UC
            If Worksheets("Foglio1").Cells(R, I).Value <> "" Then
                For E = I + 1 To UC
                    If Worksheets("Foglio1").Cells(R, I).Value = Worksheets("Foglio1").Cells(R, E).Value Then
                        Worksheets("Foglio1").Cells(R, E).Delete Shift:=xlToLeft
                    End If
                Next E
                If I = 20 Then
                    Worksheets("Foglio1").Range(Cells(R, 21), Cells(R, 30)).ClearContents
                    Exit For
                End If
            End If
        Next I
    Next R
    Worksheets("Foglio1").Range("A1").Select
    Application.ScreenUpdating = True
End Sub


Spero di non essere risultato saccente ed antipatico e, comunque, sono animato dalle migliori intenzioni per aiutare gli utenti di questo forum.

Ciao a tutti da Ricky53
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Excel Eliminare numeri doppi

Postdi Flash30005 » 29/05/09 10:09

ricky53 ha scritto:1. le variabili vanno sempre definite, per le numeriche preferibilmente evitare Integer (accetta come valore massimo 65536)
2. utilizzare sempre “option explicit” (controlla che le variabili siano state definite)
3. evitare “GoTo”
4. si può sostituire
Worksheets("Foglio1").Range("U" & R & ":IV" & R).Delete Shift:=xlToLeft
(cancella tutte le celle fino alla colonna “IV”: è eccessivo)
con
Worksheets("Foglio1").Range(Cells(R, 21), Cells(R, 30)).ClearContents
5. si possono anche eliminare le variabili di appoggio Valore e Valore2 utilizzando al posto di:
If Valore = Valore2 then
la seguente
if Worksheets("Foglio1").Cells(R, I).Value = Worksheets("Foglio1").Cells(R, e).Value then

Q8 quanto detto per le specifiche di una macro e per velocizzare ma....
ho utilizzato i Goto per eliminare i numeri doppi consecutivi
per verificare ho inserito 30 segni 2 consecutivi
Codice: Seleziona tutto
2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2

la macro per le specifiche avute ne dovrebbe lasciare solo 1
senza i goto
ne lascia 4
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: Excel Eliminare numeri doppi

Postdi ricky53 » 29/05/09 14:26

Ciao,
è un caso limite quello che proponi ma va preso in considerazione.

il GoTo che ho tolto e che induce l'errore è quello di "ricomincia":
se non si trova di meglio si può ripristinare solo questo "GoTo".

Per il resto non ci sono problemi e le modifiche che ho apportato non creano anomalie.

Queste nostre dissertazioni sono sicuramente utili a tutti.

Ciao da Ricky53
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Excel Eliminare numeri doppi

Postdi Anthony47 » 29/05/09 14:56

Le raccomandazioni di Ricky sono certamente utili, direi che sono "molto importanti" quando si tratta di macro di una certa complessita' (vedi option explicit, per evitare errori clamorosi a causa di variabili digitate in modo diverso) o di lunga o frequente elaborazione o nel caso di User functions , vedi la definizione delle variabili.
Per le variabili, il mio suggerimento e' di usare il tipo di dati meno esigente in termine di risorse, compatibile con il contesto, con validita' Public qualora le stesse variabili debbano mantenere il contenuto.
Nel caso specifico, elaborazione una tantum su un array di 30*700, io mi sarei fermato alla prima macro funzionante...

Giacche' ci siamo, do' il mio contributo con questa versione:
Codice: Seleziona tutto
Sub primi20()
Application.ScreenUpdating = False
[AE1] = Timer
OutSh = "Foglio3"    'Foglio di Uscita
IRange = "A1:AD1"    'Colonne dati
LastR = Cells(Rows.Count, 1).End(xlUp).Row
For Each Cell In Range(IRange).Resize(LastR)
 If Application.WorksheetFunction.CountIf(Range(Cells(Cell.Row, 1), Cell.Address), Cell.Value) < 2 Then
 Cell.Copy Destination:=Sheets(OutSh).Cells(Cell.Row, 111).End(xlToLeft).Offset(0, 1)
End If
Next Cell
Sheets(OutSh).Range("V:AG").ClearContents
[AE2] = Timer
End Sub

Crea l' elenco su un foglio diverso dal corrente, quello che contiene i dati; si esegue circa nel 60% del tempo impiegato dalla macro precedente; e sappiamo che 5 secondi in qualche caso fanno la differenza... :D

Il valore max gestito dal tipo integer e' +/-32000 e qualcosa

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

Re: Excel Eliminare numeri doppi

Postdi ricky53 » 30/05/09 07:53

Ciao Anthony,
le istruzioni sono molto ottimizzate, mi piace.
Buona la scelta di non cancellare le celle (in effetti era una richiesta particolare), è sicuramente meglio creare una copia come hai consigliato tu.
Mi è venuto da pensare che l'utilizzo di "cell.copy" potesse rallentare l'esecuzione e, provandola su una matrice 30x622 (l'esempio di Statix), ha impiegato tanto (circa 23-24 secondi) e fronte di 4-5 secondi delle altre macro.
Senza la copy impiega 5-6 decimi di secondo. (Con il mio PC, ma differenza con un altro è stata di 0.5-1 secondi su 23-24)
Puoi riscontrarlo?

Sul valore massimo di integer ho scritto senza pensare il valore del numero massimo di righe con Excel 2003 invece che il suo valore effettivo :
Il valore massimo (pos/neg) di una variabile integer si determina con
65536/2 -1 ossia 32767.

"SORRY" per aver scritto cose non esatte.

Ciao da Ricky53
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Excel Eliminare numeri doppi

Postdi Anthony47 » 30/05/09 15:41

Avevo confrontato le macro con una matrice randomicamente generata di 30*700 ottenendo tempi medi di 9 vs 15 secondi (+/-0,5); con la matrice di Statix ottengo 8 vs 14 (+/-0,5) sec.
I miei pc non sono particolarmente prestanti, e mediamente ne faccio il boot una volta a settimana (in genere faccio solo iberna o stand-by); quindi i tempi sono piu' da confrontare che da valutare in assoluto.
Ho capito che su un tuo pc la macro EliminaCol_New gira in 4-5 secondi vs 23-24 di Primi20; questo e' drasticamente diverso da quanto ho misurato io, e non ho una spiegazione.
L' istruzione Cell.copy etc etc e' il cuore della macro Primi20, e' scontato che senza di essa la macro dura pochissimo, ma non fa niente!

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

Re: Excel Eliminare numeri doppi

Postdi ricky53 » 02/06/09 01:37

Ciao Anthony,

ho fatto altre prove:

con la seguente istruzione:
Sheets(OutSh).Cells(Cell.Row, 111).End(xlToLeft).Offset(0, 1) = Cells(Cell.Row, Cell.Column)

il tempo di esecuzione della tua macro si riduce di tantissimo ed arriva a 1,5-1,8 secondi (partendo dai soliti 23-24 secondi).

Ho provato anche su un altro PC:
Processore x86 Family 15 Model 47 Stepping 2 AuthenticAMD ~2211 Mhz
Memoria fisica totale 2.048,00 MB
Memoria fisica disponibile 1,07 GB

Stessi risultati 22-23 secondi.

Ciao da Ricky53
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Excel Eliminare numeri doppi

Postdi Anthony47 » 02/06/09 21:31

Ti confermo l' improvement prodotto dalla tua istruzione anche sulla mia macchina: da 9 a 3 sec! Ma a questo punto l' ulteriore improvement e' dato dall' uso del piu' ovvio
Codice: Seleziona tutto
Sheets(OutSh).Cells(Cell.Row, 111).End(xlToLeft).Offset(0, 1) = Cell.Value
Che taglia da 3 a 2-2,2 secs

Rimane il mistero del tempo di esecuzione lunghissimo della Primi20 originale, ma questo credo che non lo sveleremo adesso.

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

Re: Excel Eliminare numeri doppi

Postdi ricky53 » 03/06/09 00:06

Ciao,
direi che non si può ottimizzare di più: che squadra che siamo.

Però anche se il tuo PC è più lento (quello che a me lo dava a 1,5-1,8 a te lo da a 3) confermi, comunque, la notevole diminuzione.

Con la nuova soluzione i tempi sono 1,5-1,6 (scendono di poco).
Buona per il futuro.

Ciao da Ricky53
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "Excel Eliminare numeri doppi":


Chi c’è in linea

Visitano il forum: Nessuno e 47 ospiti