Alcuni file Excel sono lenti con i collegamenti dati
Problema
Se un file Excel contiene collegamenti dati (vedere 21. Collegamenti dati Excel) e un numero eccessivo di stili di cella, potrebbe iniziare a scorrere molto lentamente ed Excel potrebbe non rispondere.
Questo problema si verifica se il file di Excel contiene più di 3000 stili di cella circa. È possibile verificare il numero di stili di cella con il seguente comando VBA nella Finestra Immediata:
print Activeworkbook.Styles.Count
I passaggi necessari per questa verifica sono:
- Premere ALT+F11 per aprire l'editor di VBA.
- Accedere alla Finestra di controllo immediato. Se non è visibile, è possibile visualizzarla facendo clic su Visualizza → Finestra di controllo immediato.
- Digitare il seguente comando e premere Invio
print Activeworkbook.Styles.Count
Soluzione: Pulire le cartelle di lavoro interessate
- Copiare i fogli di lavoro in una nuova cartella di lavoro
In Office 2013 e versioni successive, la copia di fogli di lavoro tra cartelle di lavoro evita l’accumulo di stili di cella inutilizzati per impostazione predefinita:
- Selezionare tutti i fogli nella cartella di lavoro: tenere premuto MAIUSC e fare clic sul primo e sull’ultimo foglio di lavoro
- Fare clic con il pulsante destro del mouse sulla selezione: Sposta o copia → Alla cartella: (nuova cartella), quindi selezionare Crea una copia → OK
- Salvare la nuova cartella di lavoro con un nuovo nome
In Office 2007 e 2010, copiare un foglio di lavoro in una nuova cartella di lavoro consente di copiare tutti gli stili di cella inutilizzati. Per evitare che succeda, attivare prima il seguente Hotfix:
Se la versione di Office è completamente aggiornata, questo hotfix è probabilmente già installato. Tuttavia, è anche necessario attivare questo aggiornamento utilizzando la soluzione Correggi fornita da Microsoft o nel Registro di sistema, come spiegato nei seguenti articoli di Microsoft:
- Microsoft Office 2007: KB2553085
- Microsoft Office 2010: KB2598127, che è stato pubblicato nell'aggiornamento di Office 2010 di aprile 2012.
Se l'attivazione dell'hotfix non funziona, applicare l'aggiornamento citato nella sezione Risoluzione negli articoli di Microsoft citati sopra.
- Pulire le cartelle di lavoro con uno strumento di pulizia
Utilizzare lo strumento di pulizia consigliato da Microsoft in KB213904. Utilizzando XLStyles Tool, fare clic su Get Excel File, selezionare Force all cell styles to 'Normal', quindi fare clic su Process File. Quando Excel si apre con il file pulito, salvarlo con un nuovo nome.
- Rimuovere gli stili di cella personalizzati dalla cartella di lavoro utilizzando una macro VBA
Aprire l'editor di VBA editor con ALT+F11. Selezionare la cartella di lavoro e fare clic su Inserisci → Modulo. Incollare una delle seguenti macro ed eseguirla premendo F5:
DeleteCustomStyles() rimuove tutti gli stili cella personalizzati dalla cartella di lavoro.
Sub DeleteCustomStyles() Dim st As Style Dim i, i_cust As Long i_cust = 0 For i = (ActiveWorkbook.Styles.Count) To 1 Step -1 With ActiveWorkbook.Styles(i) If .BuiltIn = False Then On Error Resume Next .Locked = False On Error GoTo 0 If Not .Locked Then .Delete i_cust = i_cust + 1 End If End If End With If (i Mod 100) = 0 Then Debug.Print i Next MsgBox "Styles deleted: " & i_cust & " styles" & Chr(13) & "Styles left: " & ActiveWorkbook.Styles.Count End Sub
Remove_Styles() rimuove soltanto gli stili di cella personalizzati inutilizzati dalla cartella di lavoro. È simile alla macro sopra riportata, tuttavia richiede un tempo molto lungo per l'esecuzione. La macro è stata fornita dal supporto tecnico Microsoft Office.
Option Explicit Dim st_array() As String Dim i_x As Long Sub Remove_Styles() Dim stname As String Dim ustname As String Dim uc As Range Dim retval As Boolean Dim ust As Style Dim sh As Worksheet i_x = 0 For Each sh In ActiveWorkbook.Worksheets For Each uc In sh.UsedRange stname = uc.Style.Name retval = Check_Array(stname) If retval = False Then ReDim Preserve st_array(i_x) st_array(i_x) = stname i_x = i_x + 1 End If Next uc Next sh For Each ust In ActiveWorkbook.Styles If ust.BuiltIn = False Then ustname = ust.Name retval = Delete_Styles(ustname) On Error Resume Next If retval = True Then ust.Delete On Error GoTo 0 End If Next ust End Sub Function Delete_Styles(stylename As String) As Boolean Delete_Styles = True Dim i_y As Long For i_y = 0 To i_x - 1 If st_array(i_y) = stylename Then Delete_Styles = False Next i_y End Function Function Check_Array(stylename As String) As Boolean Check_Array = False Dim i_y As Long For i_y = 0 To i_x - 1 If st_array(i_y) = stylename Then Check_Array = True Next i_y End Function
La soluzione migliore sarebbe impedire di copiare gli stili di cella inutilizzati, ma richiede la correzione di un bug da parte di Microsoft in Excel 2007 e versioni successive. Fino ad ora Microsoft non ha ritenuto l'impatto economico del bug sufficiente per decidere di provvedere alla correzione. Se la società ha un contratto di assistenza Microsoft Office e desidera contattare Microsoft per risolvere un errore, occorre fare riferimento al numero di caso Microsoft 113012810172527.
Spiegazione
Alcune cartelle di lavoro .xlsx contengono un numero elevato (diverse decine di migliaia) di stili cella a causa di bug e problemi di progettazione codice in Excel. Un fattore contributivo è rappresentato anche dagli strumenti di reporting che a volte generano troppi stili cella rispetto al necessario.