Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

excel 2013 macro rallentate

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 2013 macro rallentate

Postdi matzap » 13/06/16 16:46

Ciao,
sono appena passato a office 2013 da Office 2010. le macro che prima funzionavano benissimo sono tutte rallentate!
è possibile distinguere le celle che vengono selezionate ad una ad una. sapete per quale motivo?

ciao
excel 2010
matzap
Utente Senior
 
Post: 227
Iscritto il: 16/04/13 08:27

Sponsor
 

Re: excel 2013 macro rallentate

Postdi Anthony47 » 14/06/16 01:36

Un'area in cui il 2013 e' drasticamente piu' lento del 2010 e' la protezione fogli; questo grazie a un "miglioramento" introdotto sulla cifratura della password.

Controlla inoltre che Application.Calculation sia modificato su xlCalculationManual e Application.ScreenUpdating sia modificato su False a inizio macro e riportati poi su xlCalculationAutomatic e True (rispettivamente) alla fine.
Se hai macro "di evento" (quelle che si mettono nei moduli vba dei singoli fogli e in ThisWorkbook) poni anche Application.EnableEvents = False a inizio e ripristina su True alla fine (assicurandoti che ogni possibile uscita abbia il ripristino).

Qualcosa in piu' richiede un esame e magari un confronto comparativo delle prestazioni, per determinare quali aree della macro sono particolarmente degradate; vedi se riesci a pubblicare un file dimostrativo.

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

Re: excel 2013 macro rallentate

Postdi matzap » 14/06/16 17:25

Grazie Anthony,
ho provato con
xlCalculationAutomatic e Application.EnableEvents = False e Application.ScreenUpdating ma niente. probabilmente è dovuto proprio al fatto che i fogli sono protetti con password e per scrivere devo togliere la protezione e poi riproteggerli.
Hai suggerimenti?
un file di prova è un po' complicato da realizzare, comunque nei prossimi giorni ci provo.
Grazie
excel 2010
matzap
Utente Senior
 
Post: 227
Iscritto il: 16/04/13 08:27

Re: excel 2013 macro rallentate

Postdi Anthony47 » 15/06/16 02:34

Se la macro e' costretta a sproteggere e proteggere in continuazione la lentezza deriva da lì.
Puoi provare a usare la protezione "UserInterFaceOnly", che blocca l'utente ma lascia libere le macro di fare molte cose (non "tutte", però).
Per ottenere questo, metti nel modulo ThisWorkbook
Codice: Seleziona tutto
Private Sub Workbook_Open()
Sheets("Foglio1").Unprotect Password:="Segretissima"       
Sheets("Foglio1").Protect Password:="Segretissima", UserInterFaceOnly:=True 
Sheets("Foglio2").Unprotect Password:="Segretissima"     
Sheets("Foglio2").Protect Password:="Segretissima", UserInterFaceOnly:=True
'. . . (altri Fogli)
'...
End Sub

A questo punto puoi eliminare dalle macro i vari Unprotect /Protect (all'inizio limitati a "commentare" le istruzioni, le toglierai quando hai la certezza che funziona tutto nell'altro modo).

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

Re: excel 2013 macro rallentate

Postdi matzap » 15/06/16 09:37

Ciao Anthony,
ho inserito il codice su tutti i fogli:
Codice: Seleziona tutto
Sheets("Foglio1").Unprotect Password:="dominator"
Sheets("Foglio1").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio2").Unprotect Password:="dominator"
Sheets("Foglio2").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio3").Unprotect Password:="dominator"
Sheets("Foglio3").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio3").Unprotect Password:="dominator"
Sheets("Foglio3").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio4").Unprotect Password:="dominator"
Sheets("Foglio4").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio5").Unprotect Password:="dominator"
Sheets("Foglio5").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio6").Unprotect Password:="dominator"
Sheets("Foglio6").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio7").Unprotect Password:="dominator"
Sheets("Foglio7").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio8").Unprotect Password:="dominator"
Sheets("Foglio8").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio9").Unprotect Password:="dominator"
Sheets("Foglio9").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio10").Unprotect Password:="dominator"
Sheets("Foglio10").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio11").Unprotect Password:="dominator"
Sheets("Foglio11").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio12").Unprotect Password:="dominator"
Sheets("Foglio12").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio13").Unprotect Password:="dominator"
Sheets("Foglio13").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio14").Unprotect Password:="dominator"
Sheets("Foglio14").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio15").Unprotect Password:="dominator"
Sheets("Foglio15").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio16").Unprotect Password:="dominator"
Sheets("Foglio16").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio17").Unprotect Password:="dominator"
Sheets("Foglio17").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio18").Unprotect Password:="dominator"
Sheets("Foglio18").Protect Password:="dominator", UserInterFaceOnly:=True
Sheets("Foglio19").Unprotect Password:="dominator"
Sheets("Foglio19").Protect Password:="dominator", UserInterFaceOnly:=True
,
ma dal terzo foglio in poi mi dice:
errore di runtime 9,
indice non incluso nell'intervallo
sai perchè?
ciao
excel 2010
matzap
Utente Senior
 
Post: 227
Iscritto il: 16/04/13 08:27

Re: excel 2013 macro rallentate

Postdi alfrimpa » 15/06/16 11:36

Ciao matzap

Quando il VBA ti da errore di run-time 9 "indice non incluso nell'intervallo" vuol dire che non trova qualcosa che invece ci dovrebbe essere.

Sei sicuro che nel tuo file ci siano tutti i fogli dall'1 al 19.

Io ho creato un file con 19 fogli protetto ciascun foglio con la password "dominator" e lanciando la tua macro non ho avuto nessun tipo di problema.
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 840
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: excel 2013 macro rallentate

Postdi Anthony47 » 15/06/16 14:06

Sei sicuro che nel tuo file ci siano tutti i fogli dall'1 al 19
Aggiungo: sei sicuro che si chiamino esattamente "Foglio3", "Foglio4", "Foglio5", etc?

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

Re: excel 2013 macro rallentate

Postdi matzap » 16/06/16 08:59

si Anthony, sono sicuro. comunque ho aggirato il problema in questo modo:
Codice: Seleziona tutto
WS_Count = Worksheets.Count
foglio = ActiveSheet.Index
For i = 1 To WS_Count
Worksheets(i).Unprotect Password:="dominator"
Worksheets(i).Protect Password:="dominator", UserInterFaceOnly:=True
'ActiveWorkbook.Worksheets(I).Select
Next i

e funziona.
non so perchè.
ciao
excel 2010
matzap
Utente Senior
 
Post: 227
Iscritto il: 16/04/13 08:27

Re: excel 2013 macro rallentate

Postdi matzap » 16/06/16 09:03

mi è però rimasto lo scrrenupdating bloccato su true!!
se lancio il codice
Codice: Seleziona tutto
Application.ScreenUpdating = False
Debug.Print Application.ScreenUpdating

mi da come risposta VERO

perchè?
office 2013 ha qualche differenza in questo senso?
Ciao
excel 2010
matzap
Utente Senior
 
Post: 227
Iscritto il: 16/04/13 08:27

Re: excel 2013 macro rallentate

Postdi matzap » 16/06/16 12:19

provo a postare un file di esempio:

https://we.tl/YuXwCh5v0p

la psw è " matteo"
ciao
excel 2010
matzap
Utente Senior
 
Post: 227
Iscritto il: 16/04/13 08:27

Re: excel 2013 macro rallentate

Postdi Anthony47 » 17/06/16 01:49

Hai fatto bene a sostituire nella macro l'elenco dei nomi fogli con un ciclo che li "spazzola" tutti usando il loro Index (mi piangeva il cuore a vedere quell'elenco di 19 fogli; d'altra parte non sapevo che tutti erano da proteggere e tutti usavano la stessa password).

Quanto a ScreenUpdating, il comportamento di XL2013 non mi risulta che sia cambiato.
Se hai pubblicato il file per consentirci di riprodurre il problema, allora non mi sono fatto un'idea di come dovrei usarlo; prova a spiegare cosa fare e cosa guardare e magari ci riusciamo.

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

Re: excel 2013 macro rallentate

Postdi matzap » 17/06/16 08:08

ciao Anthony,
all'apertura del file si apre una la userform7 in cui inserire prima da menu a tendina l'utente( ce ne è uno solo nell'esempio), poi inserita una psw. premendo ok parte una macro (autorizzazioni)che verifica la psw e le autorizzazioni del'utente e scrive su ogni fogli del mese nella cellaA2 il nome dell'utente. all'inizio di questa macro c'è il codice ScreenUpdating=false che rimane settato su VERO. non capisco perchè.
terminata la macro si apre la userform2 in vbModeless in cui c'è un tasto chiamato cambia utente. premendolo si riapre la userform7 per cambiare l'utente e per ripetere la verifica delle autorizzazioni.

in sostanza lo screenUpdating è bloccato su VERO e non so nè perché nè come sbloccarlo.
grazie dell'aiuto

Buona giornata
Matteo
excel 2010
matzap
Utente Senior
 
Post: 227
Iscritto il: 16/04/13 08:27

Re: excel 2013 macro rallentate

Postdi Anthony47 » 18/06/16 22:08

Aprendo il file su XL2016 (e' l'evoluzione di XL2013) in linea di massima il comportamento mi sembra corretto. Per il test ho aggiunto queste istruzioni all’interno della Private Sub Workbook_Open (verso l’inizio):
Codice: Seleziona tutto
Dim meseoggi As String                'ESISTENTE

Application.ScreenUpdating = False    '
Debug.Print "Wb_Open, 1", Application.ScreenUpdating
Selection.Offset(0, 1).Select
Debug.Print "Wb_Open, 2", Application.ScreenUpdating
 Application.Wait (Now + TimeValue("0:00:10"))
 Debug.Print "Wb_Open, 3", Application.ScreenUpdating
 Stop
WS_Count = Worksheets.Count                 'ESISTENTE

Ho poi modificato anche la chiusura dell Sub Workbook_Open, aggiungendo un ulteriore Debug.Print:
Codice: Seleziona tutto
UserForm7.Show
 Debug.Print "Wb_Open, 10", "Ritorno da UserForm7.Show"
 End If
Application.ScreenUpdating = True
End Sub

Infine ho modificato la parte iniziale della Private Sub CommandButton1_Click, come segue:
Codice: Seleziona tutto
Dim i As Integer

Debug.Print "CommandButton1_Click - Inizio", Application.ScreenUpdating
Application.ScreenUpdating = False
Debug.Print "Post ScreenUpdating = False", Application.ScreenUpdating
foglio = ActiveSheet.Index
' se i campi utente e password sono vuoti


A questo punto, mandando in esecuzione la Workbook_Open, per effetto della prima modifica la macro si congelera’ per 10 secondi: controlla la cella selezionata; al completamento della Wait la macro si ferma sullo Stop e vedrai che la cella selezionata si sposta sulla cella adiacente (ma la Selection era stata fatta 10 secondi prima).
Infatti quando si entra in debug lo ScreenUpdating e’ True.

Eseguendo tutto il ciclo legato all’inserimento del nome utente, nella finestra Immediata io leggo:
Codice: Seleziona tutto
Wb_Open, 1    Falso
Wb_Open, 2    Falso
Wb_Open, 3    Falso
Falso
CommandButton1_Click - Inizio             Vero
Post ScreenUpdating = False Falso
Falso
Wb_Open, 10   Ritorno da UserForm7.Show

Questo mi sembra regolare.

Tu invece come determini che ScreenUpdating e’ rimasto Vero?

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

Re: excel 2013 macro rallentate

Postdi matzap » 22/06/16 09:37

semplicemente eseguendo la macro passo passo.
dopo aver eseguito l'istruzione screenupdating =false
spostandomi con il cursore su di esso il valore è vero!
lo so non è un metodo molto ortodosso!! :D
excel 2010
matzap
Utente Senior
 
Post: 227
Iscritto il: 16/04/13 08:27

Re: excel 2013 macro rallentate

Postdi Anthony47 » 23/06/16 00:28

Quando sei in debug ScreenUpdating e' sempre Vero....
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: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "excel 2013 macro rallentate":


Chi c’è in linea

Visitano il forum: Maury170419 e 17 ospiti