【问题标题】:Too Many Different Cell Formats [closed]太多不同的单元格格式[关闭]
【发布时间】:2010-03-15 19:10:35
【问题描述】:
  1. 我有一个大文件,其中包含 10 个从头开始重新创建的工作表、12 个更新的工作表、5 个加载原始数据的工作表以及 7 个由宏用于报告的工作表。
  2. 我最近添加了一个新工作表,但遇到了 Excel “不同的单元格格式太多” 问题。

我尝试过的

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

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

有谁知道

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

谢谢

【问题讨论】:

  • 它是 excel,可能已经有一个 VBA 宏或其他一些代码可以计算唯一的格式化实例。
  • 在下面查看我的答案。如果您使用简单的解决方法,我认为您不需要任何 VBA 或 3rd Party 程序。然后,您只需注意从任何损坏的工作表中复制和粘贴。
  • 您需要一个程序,因此请检查 FormulaDesk 中的“修剪臃肿的工作簿”功能是否对您有帮助:formuladesk.com

标签: excel excel-2003 vba


【解决方案1】:

您描述的问题导致我(和一位同事)在使用 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

【讨论】:

  • 这对我来说非常有效。修复了两个几乎无法编辑的 40MB+ 关键工作簿。非常感谢!
  • 请注意,将 iStyleeCount 定义为 Integer 可能会产生溢出
  • ActiveWorkbook 缩减为仅活动样式后,您可能需要重新填充基本样式。实现此目的的一种方法是创建新工作簿...然后通过键盘快捷键 ALT-H-J-M 将新工作簿样式合并到清理区域。
  • +1。在最后添加了释放内存的内容和一个计时器 t 作为单个:Set styleObj = NothingSet rngCell = NothingSet wb = NothingSet wsh = NothingSet dict = NothingDebug.Print Timer - t &amp; " secondes."
  • 在谷歌搜索“excel太多格式”时,这需要成为最重要的结果。 MS“帮助”完全没有帮助。这对我有用,并将数千种格式删除到 9 种。这是一个很大的 PLUS ONE +1
【解决方案2】:

“单元格格式”很复杂。单元格实际上没有“格式”。它们有字体(它本身有名称和大小)、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

【讨论】:

  • 这绝对是正确的路径,但是,至少有 20 个不同的变量,包括字体、内部、边框、文本对齐方式……,但这种方法可以列出所有独特的单元格格式条件,并用一两行额外的行给出使用该条件的单元格的计数,加上使用该格式找到的初始单元格,允许尝试清理单元格。一个限制是,我们只是凡人没有得到 Excel 限制的确切格式条件的列表。除非有人认识某人?谢谢,我可能会尝试对此进行扩展。
  • 这回答了问题的第一部分,但不提供程序化解决方案
【解决方案3】:

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

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

我编写了一个实用程序来修复 XL2007 OOXML 文件,这些文件可以保存到 XL2003。这是博客帖子的link

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

无需冒使用 Open 进一步损坏文件的风险 在其他一些论坛上建议使用类似的 Office

【讨论】:

  • 我在 Excel 2003 上,所以不要继续。另外,我运行了一个样式检查器宏,VBA 显示大约有 30 种样式,其中一个名称损坏。我删除了大约 10-15 个样式。
  • +1 很棒的工具,我更喜欢商业 xlsgen 选项。
  • 我同意这是解决此问题的方法。我通过为单元格分配随机颜色看到了这个错误。它以约 65k 的独特格式触发。删除格式 ALT+H+E+F 后,仍然触发了限制。上面的答案并没有解决问题。这个工具做到了。 65k 随机颜色不实用,但这个工具确实清理了它。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    我遇到了这个问题,发现最简单的解决方法是使用this Excel add in。这似乎是来自Microsoft page on the problem 的“官方”回答。

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

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

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

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

    【讨论】:

    • 这对我有用。我有 6 万种样式。我还尝试了下面 Chuck The Nerd 的代码,但我挂了,可能是由于要处理的样式数量。
    • codeplex like 目前被 Google 标记为有害。
    【解决方案6】:

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

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

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

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

    免责声明:我拥有 SpreadsheetGear LLC

    【讨论】:

    • 单元格大小(宽度/高度)、合并单元格、评论是否会影响 4,000 个限制?我假设您的方法不查看单元格的格式,而是查看 Excel 文件逻辑内部并实际查看 Excel 存储的单元格格式数组?
    • 不,这三个都不影响限制。 SpreadsheetGear 是与 Excel 兼容的电子表格组件,因此我们必须加载格式表才能与 Excel 兼容。
    • 很遗憾,我无法使用您的应用程序,因为我们在文件中添加了几层 DRM。但它看起来像是来自网站的非常有价值的产品。如果我最终在另一家公司工作,我一定会再看一遍。
    【解决方案7】:

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

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

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

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        这将删除除默认样式(正常、解释性、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 属性实际上指的是什么,而不是“指示对象是否被锁定的布尔值”。

        【讨论】:

          【解决方案10】:

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

          在点击适合我的格式之前突出显示工作表。

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

          【讨论】:

            【解决方案11】:

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

            可以使用this 工具修复该问题。

            适用于 XLSXLSX 文件。

            【讨论】:

            【解决方案12】:

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

            在阅读了这个微软支持页面 (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-available/https://sergeig888.wordpress.com/2011/03/21/net4-0-version-of-the-xlstylestool-is-now-available/阅读了下载页面的cmets(因为它没有写在下载信息中)

            我发现我需要.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,重新打开文件,工作(没有任何警告)!!!

            【讨论】:

              【解决方案13】:

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

              【讨论】:

                【解决方案14】:

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

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

                【讨论】:

                • 从问题详情来看,似乎不是“小文件”
                猜你喜欢
                • 1970-01-01
                • 2013-07-06
                • 1970-01-01
                • 2015-11-17
                • 1970-01-01
                • 1970-01-01
                • 2013-12-23
                • 2018-03-13
                • 2023-03-21
                相关资源
                最近更新 更多