Base de conocimientos KB0204

Algunos archivos Excel van lentos con los vínculos de datos

Problema

Si un archivo de Excel contiene vínculos de datos de think-cell y demasiados estilos de celda, el desplazamiento por él podría empezar a ir muy lentamente y Excel podría no responder bien.

Este problema puede suceder si el archivo Excel contiene más de 3000 estilos de celda aproximadamente. Puede comprobar el número de estilos de celda con el siguiente comando de VBA en la Ventana Inmediato:

print Activeworkbook.Styles.Count

Los pasos para comprobarlo son los siguientes:

  1. Pulse Alt+F11 para abrir el editor de VBA.
  2. Vaya a la ventana Inmediato. Si no se ve, puede mostrarla haciendo clic en VerVentana Inmediato.
  3. Escriba el comando siguiente y pulse Intro
    print Activeworkbook.Styles.Count

Solución: Limpiar los libros afectados

  • Copie sus hojas de cálculo en un nuevo libro

    En Office 2013 y versiones posteriores, la copia de hojas de cálculo entre libros evita la acumulación de estilos de celda no utilizados de forma predeterminada:

    • Seleccione todas las hojas de su libro: mantenga pulsada la tecla MAYÚS y haga clic en la primera y la última hoja de cálculo.
    • Haga clic con el botón derecho en la selección: Mover o copiar…Al libro: (nuevo libro) y marque la opción Crear una copiaAceptar
    • Guarde el nuevo libro con un nombre diferente

    En Office 2007 y 2010, al copiar una hoja de cálculo en un libro nuevo, se copian todos los estilos de celda no utilizados. Para evitar esto, active primero la revisión siguiente:

    Si su versión de Office está plenamente actualizada, esta revisión probablemente ya estará instalada. No obstante, también tiene que activar esta revisión, bien utilizando la solución Fix it proporcionada por Microsoft o en el registro, como se explica en los siguientes artículos de Microsoft:

    Si activar la revisión no resuelve el problema, aplique la actualización mencionada en la sección Resolution de los artículos de Microsoft indicados anteriormente.

  • Limpie los libros afectados con una herramienta de limpieza

    Utilice una herramienta de limpieza como XLCleanerDotNET4.0, que Microsoft recomienda en KB213904. Después de iniciar la herramienta, haga clic en Get Excel File, marque Force all cell styles to 'Normal' y, a continuación, haga clic en Process File. Cuando se abra Excel con el archivo limpio, guárdelo con un nombre nuevo.

  • Elimine los estilos de celda personalizados de su libro utilizando una macro de VBA

    Abra el editor de VBA con Alt+F11. Seleccione el libro y haga clic en InsertarMódulo. A continuación, pegue la siguiente macro y ejecútela pulsando F5:

    DeleteCustomStyles() elimina de su libro todos los estilos de celda personalizados.

    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() solo elimina de su libro los estilos de celda personalizados que no estén en uso. Es similar a la macro anterior, pero puede necesitar mucho tiempo para ejecutarse. La macro ha sido proporcionada por el soporte técnico de 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 mejor solución sería evitar pegar los estilos de celda sin usar, pero es necesario que Microsoft solucione un error en Excel 2007 y versiones posteriores. Hasta el momento Microsoft no ha considerado el impacto comercial lo suficientemente importante como para proporcionar esta corrección. Si su empresa tiene un contrato de soporte técnico de Microsoft Office y desea ponerse en contacto con Microsoft para solicitar una corrección, puede indicar el número de caso de Microsoft REG:113012810172527.

Explicación

Algunos libros .xlsx contienen un número muy grande de estilos de celda (varias decenas de miles) debido a errores y al diseño de código problemático en Excel. Un factor que contribuye también son las herramientas de informes que a veces generan innecesariamente muchos estilos de celda.