KB0204: Alcuni file Excel sono lenti con i collegamenti dati

Problema

Se un file Excel contiene collegamenti dati Excel (vedere Collegamenti dati Excel) e troppi stili di cella, potrebbe iniziare a scorrere molto lentamente ed Excel sembra non rispondere.

Questo problema può verificarsi se il file Excel contiene più di circa 3000 stili di cella. È possibile controllare il numero di stili di cella con il seguente comando VBA nella Immediate Window:

print Activeworkbook.Styles.Count Scopri di più

I passaggi per verificarlo sono descritti in dettaglio:

  1. Premere Alt+F11 per aprire l'editor VBA.
  2. Passare alla Immediate Window. Se non è visibile, è possibile visualizzarla facendo clic su View > Immediate Window.
  3. Digitare il comando seguente e premere Enter
    print Activeworkbook.Styles.Count

Soluzione: pulire le cartelle di lavoro interessate

  • Copiare i fogli di lavoro in una nuova cartella di lavoro Scopri di più

    In Office 2013 e versioni successive, la copia di fogli di lavoro tra cartelle di lavoro impedisce per impostazione predefinita l'accumulo di stili di cella inutilizzati:

    • Selezionare tutti i fogli nella cartella di lavoro tenendo premuto SHIFT e facendo clic sul primo e sull'ultimo foglio di lavoro
    • Fare clic con il pulsante destro del mouse sulla selezione: Move or copy… > To book: (new book) e selezionare Create a copy > OK
    • Salvare la nuova cartella di lavoro con un nuovo nome

  • Pulire le cartelle di lavoro con uno strumento di pulizia Scopri di più

    Usare lo strumento di pulizia consigliato da Microsoft in KB213904. Usando 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 usando una macro VBA Scopri di più

    Aprire l'editor VBA con Alt+F11. Selezionare la cartella di lavoro e fare clic su Insert > Module. Quindi incollare una delle macro seguenti ed eseguirla premendo F5:

    DeleteCustomStyles() rimuove tutti gli stili di 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 "Stili eliminati: " & i_cust & " stili" & Chr(13) & "Stili rimanenti: " & ActiveWorkbook.Styles.Count
    End Sub

    Remove_Styles() rimuove dalla cartella di lavoro solo gli stili di cella personalizzati inutilizzati. È simile alla macro precedente, tuttavia l'esecuzione può richiedere molto tempo. La macro è stata fornita dal supporto di 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 l'incollamento degli stili di cella inutilizzati, ma richiede che Microsoft corregga un bug in Excel 2007 e versioni successive. Finora Microsoft non ha ritenuto l'impatto aziendale abbastanza elevato da fornire questa 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 di cella a causa di bug e di una progettazione problematica del codice in Excel. Un fattore che contribuisce al problema sono anche gli strumenti di reportistica, che a volte generano inutilmente molti stili di cella.