Base de dados de conhecimento KB0204

Alguns arquivos Excel são lentos com os vínculos de dados

Problema

Se um arquivo Excel tiver vínculos de dados do think-cell e muitos estilos de célula, ele poderá começar a rolar muito lentamente e o Excel parecerá não estar respondendo.

Esse problema pode acontecer se o arquivo Excel contiver mais do que 3000 estilos de célula, aproximadamente. Você pode verificar o número dos estilos de célula com o seguinte comando VBA no Immediate Window:

print Activeworkbook.Styles.Count

Aqui estão detalhas as etapas para verificar isso:

  1. Pressione Alt+F11 para abrir o editor do VBA.
  2. Vá para Janela Imediata. Se não estiver visível, você poderá visualizá-lo clicando em ExibirJanela imediata.
  3. Digite o comando a seguir e pressione Enter
    print Activeworkbook.Styles.Count

Solução: Limpar pastas de trabalho afetadas

  • Copiar suas planilhas em uma nova pasta de trabalho

    No Office 2013 e posteriores, copiar planilhas entre pastas de trabalho evita o acúmulo de estilos de células não usados por padrão:

    • Selecione todas as planilhas em sua pasta de trabalho mantendo pressionada a tecla SHIFT e clique na primeira e na última planilhas.
    • Clique com o botão direito do mouse na seleção: Mova ou copie…para a pasta de trabalho: (na pasta de trabalho) e assinale Criar uma cópiaOK
    • Salve a nova pasta de trabalho com um novo nome

    No Office 2007 e 2010, copiar planilhas em uma nova pasta de trabalho copia todos os estilos de células não usados. Para evitar isso, ative primeiro o seguinte Hotfix:

    Se sua versão do Office estiver totalmente atualizada, esse Hotfix provavelmente já estará instalado. Entretanto, você também precisa ativar essa correção usando a solução Fix it fornecida pela Microsoft ou no registro, conforme explicado nos artigos a seguir da Microsoft:

    Se a ativação do Hotfix não funcionar, aplique a atualização mencionada na seção Resolução nos artigos da Microsoft acima.

  • Limpe suas pastas de trabalho com uma ferramenta de limpeza

    Use a ferramenta de limpeza XLCleanerDotNET4.0 , recomendada pela Microsoft em KB213904. Depois de iniciar a ferramenta, clique em Get Excel File, marque Force all cell styles to 'Normal' e, em seguida, clique em Process File. Quando o Excel é aberto com o arquivo limpo, salve-o com um novo nome.

  • Remova os estilos de célula personalizados da sua pasta de trabalho usando uma macro VBA

    Abra o editor do VBA com Alt+F11. Selecione sua pasta de trabalho e clique em InserirMódulo. Então copie uma das macros a seguir e execute-a pressionando F5:

    DeleteCustomStyles() remove todos os estilos de célula personalizados da sua pasta de trabalho.

    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() remove somente os estilos de célula personalizados não usados da sua pasta de trabalho. É semelhante à macro acima, contudo pode demorar muito tempo a executar. A macro foi fornecida pelo suporte do 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

A melhor solução seria evitar colar estilos de célula não usados, mas exige que a Microsoft corrija um bug no Excel 2007 e posteriores. Até agora, a Microsoft não considerou o impacto empresarial suficientemente elevado para fornecer essa correção. Se sua empresa tiver um contrato de suporte do Microsoft Office e você desejar entrar em contato com a Microsoft para solicitar uma correção, consulte o número de caso na MicrosoftREG:113012810172527.

Explicação

Algumas pastas de trabalho .xlsx contêm um elevado número (várias dezenas de milhares) de estilos de célula devido a bugs e design de código problemático no Excel. Um fator contribuinte são também as ferramentas de criação de relatórios que por vezes geram muitos estilos de célula desnecessários.