KB0204:某些带数据链接的 Excel 文件运行缓慢

  1. Home
  2. 资源
  3. 知识库
  4. KB0204

问题

如果 Excel 文件包含 Excel 数据链接(请参阅 Excel 数据链接)且单元格样式过多,滚动可能会变得非常缓慢,并且 Excel 似乎无响应。

如果 Excel 文件包含超过约 3000 个单元格样式,可能会出现此问题。您可以在 Immediate Window 中使用以下 VBA 命令检查单元格样式数量:

print Activeworkbook.Styles.Count 阅读更多

详细检查步骤如下:

  1. 按 Alt+F11 打开 VBA 编辑器。
  2. 转到 Immediate Window。如果不可见,可点击 View > Immediate Window 将其显示。
  3. 输入以下命令并按 Enter
    print Activeworkbook.Styles.Count

解决方案:清理受影响的工作簿

  • 将工作表复制到新的工作簿 阅读更多

    在 Office 2013 及更高版本中,在工作簿之间复制工作表时,默认会防止未使用的单元格样式累积:

    • 按住 SHIFT 并单击第一个和最后一个工作表,选择工作簿中的所有工作表
    • 右键单击所选内容:Move or copy… > To book: (new book),并勾选 Create a copy > OK
    • 将新工作簿另存为新名称

  • 使用清理工具清理工作簿 阅读更多

    使用 Microsoft 在 KB213904 中推荐的清理工具。使用 XLStyles Tool 时,单击 Get Excel File,勾选 Force all cell styles to 'Normal',然后单击 Process File。当 Excel 打开清理后的文件时,将其另存为新名称。

  • 使用 VBA 宏从工作簿中移除自定义单元格样式 阅读更多

    按 Alt+F11 打开 VBA 编辑器。选择您的工作簿,然后单击 Insert > Module。然后粘贴以下宏之一,并按 F5 运行:

    DeleteCustomStyles() 会从您的工作簿中移除所有自定义单元格样式。

    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() 只会从您的工作簿中移除未使用的自定义单元格样式。它与上面的宏类似,但运行时间可能很长。该宏由 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

最佳解决方案是阻止粘贴未使用的单元格样式,但这需要 Microsoft 修复 Excel 2007 及更高版本中的一个错误。到目前为止,Microsoft 尚未认为其业务影响足够高,因此未提供此修复。若贵公司有 Microsoft Office 支持合同,而且您希望联系 Microsoft 请求修复,可以参阅 Microsoft 案例编号 113012810172527。

说明

由于 Excel 中的错误和有问题的代码设计,某些 .xlsx 工作簿包含大量(数万种)单元格样式。某些报表工具有时会生成过多不必要的单元格样式,也是促成因素之一。