太多不同的单元格格式

时间:2010-03-15 19:10:35

标签: excel excel-vba excel-2003 vba

  1. 我有一个大型文件,从头开始重新创建10张,更新了12张,原始数据加载了5张,报告的宏使用了7张。
  2. 我最近添加了一个新工作表,并且遇到了Excel “太多不同的单元格格式”问题。
  3. 我尝试了什么

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

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

    有谁知道

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

    谢谢

15 个答案:

答案 0 :(得分:45)

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

答案 1 :(得分: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

答案 2 :(得分:6)

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

最常见的问题是 与过多未使用且经常损坏的样式有关 而不是细胞独特细胞格式组合的总数。

我写了一个实用程序来修复可以保存到的XL2007 OOXML文件 XL2003。以下是博文中的link

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

使用Open,无需冒更大程度破坏文件的风险 在其他一些论坛上建议办公室

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

对于那些和我使用.xlam文件一样困惑的人,下载后你可以在Excel中执行此操作:

  1. 点击文件&lt;选项&lt;插件。
  2. 在“管理”选项下,单击“开始”。
  3. 在“加载项”窗口中单击“浏览”,浏览到保存XLAM文件的位置,突出显示该文件并单击“确定”。
  4. 在“加载项”窗口中启用新加载项,然后单击“确定”。
  5. 在主屏幕功能区上,现在应该有一个“删除样式”部分,其中包含一个按钮,显示工作簿中的样式数量(如果遇到此问题,可能有数千个)。
  6. 单击功能区上的按钮,它将消除所有重复的格式。
  7. 如果您没有看到它,请检查它是否正确显示在功能区上。右键单击功能区并说“自定义功能区”。然后单击加载项。在Active Application Add-ins下,您应该看到“Remove Extra Styles”。

答案 5 :(得分:1)

SpreadsheetGear for .NET将使用非独特格式,这可能对您的情况有所帮助。

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

如果您确实拥有许多独特的格式,则必须简化。字体/单元格颜色(内部),数字格式,水平和垂直对齐,边框,缩进级别以及可能的一些我想不到的东西的每个独特组合将导致表格中的唯一条目。

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

免责声明:我拥有SpreadsheetGear LLC

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

这将删除默认样式的所有样式EXCEPT(正常,说明,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属性实际上指的是&#34;一个布尔值,指示对象是否被锁定&#34;。

答案 9 :(得分:0)

如果你可以打开文件试试&gt;编辑&gt;清楚&gt;格式。

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

请确保在执行此操作之前复制EXCEL,如果缺少某些内容,您可以对旧文档进行交叉引用。

答案 10 :(得分:-1)

Excel中存在困扰所有已发布版本的错误。

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

适用于XLSXLSX个文件。

答案 11 :(得分:-1)

我知道上面有一些有趣的方法可以解决这个错误。

但是我会做一些基本技巧的总结来修复太多的单元格格式错误,但我认为它对于新的bies非常有效。

  1. 将工作表复制到新文件 - 它有效但需要时间
  2. 删除您不知道它们是什么的范围
  3. 重新格式化工作表,以便设置最小格式
  4. 清除所有格式
  5. 我希望你喜欢这些基本提示

    我关于错误How to fix too many different cell format

    的详细信息

答案 12 :(得分:-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-available/

我发现我需要.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 (没有恼人的警告)!!!

答案 13 :(得分:-2)

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

答案 14 :(得分:-2)

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

只需复制全部并将其粘贴到Word中即可。它会将内容检测为表格。然后选择所有列(通过左上角的十字标记完整的表格)并将其过去到新的.xls表格中,您将只有明确的值。