Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Velocizzare codice di raggruppamento righe

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

Velocizzare codice di raggruppamento righe

Postdi christianghz » 13/10/15 11:29

Ciao
ho il seguente codice che mi raggruppa le righe che hanno lo stesso codice all'interno di una colonna, e su altre 3 colonne riporta la somma dei valori che c'erano nelle righe con lo stesso codice.
Codice: Seleziona tutto
Sub UnisciSpedizioni()
vert = Cells(Rows.Count, 4).End(xlUp).Row
oriz = Cells(1, 4).End(xlToRight).Column
Range(Cells(1, 4), Cells(vert, oriz)).Select
Selection.Sort Key1:=Cells(2, 4), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For y = 1 To vert
If Cells(y, 4) = "" Then Exit For
If Cells(y, 4) = Cells(y + 1, 4) Then
Cells(y, 33) = Cells(y, 33) + Space(1) + Cells(y + 1, 33)
Cells(y, 37) = Cells(y, 37) + Cells(y + 1, 37)
Cells(y, 42) = Cells(y, 42) + Cells(y + 1, 42)
Range(Cells(y + 1, 1), Cells(y + 1, oriz)).Select
Selection.Delete Shift:=xlUp
y = y - 1
End If
Next y
Cells(1, 4).Select
End Sub


Il problema è che è molto lento, ma non sono sicuro sia colpa del codice perchè anche un altro codice -molto più semplice di questo- ci mette il suo tempo a operare.
Può essere che il file sia rovinato o che ci siano trope macro insieme? nello stesso file ho 7 macro

grazie mille
christianghz
Utente Junior
 
Post: 72
Iscritto il: 03/02/14 17:58

Sponsor
 

Re: Velocizzare codice di raggruppamento righe

Postdi Anthony47 » 14/10/15 00:24

Penso che gia' mettendo Application.ScreenUpdating = False /True a inizio e e fine ciclo avrai un buon miglioramento:
Cioe':
Codice: Seleziona tutto
Application.ScreenUpdating = False     '<<< Aggiungi
For y = 1 To vert

Codice: Seleziona tutto
Next y
Application.ScreenUpdating = True      '<<< Aggiungi


Per altri interventi dovresti pubblicare un file di esempio realistico.

Ciao
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: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Velocizzare codice di raggruppamento righe

Postdi christianghz » 14/10/15 15:29

non è migliorata di molto la situazione, allego il file incriminato, forse è un problema di query, di dati di origine esterna perchè è proprio molto lento.
è anche molto pesante e non capisco perchè.

O forse dovrei modificare i codici in modo che lavorino solo sulle prime 500 righe, che comunque mi basta.

http://www.filedropper.com/elencoconsegne
christianghz
Utente Junior
 
Post: 72
Iscritto il: 03/02/14 17:58

Re: Velocizzare codice di raggruppamento righe

Postdi Anthony47 » 14/10/15 23:47

Il file occupa 54 MByte perche' hai inserito formule fino alla riga 65000; da quel che dici se ti fermi a riga 1000 ne hai in abbondanza.
Ora e' ovvio che spostare in alto 65000 righe excel lo fa lentissimamente; ma se dovesse spostarne solo 1000 allora impiegherebbe ancora circa 0.5 alla volta, ancora tanti...
Ho pertanto rivisto il codice, eliminando la parte lenta (Selection.Delete Shift:=xlUp) e sostituendola con una ClearContents che azzera il contenuto della riga; infine procedo con un Ordinamento dei dati residui.
Il nuovo codice:
Codice: Seleziona tutto
Sub UnisciSpedizioni()
mytim = Timer
vert = Cells(Rows.Count, 4).End(xlUp).Row
oriz = Cells(1, 4).End(xlToRight).Column
Range(Cells(1, 4), Cells(vert, oriz)).Select
Selection.Sort Key1:=Cells(2, 4), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For y = 1 To vert
    If Cells(y, 4) <> "" Then
        If Cells(y, 4) = Cells(y + 1, 4) Then
            For jj = 1 To Application.WorksheetFunction.CountIf(Cells(y + 1, 4).Resize(vert, 1), Cells(y, 4).Value)
                Cells(y, 33) = Cells(y, 33) + Space(1) + Cells(y + jj, 33)
                Cells(y, 37) = Cells(y, 37) + Cells(y + jj, 37)
                Cells(y, 42) = Cells(y, 42) + Cells(y + jj, 42)
                Range(Cells(y + jj, 1), Cells(y + jj, oriz)).ClearContents
                DoEvents
            Next jj
        End If
    End If
Next y
Range(Cells(1, 1), Cells(vert, oriz)).Select
Selection.Sort Key1:=Cells(2, 4), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Cells(1, 4).Select
MsgBox (Format(Timer - mytim, "0.00"))
End Sub

L'ordinamento finale include anche le colonne A:C, che invece sono escluse dall'ordinamento iniziale.

Non ho fatto grandi collaudi, falli tu!

Ciao
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: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Velocizzare codice di raggruppamento righe

Postdi christianghz » 19/10/15 15:04

Perfetto.. again...
christianghz
Utente Junior
 
Post: 72
Iscritto il: 03/02/14 17:58

Re: Velocizzare codice di raggruppamento righe

Postdi christianghz » 21/10/15 19:33

ANthony piccolo dettaglio:

Quando va a riordinare unendo le righe che hanno lo stesso valore in colonna D riordina tutto ma non i dati delle prime colonne (A,B,C).

Come posso risolvere?

Grazie
christianghz
Utente Junior
 
Post: 72
Iscritto il: 03/02/14 17:58

Re: Velocizzare codice di raggruppamento righe

Postdi Anthony47 » 22/10/15 23:20

Quando va a riordinare unendo le righe che hanno lo stesso valore in colonna D riordina tutto ma non i dati delle prime colonne (A,B,C).

Come posso risolvere?

Io ho modificato una tua macro, che in testa faceva un ordinamento dalla colonna 4 in avanti [Range(Cells(1, 4), Cells(vert, oriz)).Select], trascurando le prime tre colonne; e ti avevo avvertito che "L'ordinamento finale [quello da me aggiunto] include anche le colonne A:C, che invece sono escluse dall'ordinamento [tuo...] iniziale".
Se vuoi ordinare sempre includendo anche le colonne A, B, C allora devi sostituire quel Range(Cells(1, 4), Cells(vert, oriz)).Select (nel primo ordinamento) con
Codice: Seleziona tutto
Range(Cells(1, 1), Cells(vert, oriz)).Select

Ciao
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: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Velocizzare codice di raggruppamento righe

Postdi christianghz » 02/11/15 10:31

Ah ok adesso ho capito!!

Grazie Anthony
christianghz
Utente Junior
 
Post: 72
Iscritto il: 03/02/14 17:58


Torna a Applicazioni Office Windows


Topic correlati a "Velocizzare codice di raggruppamento righe":


Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti