删除所有自定义单元格样式 EXCEL

有没有办法在工作簿中删除所有自定义/创建的单元格样式?只保留默认样式。 而不必一个一个地删除它们。

enter image description here

6个回答

试试这个简单的 VBA 宏:
Sub StyleKiller()
    Dim N As Long, i As Long

    With ActiveWorkbook
        N = .Styles.Count
        For i = N To 1 Step -1
            If Not .Styles(i).BuiltIn Then .Styles(i).Delete
        Next i
    End With
End Sub
这解决了“内置”与“自定义”的问题。请注意,我们向后运行循环以避免破坏循环索引。

有用的一句话,☺ - Rajesh Sinha
出于某种原因,删除第一个非内置样式时显示了一个通用错误消息。Andreas下面的解决方案确实有效。 - Andrew

只需使用以下方法即可简单地删除所有内容,而不使用INDEX
Sub StyleKiller()
    Dim st As Style
    On Error Resume Next
    For Each st In ActiveWorkbook.Styles
      If Not st.BuiltIn Then
        st.Delete
      End If
    Next
    On Error GoTo 0
End Sub

谢谢回答!这个比我的版本简单多了,我稍后会测试一下,如果有效的话,我会接受作为正确答案。 - PeterH
使用On Error Resume NextOn Error GoTo 0是我个人认为的糟糕编码风格。我猜你可以安全地将它们移除。 - Vince42

以上的方法都可以,但是我们的工作电脑比较老旧,所以宏经常会崩溃。由于某种原因,很多文件中有数百个单元格样式,这会导致文档运行缓慢。 我的解决方案非常简单和快捷。 选择工作簿中的所有工作表,并将它们复制到一个新的工作簿中。这样可以保留所有的外部链接和格式,但是样式不会被复制过去。 保存你的新工作簿覆盖旧的工作簿(先关闭旧的工作簿)。

欢迎来到超级用户,并感谢您的回答,对于非VBA的替代方案总是很有帮助! - PeterH

论及自定义样式的问题,还可以参考http://support.microsoft.com/kb/213904。 我发现按照KB文章中建议的方式,在MS商店安装免费的“XLStyles工具”是一个非常方便的删除自定义样式的方法。

绝对是正确的选择。 - Guile

好的,这并不像我最初想象的那么难。 由于我很少使用VBA,所以代码有点凌乱;但是这段代码将恢复为默认样式:
Sub DefaultStyles()
   Dim MyBook As Workbook
   Dim tempBook As Workbook
   Dim CurStyle As Style
   Set MyBook = ActiveWorkbook
   On Error Resume Next
   For Each CurStyle In MyBook.Styles
      Select Case CurStyle.Name
         Case "20% - Accent1", "20% - Accent2", _
               "20% - Accent3", "20% - Accent4", "20% - Accent5", "20% - Accent6", _
               "40% - Accent1", "40% - Accent2", "40% - Accent3", "40% - Accent4", _
               "40% - Accent5", "40% - Accent6", "60% - Accent1", "60% - Accent2", _
               "60% - Accent3", "60% - Accent4", "60% - Accent5", "60% - Accent6", _
               "Accent1", "Accent2", "Accent3", "Accent4", "Accent5", "Accent6", _
               "Bad", "Calculation", "Check Cell", "Comma", "Comma [0]", "Currency", _
               "Currency [0]", "Explanatory Text", "Good", "Heading 1", "Heading 2", _
               "Heading 3", "Heading 4", "Input", "Linked Cell", "Neutral", "Normal", _
               "Note", "Output", "Percent", "Title", "Total", "Warning Text"
         Case Else
            CurStyle.Delete
      End Select
   Next CurStyle
   Set tempBook = Workbooks.Add
   Application.DisplayAlerts = False
   MyBook.Styles.Merge Workbook:=tempBook
   Application.DisplayAlerts = True
   tempBook.Close
End Sub

其实我喜欢你遍历Styles的方式,而不是我自己遍历索引。 - Gary's Student
在这里删除一个集合会出现问题。 - AJD
@AJD 嗨,谢谢你的评论,这可能会引起什么问题? - PeterH
@PeterH:删除转发意味着集合中的项目将重新编号。例如,在循环中,j 等于 1,然后你执行 Delete(1)。(2)移动到(1),但是 j 增加到 2,所以下一步是 Delete(2),这是旧的(3)。For Each 是一个枚举循环,因此使用相同的逻辑。在 StackOverflow 上有一个很好的解释 - 我找不到它了,但这些链接也解释了这个问题:https://stackoverflow.com/questions/18858718/word-vba-shaperange-delete-unexpected-behavior/18859393#18859393,https://stackoverflow.com/questions/45585393/vba-loop-and-delete-issue - AJD
@AJD 感谢提供的信息,这个宏本身运行如预期,自从我在二月份发布以来,我已经在多个工作簿上使用过它。 - PeterH
@PeterH:那就是运气好,而不是有意为之。 - AJD
@AJD请解释一下,我对VBA不太擅长,所以如果能学到点东西就太好了。我知道你说过j is = 1,但是在宏中我没有使用这个变量。 - PeterH
@PeterH,我用了j,因为这个框里的自动纠正总是把I大写!看一下我评论中放的那些链接,它们有讨论为什么的答案。 - AJD
1微软有完全相同的代码,尽管其中包含注释和更多指引。您可以在以下链接中找到该代码:https://support.microsoft.com/zh-cn/topic/how-to-programmatically-reset-a-workbook-to-default-styles-36e94af7-d185-68fb-3962-0882a5260132 - Micah Lindström
请注意,“超链接”可以说是一个默认样式,应该保留。在新建的工作簿中,它并不存在,但如果你将单元格设置为超链接,它会自动出现。 - Micah Lindström

非常简单的方法。 步骤1:将Excel文件改名为.zip 步骤2:在同一文件夹中提取文件:“在此处提取文件” 步骤3:用记事本打开Styles.xml 步骤5:选择从到并删除。 步骤6:保存文件,退出子目录并将所有文件转换为ZIP 步骤7:将.zip文件改名为.xlsx 步骤8:使用Excel打开并享受

谢谢你的回答!虽然我不会说这是一种简单的方法 :) - PeterH