Knowledge base KB0204

Alcuni file Excel sono lenti con i collegamenti dati

Problema

Quando contiene collegamenti dati di think-cell e troppi stili di cella, un file di Excel potrebbe iniziare a scorrere molto lentamente ed Excel stesso sembra 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:

  1. Premere ALT+F11 per aprire l'editor di VBA.
  2. Accedere alla Finestra di controllo immediato. Se non è visibile, è possibile visualizzarla facendo clic su VisualizzaFinestra immediata.
  3. 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) e selezionare Crea una copiaOK
    • 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:

    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 XLCleanerDotNET4.0 , raccomandato da Microsoft in KB213904. Dopo aver avviato lo strumento, fare clic su Get Excel File, spuntare 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 InserisciModulo. 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 REG: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.