Base 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 Excel (consulte 21. Links de dados do Excel) 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 ela não estiver visível, você pode exibi-la 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: Mover ou copiar… Para reservar: (nova reserva) e marcar Criar uma cópia OK
    • 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 recomendada pela Microsoft em KB213904. Usando a ferramenta XLStyles, clique em Obter Arquivo do Excel, marque Forçar todos os estilos de célula para 'Normal', e então, clique em Processar Arquivo. 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 Inserir Mó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 Microsoft 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.

Compartilhar