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:
- Pressione Alt+F11 para abrir o editor do VBA.
- Vá para Janela Imediata. Se ela não estiver visível, você pode exibi-la clicando em Exibir → Janela Imediata.
- 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:
- Microsoft Office 2007: KB2553085
- Microsoft Office 2010: KB2598127, que foi publicado na atualização do Office 2010 de abril de 2012.
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.