Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

vba2003:cercare e cancellare tutte le righe con codice=

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: vba2003:cercare e cancellare tutte le righe con codice=

Postdi scossa » 03/04/12 11:09

Anthony47 ha scritto:Ah ah, ho beccato proprio la zona di minore performances della tua macro! (a mia scusante c' e' che avevo sempre fatto le prove in queste condizioni: 5000 linee con circa 2000 valori unici)

-con tantissime o pochissime cancellazioni la tecnica Set Rng/Union vince alla grande; questo e' dovuto al fatto che le aree da unire sono sempre poche.
-con una situazione tipo 50/50 altri approcci possono essere vantaggiosi


Ottima analisi Anthony, infatti, il problema è proprio nel numero di aree discontinue (vedi mio post sopra).
Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 424
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Sponsor
 

Re: vba2003:cercare e cancellare tutte le righe con codice=

Postdi Anthony47 » 03/04/12 13:20

La spiegazione tecnica era chiara ora e' chiarissima.
Non si puo' usare sInd = Cells(I, 1).Address / set rng = range(sInd) che e' limitata a 30 intervalli.
Tecnicamente l' uso di CountIf, Collection, Dictionary richiedono un tempo compreso tra 0,5 e 1 secondo per identificare i valori duplicati; l' uso di Set Rng/Union vince per "lavorare" elenchi poco frammentati (quindi o tantissime o pochissime ripetizioni), il tradizionale Sheets("Riepilogo").Cells(I, 1).Resize(1, 6).Delete fa un onesto lavoro in casi di forte frammentazione (1-2 linee da mantenere intercalati da 1-2 linee da rimuovere).
L' unica alternativa ulteriore che mi viene in mente e' quella "full array"; una versione inclusa nel file di test (deldupLC) non e' ottimizzata e da' risultati scadenti.
Se mi avanza tempo faro' ulteriori tentativi, che saro' lieto di condividere con voi.

Karug immagino che sia a posto gia' da un paio di giorni e lo aspettiamo al prossimo quesito.

Ciao a tutti.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13895
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: vba2003:cercare e cancellare tutte le righe con codice=

Postdi ricky53 » 03/04/12 17:26

Ciao,
io con l'utilizzo di una "ARRAY" a 5000 righe e 6 colonne, che viene caricata con l'intero intervallo e poi lavorando su di essa producendo un'altra array con i soli dati non duplicati e copiando, dopo aver cancellato i dati preesistenti, la nuova array sull'intervallo del foglio ottengo tempi ( con i dati di Anthony 5000 righe 1965 dati univioci) di 1,4 secondi (sempe sullo stesso PC sul quale ho fatto le prove delle vostre macro) che direi non male ... ho scritto il codice in modo che non mi piace ma l'ho fatto due notti fa velocemente senza più riguardarlo ... se ho tempo lo rimetto in ordine e ve lo invio per migliorarlo.
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. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: vba2003:cercare e cancellare tutte le righe con codice=

Postdi karug64 » 03/04/12 19:13

Salve a tutti.
Rientro nella discussione, non per apportare un contributo alle analisi fatte da voi (perche' non ne sono assolutamente in grado), ma per sottoporre alla vostra attenzione (cosi' come richiesto da Ricky) la base dati su cui lavoro, che come detto non e' continua, bensi intervallata da linee di intestazione.

Ecco:

[code="Anthony47"]https://rapidshare.com/files/2411945328/elencobase.xls.zip[/code]


Tuttavia (karug mi perdonera', spero, per quello che vado a dire) il mio obiettivo era di offrire un punto di partenza, che l' utente fosse quindi in grado di metabolizzare e adattare alle sue esigenze; da questo aspetto l' uso della WorksheetFunction.CountIf penso sia piu' semplice della New collection e del Dictionary.


Perdonatissimo !!!!Figurati che gia' la soluzione proposta da te e' quasi turco , figurati il resto !!!

scossa ha scritto:Interessante discussione


Sono contento di avervi dato un buon spunto di analisi ....

Continuo a seguirvi. Grazie
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Re: vba2003:cercare e cancellare tutte le righe con codice=

Postdi ricky53 » 04/04/12 00:55

Ho inserito due volte lo stesso messaggio.

Questo lo taglio
Ultima modifica di ricky53 su 04/04/12 00:58, modificato 1 volte in totale.
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. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: vba2003:cercare e cancellare tutte le righe con codice=

Postdi ricky53 » 04/04/12 00:56

Ciao a tutti,
ecco quanto ho fatto in base alla struttura dei dati che Karug64 ha inviato (però lasciami esprimere un mio commento: sono proprio anti-... tutto gli anni così impostati !!!).
Codice: Seleziona tutto
Option Base 1
Option Explicit

Sub Cancella_Dati_Uguali_Partendo_dal_BASSO()
    Dim Ws As Worksheet, UR As Long, I1 As Long, J1 As Long, K1 As Long, Appoggio As String
    Dim Matrice(), Inizio As Double, Filtro As String
   
    Filtro = "ZZZZZZ"
    Set Ws = Sheets("Riepilogo")
    UR = Ws.Range("A" & Rows.Count).End(xlUp).Row
   
    ReDim Matrice(UR - 1, 5), Matrice_New(UR - 1, 5)
    Matrice = Ws.Range("A2:E" & UR)

    Application.ScreenUpdating = False
    Inizio = Timer
    For I1 = UR - 1 To 2 Step -1
        If Matrice(I1, 1) <> "" Then
            Appoggio = Matrice(I1, 1)
            For J1 = I1 - 1 To 1 Step -1
                If Appoggio = Matrice(J1, 1) Then
                    Matrice(J1, 1) = Filtro
                End If
            Next J1
        End If
    Next I1
   
    Ws.Range("A2:E" & UR) = Matrice
   
    Ws.Columns("A:E").AutoFilter Field:=1, Criteria1:="<>"
    Selection.AutoFilter
    Ws.Columns("A:E").AutoFilter Field:=1, Criteria1:=Filtro
    UR = Ws.Range("A" & Ws.Rows.Count).End(xlUp).Row
    Ws.Rows("2:" & UR).Delete Shift:=xlUp
    ActiveSheet.ShowAllData
   
    Application.ScreenUpdating = True
    MsgBox "Tempo impiegato: " & Round((Timer - Inizio), 2) & " secondi"
    Set Ws = Nothing
End Sub


Tempi di elaborazione 1,2 secondi

Karug64: prova e ...
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. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: vba2003:cercare e cancellare tutte le righe con codice=

Postdi karug64 » 04/04/12 18:20

Ciao, Ricky.
Nella mia macchina (su xp virtualizzato), tutto ok e tempo impiegato 1,9 sec. (ci puo' stare, penso ...)

Ricky53 ha scritto:(però lasciami esprimere un mio commento: sono proprio anti-... tutto gli anni così impostati !!!).


Lo so, lo so .... ma chi deve utilizzare questo file xls ha la necessita' di stampare i reporto per anni. Ora la prima idea era stata di creare tanti fogli (rinominandoli col nome degli anni), ma tra tre/quattro anni diventeranno proprio tanti ...
Un'altra idea era quella di inserire in colonna A l'anno di riferimento per poi lavorare con i filtri automatici, che non sarebbe stata malvagia ....

Non avendo altre idee, alla fine e' venuta fuori questa .... che sicuramente non e' la migliore, ma .... va !!

Grazie
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Re: vba2003:cercare e cancellare tutte le righe con codice=

Postdi ricky53 » 04/04/12 20:10

Ciao,
direi che va più che bene visto che è su virtuale.

Era buona la soluzione di aver una colonna per l'anno e poi filtrare o ... magari fare una tabella PIVOT ...

Buon proseguimento e ... alla prossima.
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. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "vba2003:cercare e cancellare tutte le righe con codice=":


Chi c’è in linea

Visitano il forum: Nessuno e 20 ospiti