Condividi:        

MACRO VBA

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

MACRO VBA

Postdi nicola_na78 » 21/05/19 12:11

Ciao a tutti,
da quando sono passato da office 2007 a office 2010 tutte le macro sono lentissime, fino a quando non termina l'istruzione excel rimane tutto bianco, non si vede la barra di avanzamento, quindo non so nemmeno quanto tempo ci vuole per finire.
Mi dite cosa posso fare?
Grazie a tutti, buona giornata

Win 10
office2016
nicola_na78
Utente Senior
 
Post: 186
Iscritto il: 11/06/10 15:26

Sponsor
 

Re: MACRO VBA

Postdi Anthony47 » 21/05/19 22:01

Pubblica un esempio di file con macro che risulta rallentata; indica quanto (circa) durava con XL2007 e quanto invece ti dura col XL2010.
(Se hai contemporaneamente cambiato anche Pc, devi anche valutare l'impatto della piattaforma)

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

Re: MACRO VBA

Postdi nicola_na78 » 22/05/19 08:55

Ciao Anthony47, ecco il codice:
Codice: Seleziona tutto
Sub AGGIORN_LISTINO()

valore = n + P + R + S

For i = 2 To Range("A1", Range("A1").End(xlDown)).Rows.Count
For j = 2 To Sheets("Foglio2").Range("A1", Range("A1").End(xlDown)).Rows.Count


oldStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True

Application.StatusBar = "Totale articoli controllati " & valore & " " & "su" & " " & CONTA - 1 & " " & "Rimangono da controllare n." & CONTA - (valore + 1) & " " & "articoli" & "        " & " progressione" & " " & Round(((100 / (CONTA - 1)) * valore), 1) & " " & "%"


If Trim(Cells(i, 2)) = Trim(Sheets("Foglio2").Cells(j, 1)) And Cells(i, 6) <> Sheets("Foglio2").Cells(j, 2) Then
    Cells(i, 15) = Sheets("Foglio2").Cells(j, 2)
    Cells(i, 4).Font.ColorIndex = 3
    Cells(i, 15).Font.ColorIndex = 3
    n = n + 1
    If Sheets("Foglio2").Cells(j, 3) <> "" Then
    Cells(i, 16) = Round(Sheets("Foglio2").Cells(j, 3), 2)
    End If
   
    If Sheets("Foglio2").Cells(j, 3) <> "" And Cells(i, 8) <> "" Then
    Cells(i, 17) = Round(Sheets("Foglio2").Cells(j, 3), 2)
    End If
End If


If Trim(Cells(i, 2)) = Trim(Sheets("Foglio2").Cells(j, 1)) And Cells(i, 6) = Sheets("Foglio2").Cells(j, 2) Then
    Cells(i, 15) = Sheets("Foglio2").Cells(j, 2)
    Cells(i, 4).Font.ColorIndex = 3
    R = R + 1
    If Sheets("Foglio2").Cells(j, 3) <> "" And Cells(i, 7).Font.ColorIndex <> 3 Then
    Cells(i, 16) = Round(Sheets("Foglio2").Cells(j, 3), 2)
    End If
    If Sheets("Foglio2").Cells(j, 3) <> "" And Cells(i, 8).Font.ColorIndex <> 3 And Cells(i, 8) <> "" Then
    Cells(i, 17) = Round(Sheets("Foglio2").Cells(j, 3), 2)
    End If
   
End If

If Trim(Sheets("Foglio2").Cells(j, 1)) = Trim(Sheets("Articoli").Cells(i, 2)) Then
    Sheets("Foglio2").Cells(j, 1).Font.ColorIndex = 3
End If

' inizio istruzione controllo Cod. Art.'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If Trim(Cells(i, 2)) = Trim(Sheets("Foglio2").Cells(j, 1)) And Sheets("Foglio2").Cells(j, 5) <> "" And Cells(i, 3) <> Sheets("Foglio2").Cells(j, 5) Then
    Cells(i, 19) = Sheets("Foglio2").Cells(j, 5)
    Cells(i, 19).Font.ColorIndex = 3
End If

If Trim(Cells(i, 2)) = Trim(Sheets("Foglio2").Cells(j, 1)) And Sheets("Foglio2").Cells(j, 5) <> "" And Cells(i, 3) = Sheets("Foglio2").Cells(j, 5) Then
Cells(i, 19) = Cells(i, 3)
End If
' Fine istruzione controllo Cod. Art.''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Next j

If Cells(i, 15) = "" And Cells(i, 4) <> "" Then
    Cells(i, 15) = Cells(i, 6)
    Cells(i, 18) = "R"
    P = (P + 1)
End If

If Cells(i, 18) = "R" Then
    Cells(i, 19) = Cells(i, 3)
End If

If Cells(i, 15) < Cells(i, 6) Then
ab = ab + 1
Cells(i, 20) = " Attenzione nuovo prezzo minore di quello vecchio"
End If
Next i


Mess1 = "Totali articoli con Prezzo di Listino variato:" & " " & n & vbCrLf
Mess2 = "Totale articoli controllati:" & " " & CONTA - 1 & vbCrLf
Mess3 = "Totale articoli fuori listino:" & " " & P & vbCrLf
Mess4 = "Totale articoli con nuovo prezzo minore di quello precente : " & " " & ab & vbCrLf & vbCrLf

MsgBox (Mess2 & Mess1 & Mess3 & Mess4)


Application.DisplayStatusBar = oldStatusBar
    Application.DisplayStatusBar = False
    DoEvents
End Sub


Premetto che il pc e il sistema operativo è sempre lo stesso che utilizzavo con office 2007.
Il codice è abbastanza semplice, fa il controllo tra due file excel e restituisce i valori di prezzo variati.
con office2007 a controllare un file con 2000 righe impiegava 10min ora ci vuole oltre 30 min, excel diventa bianco come se si è bloccato e non ti fa vedere cosa succede fino al termine della macro.

Grazie
nicola_na78
Utente Senior
 
Post: 186
Iscritto il: 11/06/10 15:26

Re: MACRO VBA

Postdi Anthony47 » 22/05/19 12:23

A me la macro da errore sulla riga
For j = 2 To Sheets("Foglio2").Range("A1", Range("A1").End(xlDown)).Rows.Count
che infatti e' logicamente sbagliata; la versione corretta e':
Codice: Seleziona tutto
    For j = 2 To Sheets("Foglio2").Range("A1", Sheets("Foglio2").Range("A1").End(xlDown)).Rows.Count


Ho controllato su un file che mi sono inventato, e la lentezza di esecuzione sta' soprattutto in quei messaggi inviati alla statusbar; comunque mi e' impossibile confrontare con XL2007.
Il mio suggerimento e' quindi di eliminarli totalmente (tutte le righe che contengono DisplayStatusBar e StatusBar): perderai l'indicazione di dove sei arrivato ma arriverai in fondo mooolto prima.

Visto che la macro contiene numerose formattazioni, puo' anche essere utile inserire Application.ScreenUpdating = False a inizio macro e Application.ScreenUpdating = True in fondo, prima del msgbox

La macro non e' scritta avendo in mente la riduzione dei tempi di esecuzione (vedasi i continui accessi ai dati sui fogli); inoltre i tempi aumentano col quadrato della lunghezza degli elenchi (se raddoppia, il tempo quadruplica).
Se pubblichi un file a cui la macro si applica si puo' provare una riscrittura che evita il continuo accesso ai dati del foglio; in questi casi i tempi si riducono drasticamente.

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

Re: MACRO VBA

Postdi nicola_na78 » 24/05/19 13:53

Grazie mille, provo a rimuovere la parte di codice che mi dici....
nicola_na78
Utente Senior
 
Post: 186
Iscritto il: 11/06/10 15:26

Re: MACRO VBA

Postdi nicola_na78 » 28/05/19 13:58

Ciao Anthony,
togliendo il codice:
Codice: Seleziona tutto
oldStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True

Application.StatusBar = "Totale articoli controllati " & valore & " " & "su" & " " & CONTA - 1 & " " & "Rimangono da controllare n." & CONTA - (valore + 1) & " " & "articoli" & "        " & " progressione" & " " & Round(((100 / (CONTA - 1)) * valore), 1) & " " & "%"



in 2 secondi la macro controlla oltre 500 righe...

peccato era comodo sapere a che punto eri con il cotrollo... :-)

Grazie ancora.
alla prossima, super come sempre

;-)
nicola_na78
Utente Senior
 
Post: 186
Iscritto il: 11/06/10 15:26

Re: MACRO VBA

Postdi Anthony47 » 28/05/19 14:04

Peccato che per dire dove e' arrivata la macro deve avanzare a velocita' molto ridotta!

Prova a segnalare l'avanzamento ogni 500 righe, a questo punto il rallentamento sarebbe marginale...

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


Torna a Applicazioni Office Windows


Topic correlati a "MACRO VBA":


Chi c’è in linea

Visitano il forum: Nessuno e 58 ospiti