Макрос для удаления стилей в excel

Слишком много различных форматов ячеек

Это может случиться и с вами.

Работая с большой книгой в Excel в один совсем не прекрасный момент вы делаете что-то совершенно безобидное (добавление строки или вставку большого фрагмента ячеек, например) и вдруг получаете окно с ошибкой «Слишком много различных форматов ячеек»:

too-many-formats1.png

Иногда эта проблема возникает в еще более неприятном виде. Накануне вечером вы, как обычно, сохранили и закрыли свой отчет в Excel, а сегодня утром не можете его открыть — выдается подобное же сообщение и предложение удалить все форматирование из файла. Радости мало, согласитесь? Давайте разберем причины и способы исправления этой ситуации.

Почему это происходит

Такая ошибка возникает, если в рабочей книге превышается предельно допустимое количество форматов, которое Excel может сохранять:

  • для Excel 2003 и старше — это 4000 форматов
  • для Excel 2007 и новее — это 64000 форматов

Причем под форматом в данном случае понимается любая уникальная комбинация параметров форматирования:

  • шрифт
  • заливки
  • обрамление ячеек
  • числовой формат
  • условное форматирование

Так, например, если вы оформили небольшой фрагмент листа подобным образом:

too-many-formats4.png

… то Excel запомнит в книге 9 разных форматов ячеек, а не 2, как кажется на первый взгляд, т.к. толстая линия по периметру создаст, фактически 8 различных вариантов форматирования. Добавьте к этому дизайнерские танцы со шрифтами и заливками и тяга к красоте в большом отчете приведет к появлению сотен и тысяч подобных комбинаций, которые Excel будет вынужден запоминать. Размер файла от этого, само собой, тоже не уменьшается.

Подобная проблема также часто возникает при многократном копировании фрагментов из других файлов в вашу рабочую книгу (например при сборке листов макросом или вручную). Если не используется специальная вставка только значений, то в книгу вставляются и форматы копируемых диапазонов, что очень быстро приводит к превышению лимита.

Как с этим бороться

Направлений тут несколько:

  1. Если у вас файл старого формата (xls), то пересохраните его в новом (xlsx или xlsm). Это сразу поднимет планку с 4000 до 64000 различных форматов.
  2. Удалите избыточное форматирование ячеек и лишние «красивости» с помощью команды Главная — Очистить — Очистить форматы (Home — Clear — Clear Formatting). Проверьте, нет ли на листах строк или столбцов отформатированных целиком (т.е. до конца листа). Не забудьте про возможные скрытые строки и столбцы.
  3. Проверьте книгу на наличие скрытых и суперскрытых листов — иногда на них и кроются «шедевры».
  4. Удалите ненужное условное форматирование на вкладке Главная — Условное форматирование — Управление правилами — Показать правила форматирования для всего листа (Home — Conditional Formatting — Show rules for this worksheet).
  5. Проверьте, не накопилось ли у вас избыточное количество ненужных стилей после копирования данных из других книг. Если на вкладке Главная (Home) в списке Стили (Styles) огромное количество «мусора»:

    too-many-formats2.png

    …то избавиться от него можно с помощью небольшого макроса. Нажмите Alt+F11 или кнопку Visual Basic на вкладке Разработчик (Developer), вставьте новый модуль через меню Insert — Module и скопируйте туда код макроса:

Sub Reset_Styles()
    'удаляем все лишние стили
    For Each objStyle In ActiveWorkbook.Styles
        On Error Resume Next
        If Not objStyle.BuiltIn Then objStyle.Delete
        On Error GoTo 0
    Next objStyle
    'копируем стандартный набор стилей из новой книги
    Set wbMy = ActiveWorkbook
    Set wbNew = Workbooks.Add
    wbMy.Styles.Merge wbNew
    wbNew.Close savechanges:=False
End Sub
  

Запустить его можно с помощью сочетания клавиш Alt+F8 или кнопкой Макросы (Macros) на вкладке Разработчик (Developer). Макрос удалит все неиспользуемые стили, оставив только стандартный набор:

too-many-formats3.png

Ссылки по теме

  • Как автоматически подсвечивать ячейки с помощью условного форматирования в Excel
  • Что такое макросы, куда и как копировать код макроса на Visual Basic, как их запускать
  • Книга Excel стала очень тяжелой и медленной — как исправить?

При работе с книгами Excel, особенно при копировании листов из одной книги в другую, можно столкнуться с ситуацией, когда в файле появляется множество лишнего «хлама», в том числе дополнительных стилей оформления ячеек, которые вам не нужны и которые следует удалить, так как они увеличивают размер файла. Рассмотрим два способа, как можно удалить стили в Excel.

Как удалить лишние стили в Excel

Способ 1. Удаление лишних стилей в Excel при помощи макроса

Для примера я создал три пользовательских стиля, которые не использую в книге (в реальной жизни их может быть тысячи), которые необходимо удалить.

Как удалить лишние стили в Excel

Воспользуемся макросом Excel, который автоматически удалит все такие стили. Для того, чтобы создать макрос, во-первых, необходимо открыть сам редактор макросов Visual Basic. Для этого нажмите комбинацию клавиш Alt+F11, либо зайдите в меню «Разработчик» и нажмите кнопку Visual Basic.

Как удалить лишние стили в Excel

В случае, если у вас в ленте нет меню «Разработчик», то вам нужно его добавить. Для этого нажмите на ленту правой кнопкой и выберите пункт «Настройка ленты…»

Как удалить лишние стили в Excel

В открывшемся окне ставим галочку напротив пункта «Разработчик» и необходимое нам меню появляется на ленте.

Как удалить лишние стили в Excel

Итак, открыли Visual Basic. Выбираем меню «Insert» и в нем команду «Module».

Как удалить лишние стили в Excel

В открывшемся окне вставляем следующий макрос:

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
MsgBox («Лишние стили удалены»)
End Sub

Как удалить лишние стили в Excel

Запускаем макрос, нажав на кнопку Run

Как удалить лишние стили в Excel

После того, как макрос отработает (это может занять длительное время в случае, если пользовательских стилей очень много), вам будет выведено сообщение, что лишние стили удалены.

Как удалить лишние стили в Excel

Закрываем Visual Basic, возвращаемся в Excel. Теперь в стилях остались только те, которые были в Excel по умолчанию.

Как удалить лишние стили в Excel

Способ 2. Удаление стилей в Excel вручную

В случае, если стилей немного и нет желания разбираться с макросами, то лишние стили можно удалить вручную. Плюс этого способа в отличии от первого в том, что часть пользовательских стилей можно оставить для работы.

Для того что бы удалить пользовательский стиль откройте окно со стилями и нажмите правой клавишей на тот стиль, который вам не нужен и выберите команду «Удалить».

Как удалить лишние стили в Excel

Стиль удален. Спасибо за прочтение статьи.

Макрос для удаления всех пользовательских стилей в документе

Автор Димычч, 09.12.2014, 09:22

« назад — далее »

Добрый день.
Тема уже поднималась, но не была решена. Прошу помочь создать инструмент для её, хотя бы частичного, решения.
Напомню, чем опасно большое количество стилей в документе:
1. Увеличение объёма файла.
2. Увеличение времени открытия/пересчёта ячеек/сохранения файла.
3. Поскольку о достижении предельного значения стилей в документе (около 65000) эксель никак не сообщает, это может выражаться, например, во внезапном отказе добавлять новые листы, изменять форматы. Также, это может служить причиной вывода сообщения «Слишком много различных форматов ячеек» со всеми вытекающими.
Прошу не путать «Стили» и «Форматы». Документ может быть переполнен стилями и быть неработоспособным, при этом, в нём может быть единственный пустой лист с очищенными форматами. Заразить свой файл этой заразой можно всего лишь скопировав пустой лист из заражённого файла.
Удаление styles.xml — не решение, так как оно удаляет и все видимые форматы в книге.
Имеется макрос, удаляющий бОльшую часть ненужных ситилей:

Sub Del_Styles()
Dim stl As Style
On Error Resume Next
For Each stl In ActiveWorkbook.Styles
If Not stl.BuiltIn Then stl.Delete
Next
End Sub

Прошу помочь расширить его функционал, а именно: перед его запуском выводить запрос «Обнаружено ** стилей. Удалить? да/нет». И после окончания работы также выводить сообщение «Удалено ** стилей. ** осталось». Хочется и Progress-bar с % выполнения, но, думаю, это слишком сложно :)
Первый запрос нужен чтобы просто понять, есть ли необходимость вообще запускать этот макрос, так как он работает иногда по 30-40 мин.
Сведения о количестве стилей содержатся в styles.xml в разделах «cellStyleXfs count» и «cellXfs count».


Sub Del_Styles()
Dim stl As Style, S, col&, Scol&
On Error Resume Next
Scol = ActiveWorkbook.Styles.Count
S = MsgBox("Обнаружено " & Scol & " стилей. УДАЛИТЬ?", vbYesNo)
If S = vbYes Then
  For Each stl In ActiveWorkbook.Styles
  If Not stl.BuiltIn Then
  stl.Delete
  col = col + 1
  End If
  Next
End If
MsgBox "Удалено " & col & " стилей. " & Scol - col & " осталось."
End Sub

Progress-bar пока не приходилось делать так что моих знаний здесь возможно маловато для его создания.


Здорово! Всё работает!
Маленький нюанс: если в первом окне ответить НЕТ, то открывается второе, с нулевым результатом удаления. Логичнее было бы ничего не отображать после нажатия на НЕТ.
Интересное наблюдение: имеется файлик 800Кб, у него только одна табличка 20х8 на единственном листе. Запускаем макрос, видим «обнаружено 44000 стилей», макрос работает 19 минут над этим малышом, остаток — 45 стилей. Запускаю его повторно, вижу уже 316, чищу, вижу 45, и т.д. То есть остаются какие то неудаляемые. (вложение 3вв)


Цитата: Димычч от 09.12.2014, 11:52
Логичнее было бы ничего не отображать после нажатия на НЕТ.

перенесите последнее msgbox перед последим end if
47 заводских стиля у меня — они будут всегда оставаться.
про остальные ничего не скажу, знаний маловато.


Спасибо, всё работает в лучшем виде!


  • Профессиональные приемы работы в Microsoft Excel

  • Обмен опытом

  • Microsoft Excel

  • Макрос для удаления всех пользовательских стилей в документе

Макрос удаления неиспользуемых стилей оформления

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


Ok, this wasn’t as hard to do as I first thought.

Bit messy as I don’t often use vba; but this code will roll back to just the default styles:

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

Переполнение коллекции стилей ячеек

Excel файл может содержать не более 65535 стилей ячеек (доступны через меню ГЛАВНАЯ — Стили ячеек). Не совсем понятно как это достигается на практике (создание стиля довольно трудоемкая операция, если только генерировать их программно), но периодически приходится сталкиваться с файлами, которые вплотную подошли к данному пределу и при попытке отформатировать любую ячейку вы получаете следующую ошибку:

Более того, коль скоро у вас завелись такие файлы, то приходилось видеть, что при копировании какого-либо листа (или даже диапазона ячеек) из переполненного файла в новую книгу в неё перебиралась и эта огромная таблица стилей. Это даже отчасти напоминает вирусное заражение, хотя, конечно, им не является.

Данная проблема не решается через пользовательский интерфейс Excel — необходима специальная программа, которая очистит таблицу стилей принудительно.

Большое количество именованных диапазонов

Второй возможный недуг, с которым борется моя утилита, состоит в том, что книга Excel может содержать огромное количество именованных диапазонов. При этом, иногда, их даже невозможно удалить через Диспетчер имён (Ctrl+F3), так как они могут быть повреждены. Признаком наличия в файле большого количества именованных диапазонов является огромное количество вопросов, которые задаёт вам Excel при попытке скопировать лист книги в саму себя. Данная проблема также имеет свойство «заражать» файлы и сохраняться длительное время.

Утилита CureExcel

Алгоритм ваших действий:

  1. Открыть файл CureExcel.xlsb

  2. Открыть в Excel предположительно «больной» файл

  3. В CureExcel нажать кнопку «Cure Excel» — откроется следующая форма

  4. В выпадающем списке выбрать ваш ранее открытый файл

  5. Нажать кнопку «Диагностика»

  6. Ознакомиться с выводом программы и её рекомендацией

  7. В случае наличия рекомендации по лечению, нажать кнопку «Лечить», подтвердить запуск операций

  8. Дождаться окончания процедуры. Стили удаляются довольно долго (65 000 стилей удаляются примерно 5-7 минут). Прогресс
    виден по статусной строке Excel. По окончании процедуры выводится статистика проделанных операций и достигнутого
    результата.

  9. Оригинальный файл остаётся неизменным, а исправленный файл с суффиксом «_CURE» сохраняется в той же
    папке, то есть операции совершенно безопасны.

Файлы для скачивания

Скачать утилиту CureExcel

Скачать пример файла с большим количеством стилей

I am working in a large xlsb (Microsoft Excel Binary Workbook) and have noticed that there is a very large number of custom styles saved in the file. I think the styles were all unintentionally included in the file when worksheets were copied in from other workbooks. I would like to delete all of the custom styles but the manual approach (right click and delete) doesn’t work. I then searched online for VBA solutions and found the three macros below but these doesn’t work either. When I run the macros they just immediately jump to the MsgBox without having deleted any of the custom styles. Hopefully someone here can shed some light on how I can either reconfigure the macros or direct me towards another solution. -> See updated info below!

Sub clear_all_styles()
 Dim styT As Style
 On Error Resume Next
 For Each styT In ActiveWorkbook.Styles
     If Not styT.BuiltIn Then
         If styT.Name <> "1" Then styT.Delete
     End If
 Next styT
 MsgBox "Macro completed" 'can be commented out
End Sub

.

Sub DeleteStyles()
    On Error Resume Next
    For Each sty In ActiveWorkbook.Styles
        If Not sty.BuiltIn Then
            sty.Delete
        End If
    Next sty
    MsgBox "Macro completed" 'can be commented out
End Sub

.

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
    MsgBox "Macro completed" 'can be commented out
End Sub

Updated Info: After searching more solution online (generally, none of these worked) I finally found a larger solution which worked (included below). This solution deleted the vast majority of the custom styles but approx. 20 styles remain which cant be deleted by the macro nor by manual action. I notice that all of these remaining custom styles seem to have special signs in them and I’m wondering if that’s the reason they can’t be deleted. If anyone can provide any guidance on this is would be much appreciated!

    Sub RebuildDefaultStyles()
    
    'The purpose of this macro is to remove all styles in the active
    'workbook and rebuild the default styles.
    'It rebuilds the default styles by merging them from a new workbook.
    
    'Dimension variables.
       Dim MyBook As Workbook
       Dim tempBook As Workbook
       Dim CurStyle As Style
    
       'Set MyBook to the active workbook.
       Set MyBook = ActiveWorkbook
       On Error Resume Next
       'Delete all the styles in the workbook.
       For Each CurStyle In MyBook.Styles
          'If CurStyle.Name <> "Normal" Then CurStyle.Delete
          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"
                'Do nothing, these are the default styles
             Case Else
                CurStyle.Delete
          End Select
    
       Next CurStyle
    
       'Open a new workbook.
       Set tempBook = Workbooks.Add
    
       'Disable alerts so you may merge changes to the Normal style
       'from the new workbook.
       Application.DisplayAlerts = False
    
       'Merge styles from the new workbook into the existing workbook.
       MyBook.Styles.Merge Workbook:=tempBook
    
       'Enable alerts.
       Application.DisplayAlerts = True
    
       'Close the new workbook.
       tempBook.Close
    
    End Sub

Понравилась статья? Поделить с друзьями:
  • Макрос для удаления пустых столбцов excel
  • Макрос для сортировки листов в excel
  • Макрос для создания файла excel
  • Макрос для создания таблиц в word
  • Макрос для создания списка в excel