KB0204:某些带数据链接的 Excel 文件运行缓慢
问题
如果 Excel 文件包含 Excel 数据链接(请参阅 Excel 数据链接)且单元格样式过多,滚动可能会变得非常缓慢,并且 Excel 似乎无响应。
如果 Excel 文件包含超过约 3000 个单元格样式,可能会出现此问题。您可以在 Immediate Window 中使用以下 VBA 命令检查单元格样式数量:
print Activeworkbook.Styles.Count 阅读更多
详细检查步骤如下:
- 按 Alt+F11 打开 VBA 编辑器。
- 转到 Immediate Window。如果不可见,可点击 View > Immediate Window 将其显示。
- 输入以下命令并按 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 SubRemove_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 工作簿包含大量(数万种)单元格样式。某些报表工具有时会生成过多不必要的单元格样式,也是促成因素之一。