› Sviluppare funzionalita su Microsoft Office con VBA › Cartella Excel lenta in apertura
-
AutoreArticoli
-
Buongiorno,
ho un file excel, con tabella pivot e alcune macro, che è lentissimo ad aprirsi.
Per qualche minuto resta il logo di Excel con la scritta "Calcolo in corso (8 thread)..."
Potrebbe essere che il problema sia dovuto a questa macro che serve per eliminare alcune righe in un foglio di lavoro. La macro scorre anche 5000 righe.
' macro per elimiare righe che iniziano per numeri Dim LR3 As Long, i3 As Long With Sheets("Import") LR3 = .Range("A" & .Rows.Count).End(xlUp).Row For i3 = LR3 To 2 Step -1 If IsNumeric(.Range("A" & i3).Value) = False And _ Len(.Range("A" & i3).Value) > 0 Then Else .Rows(i3).Delete End If Next i3 End With
Che sia dovuto a questa macro? Come risolvere? Grazie.
la macro viene lanciata automaticamente all'apertura ? se sì toglila dalla Sub Workbook_Open()
Ciao patel. In pratica nel Sub Workbook_Open() richiamo alcune macro, tra cui una macro che al suo interno richiama la macro in questione.
Quindi in Sub Workbook_Open() richiamo Macro 1; all'interno di Sub Macro 1() richiamo Macro 2 e all'interno del codice di Sub Macro 2 ho il pezzo di codice allegato prima.
Fammi sapere come procedere!
Di sicuro è quella macro, perchè cancellandola (commentandola) il foglio Excel si apre immediatamente
Per cancellare le righe più velocemente:
Dim LR3 As Long, i3 As Long Dim data As Variant Dim rangeToDelete As Range With Sheets("Import") LR3 = .Range("A" & .Rows.Count).End(xlUp).Row data = .Range("A2:A" & LR3).Value For i3 = LBound(data) To UBound(data) If Not IsNumeric(data(i3, 1)) And _ Len(data(i3, 1)) <> 0 Then Else If rangeToDelete Is Nothing Then Set rangeToDelete = .Range("A" & i3 + 1) Else Set rangeToDelete = Union(rangeToDelete, .Range("A" & i3 + 1)) End If End If Next i3 End With If Not rangeToDelete Is Nothing Then rangeToDelete.EntireRow.Delete
Salve, come si fa a capire da cosa deriva quella lentezza di "calcolo in corso (8 thread)"? Grazie
Per cancellare le righe più velocemente:
Però il codice proposto non cancella le righe che iniziano con un numero (come da commento al primo codice pubblicato dall'OP).
come si fa a capire da cosa deriva quella lentezza di "calcolo in corso (8 thread)"? Grazie
Il codice che hai mostrato nel primo post è terribile
C'è un If che testa due condizioni che a loro volta usano due funzioni le quali vanno elaborate a parte (If IsNumeric e If Len) e per di più questo test è dentro un ramo Else che non ha codice quindi stai facendo un test al negativo (solo per ignorare il risultato se la condizione è soddisfatta).Aggiungi a questo che il Delete sull'intera riga rallenta comunque l'esecuzione e poi stiamo parlando di oltre cinquemila righe.
Per velocizzare potresti adottare la soluzione di vion che come idea (non però per come è scritto) mi piace perchè costruisce un range separato da eliminare in blocco.
A questo potresti pensare di sospendere il refresh dello schermo con ScreenUpdating (anche questo potrebbe aiutare a velocizzare).
NB: io non ho inserito alcun codice. Ho solo chiesto: "Salve, come si fa a capire da cosa deriva quella lentezza di "calcolo in corso (8 thread)"? Grazie"
Non era possibile per me sapere che non sei l'utente del primo post, perchè come utente non registrato, puoi scrivere il nome che preferisci quando posti qualcosa.
Ad ogni modo ribadisco le mie osservazioni, astraendole. Può darsi anche che ci sia un problema di memoria, magari ci sono altre applicazioni sotto che consumano (o nu bell'antivirus, non saprei). Gli scenari possibili, e le configurazioni utente, sono tanti e diversi.
-
AutoreArticoli