17
  1. 我有一个庞大的文件,其中包含从头开始重新创建的 10 个工作表、更新的 12 个工作表、5 个加载原始数据的工作表以及 7 个由宏用于报告的工作表。
  2. 我最近添加了一个新工作表,并且遇到了 Excel “太多不同的单元格格式”问题。

我试过的

我已经阅读了一些谷歌搜索结果,他们说我应该简化格式,但我什至不知道我是如何获得多达 4000 种不同的单元格格式的,更不用说我使用了多少,所以我可以删除一些。

有时文件运行时也会弹出,但不是全部,直到它出现,然后每次运行时都会出现。由于宏做了很多工作,包括从头开始创建 10 张工作表,我不知道该怎么做。

有人知道吗

  • 我可以运行一个宏来获取所有单元格格式的列表以及有多少单元格正在使用它们?
  • 他们信任的程序可以帮助删除多余的单元格格式?

谢谢

4

14 回答 14

46

您描述的问题导致我(和同事)在使用 Excel 2010 时失去了许多小时的工作效率。以下 VBA 代码/宏帮助我将 .xlsm 文件从使用 3540 样式降至 34。

' Description:
'    Borrowed largely from http://www.jkp-ads.com/Articles/styles06.asp

Option Explicit

' Description:
'    This is the "driver" for the entire module.
Public Sub DropUnusedStyles()

    Dim styleObj As Style
    Dim rngCell As Range
    Dim wb As Workbook
    Dim wsh As Worksheet
    Dim str As String
    Dim iStyleCount As Long
    Dim dict As New Scripting.Dictionary    ' <- from Tools / References... / "Microsoft Scripting Runtime"

    ' wb := workbook of interest.  Choose one of the following
    ' Set wb = ThisWorkbook ' choose this module's workbook
    Set wb = ActiveWorkbook ' the active workbook in excel


    Debug.Print "BEGINNING # of styles in workbook: " & wb.Styles.Count
    MsgBox "BEGINNING # of styles in workbook: " & wb.Styles.Count

    ' dict := list of styles
    For Each styleObj In wb.Styles
        str = styleObj.NameLocal
        iStyleCount = iStyleCount + 1
        Call dict.Add(str, 0)    ' First time:  adds keys
    Next styleObj
    Debug.Print "  dictionary now has " & dict.Count & " entries."
    ' Status, dictionary has styles (key) which are known to workbook


    ' Traverse each visible worksheet and increment count each style occurrence
    For Each wsh In wb.Worksheets
        If wsh.Visible Then
            For Each rngCell In wsh.UsedRange.Cells
                str = rngCell.Style
                dict.Item(str) = dict.Item(str) + 1     ' This time:  counts occurrences
            Next rngCell
        End If
    Next wsh
    ' Status, dictionary styles (key) has cell occurrence count (item)


    ' Try to delete unused styles
    Dim aKey As Variant
    On Error Resume Next    ' wb.Styles(aKey).Delete may throw error

    For Each aKey In dict.Keys

        ' display count & stylename
        '    e.g. "24   Normal"
        Debug.Print dict.Item(aKey) & vbTab & aKey

        If dict.Item(aKey) = 0 Then
            ' Occurrence count (Item) indicates this style is not used
            Call wb.Styles(aKey).Delete
            If Err.Number <> 0 Then
                Debug.Print vbTab & "^-- failed to delete"
                Err.Clear
            End If
            Call dict.Remove(aKey)
        End If

    Next aKey

    Debug.Print "ENDING # of style in workbook: " & wb.Styles.Count
    MsgBox "ENDING # of style in workbook: " & wb.Styles.Count

End Sub
于 2012-01-19T21:16:32.570 回答
7

“单元格格式”很复杂。单元格实际上没有“格式”。它们有字体(本身有名称和大小)、NumberFormat、Height、Width、Orientation 等。

因此,您需要定义“格式”的含义。

下面是获取字体名称和大小的代码。您可以替换任何您喜欢的属性。

下面的代码假定您在工作簿中创建了一个名为“格式”的工作表。运行宏后,字体名称和大小将列在该工作表中。

Public Sub GetFormats()

    Dim CurrentSheet As Integer
    Dim UsedRange As Range
    Dim CurrentCell As Range
    Dim rw As Long

    Sheets("Formats").Cells.ClearContents
    rw = 1
    For CurrentSheet = 1 To Sheets.Count
        Set UsedRange = Range(Sheets(CurrentSheet).Range("A1"), Sheets(CurrentSheet).Range("A1").SpecialCells(xlLastCell))
        For Each CurrentCell In UsedRange
            FontUsed = CurrentCell.Font.Name + ":" + CStr(CurrentCell.Font.Size)
            If Sheets("Formats").Cells.Find(FontUsed) Is Nothing Then
                Sheets("Formats").Cells(rw, 1).Value = FontUsed
                rw = rw + 1
            End If
        Next
    Next CurrentSheet
End Sub
于 2010-03-15T21:04:42.730 回答
6

很多人似乎都遇到过这个问题。

大多数情况下,问题与过多的未使用且经常损坏的样式有关 ,而不是与单元格唯一单元格格式组合的总数有关。

我编写了一个实用程序来修复可以保存到 XL2003 的 XL2007 OOXML 文件。这是博客文章的链接:

  • 需要 .Net3.5 和 MS Excel 2007。
  • 将修复 xlsx 或 xlsm 文件。
  • 该帖子有一个自述文件与应用程序一起使用。

无需像其他一些论坛上建议的那样使用 Open Office 来冒进一步损坏文件的风险

于 2010-03-17T05:08:30.060 回答
2

在 Excel 2007+ 中导致“单元格格式过多”错误消息的错误已得到解决:http ://sergeig888.wordpress.com/2011/05/06/msft-released-hot-fix-for-excel-2007 -custom-styles-duplication/ 请注意,错误修复不会删除与现有样式相关的文件损坏。基于开放 XML 的工具(免费提供)是唯一可以删除基于 Excel 对象模型的工具无法访问的元素的选项:例如,伪装成内置的不良样式、隐藏样式等……基于开放 XML 的清理手段100% 样式相关的无损坏文件。

于 2011-11-29T03:56:45.903 回答
2

我遇到了这个问题,发现清除它的最简单方法是使用这个 Excel 插件。这似乎是微软页面上关于这个问题的“官方”答案。

对于像我一样对使用 .xlam 文件感到困惑的人,下载它后,您可以在 Excel 中执行此操作:

  1. 单击文件 < 选项 < 加载项。
  2. 在管理选项下单击执行。
  3. 在加载项窗口中单击浏览,浏览到保存 XLAM 文件的位置,突出显示它并单击确定。
  4. 在加载项窗口中启用新加载项,然后单击确定。
  5. 在您的主屏幕功能区栏上现在应该有一个“删除样式”部分,其中包含一个显示工作簿中样式数量的按钮(如果您遇到此问题,可能有数千个)。
  6. 单击功能区上的按钮,它将消除所有重复的格式。

如果您没有看到它,请检查它是否正确显示在功能区上。右键单击功能区并说“自定义功能区”。然后单击加载项。在 Active Application Add-ins 下,您应该会看到“Remove Extra Styles”。

2019 年更新:在该链接上,他们现在已将所有内容放在一个大 zip 文件中,并讨论了该问题等等。在该 zip 文件中还有另一个名为 source code 的压缩文件夹,在该文件夹中您可以找到 .xlam 文件。

于 2015-10-02T16:18:05.590 回答
1

SpreadsheetGear for .NET将合并可能对您的情况有所帮助的非唯一格式。

如果您想查看它是否有帮助,可以在此处下载免费试用版。只需将工作簿加载到随评估软件安装的“SpreadsheetGear 2009 for Windows”应用程序中,然后保存工作簿。

如果你真的有这么多独特的格式,你将不得不简化。字体/单元格颜色(内部)、数字格式、水平和垂直对齐方式、边框、缩进级别以及我可能没有想到的一些事情的每个独特组合都会导致表格中的唯一条目。

另一种选择是切换到 Excel 2007,它对唯一单元格格式的限制从 4,000 增加到 64K。

免责声明:我拥有 SpreadsheetGear LLC

于 2010-03-15T20:45:25.463 回答
1

我以前见过这个问题。可以重新创建以证明我要说的话。这是一个小问题 22,但是当您的工作表存在“格式过多”问题时,请打开一个全新的工作表并从过多格式工作表中复制一个单元格,然后将其粘贴到新工作簿中。该工作簿现在将被“感染”,并且还会出现格式过多错误。除非您使用特殊粘贴来限制它,否则该粘贴似乎会附带很多格式数据。

如何让事情变得更好?一种解决方法是使用另存为 HTML 功能。尽管这确实有效,但请耐心等待。我这里说的是2003年,不知道2007年会发生什么,也许这个bug已经修复了。所以...另存为Html然后关闭excel。加载一个新会话并加载它以确保您运行任何宏,然后在加载后另存为电子表格。

当您关闭并重新打开这个新的电子表格时,您的太多格式问题应该消失了。

于 2010-11-19T18:12:54.930 回答
1

一种解决方案可能是使用ASAP 实用程序。在工作表部分有一个remove all unused styles选项。然后你必须关闭工作簿并重新打开,我想。

于 2012-07-26T20:59:29.523 回答
1

这将删除所有样式,除了默认样式(正常、解释、20% Accent1 等)。包括用户创建的样式,但这是清理工作簿的一种快速而肮脏的方式:


Sub NewNukeStyles()
Dim tempstyle As Style

For Each tempstyle In ActiveWorkbook.Styles

 If tempstyle.BuiltIn = False Then
    If tempstyle.Locked = True Then 'not sure what this is
       tempstyle.Delete
    End If
End If

Next tempstyle

End Sub 'NukeStyles

我很想知道 tempstyle.locked 属性实际上指的是什么,而不是“指示对象是否被锁定的布尔值”。

于 2016-06-23T03:18:07.070 回答
0

如果您可以打开文件,请尝试 > 编辑 > 清除 > 格式。

在点击对我有用的格式之前突出显示工作表。

确保在执行此操作之前制作 EXCEL 的副本,以防万一缺少某些内容,您可以交叉引用旧文档。

于 2013-02-25T12:13:17.327 回答
-1

这是困扰所有已发布版本的 Excel 中的一个错误。

可以使用工具解决此问题。

与文件XLS一起使用。XLSX

于 2011-11-03T08:08:33.367 回答
-1

我几乎在这里使用了所有答案,但错误消息仍然存在。

在阅读了这个微软支持页面 ( https://support.microsoft.com/en-us/kb/213904 ) 之后,我来到了 XLStylesTool.exe。

但是,再次没有运气(因为我用错了)。

我有 Windows 7,所以 Windows 8/10 版本是不行的。

我在这里阅读了下载页面的评论(因为它没有写在下载信息中)https://sergeig888.wordpress.com/2011/03/21/net4-0-version-of-the-xlstylestool-is-now -可用的/

我发现我需要.NET4.0版本才能让它在win7下工作(那些傻瓜不能简单地称它为win7版本???)

下载链接:https ://skydrive.live.com/redir?resid=53E1D37F76F69444!900&authkey=!AH5oeGVaWlMsFHA&ithint=file%2c.zip

我的下一个问题是它不适用于 *.XLS ,所以我打开了 excel 并保存为 *.XLSM ,这样就可以了。

之后,只需单击“获取 Excel 文件”和“处理文件”(我检查了“提交更改并在 excel 中打开”,并在 excel 中“另存为”“* .xls”。关闭 excel,重新打开文件,WORKS(不打扰警告) !!!

于 2016-06-01T10:11:38.600 回答
-2

如果它给您一个错误“单元格格式太多”,请立即保存文档。暂时将文档的名称更改为其他名称。打开文档,然后使用您之前想要的相同名称保存它。现在关闭文档并打开它,它将不再显示该错误。有时它也只是通过简单的保存就消失了,但这对我来说有点奇怪!

于 2013-03-04T18:13:07.440 回答
-2

如果它是一个小文件,一个简单的解决方案:

只需复制所有内容并将其粘贴到 Word 中。它会将内容检测为表格。然后选择所有列(不是通过左上角的十字符号选择完整的表格)并将其粘贴到新的 .xls 工作表中,您将只有清晰的值。

于 2014-06-16T14:20:25.773 回答