При работе с книгами Excel, особенно при копировании листов из одной книги в другую, можно столкнуться с ситуацией, когда в файле появляется множество лишнего «хлама», в том числе дополнительных стилей оформления ячеек, которые вам не нужны и которые следует удалить, так как они увеличивают размер файла. Рассмотрим два способа, как можно удалить стили в Excel.
Способ 1. Удаление лишних стилей в Excel при помощи макроса
Для примера я создал три пользовательских стиля, которые не использую в книге (в реальной жизни их может быть тысячи), которые необходимо удалить.
Воспользуемся макросом Excel, который автоматически удалит все такие стили. Для того, чтобы создать макрос, во-первых, необходимо открыть сам редактор макросов Visual Basic. Для этого нажмите комбинацию клавиш Alt+F11, либо зайдите в меню «Разработчик» и нажмите кнопку Visual Basic.
В случае, если у вас в ленте нет меню «Разработчик», то вам нужно его добавить. Для этого нажмите на ленту правой кнопкой и выберите пункт «Настройка ленты…»
В открывшемся окне ставим галочку напротив пункта «Разработчик» и необходимое нам меню появляется на ленте.
Итак, открыли Visual Basic. Выбираем меню «Insert» и в нем команду «Module».
В открывшемся окне вставляем следующий макрос:
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
Запускаем макрос, нажав на кнопку Run
После того, как макрос отработает (это может занять длительное время в случае, если пользовательских стилей очень много), вам будет выведено сообщение, что лишние стили удалены.
Закрываем Visual Basic, возвращаемся в Excel. Теперь в стилях остались только те, которые были в Excel по умолчанию.
Способ 2. Удаление стилей в Excel вручную
В случае, если стилей немного и нет желания разбираться с макросами, то лишние стили можно удалить вручную. Плюс этого способа в отличии от первого в том, что часть пользовательских стилей можно оставить для работы.
Для того что бы удалить пользовательский стиль откройте окно со стилями и нажмите правой клавишей на тот стиль, который вам не нужен и выберите команду «Удалить».
Стиль удален. Спасибо за прочтение статьи.
Слишком много различных форматов ячеек
Это может случиться и с вами.
Работая с большой книгой в Excel в один совсем не прекрасный момент вы делаете что-то совершенно безобидное (добавление строки или вставку большого фрагмента ячеек, например) и вдруг получаете окно с ошибкой «Слишком много различных форматов ячеек»:
Иногда эта проблема возникает в еще более неприятном виде. Накануне вечером вы, как обычно, сохранили и закрыли свой отчет в Excel, а сегодня утром не можете его открыть — выдается подобное же сообщение и предложение удалить все форматирование из файла. Радости мало, согласитесь? Давайте разберем причины и способы исправления этой ситуации.
Почему это происходит
Такая ошибка возникает, если в рабочей книге превышается предельно допустимое количество форматов, которое Excel может сохранять:
- для Excel 2003 и старше — это 4000 форматов
- для Excel 2007 и новее — это 64000 форматов
Причем под форматом в данном случае понимается любая уникальная комбинация параметров форматирования:
- шрифт
- заливки
- обрамление ячеек
- числовой формат
- условное форматирование
Так, например, если вы оформили небольшой фрагмент листа подобным образом:
… то Excel запомнит в книге 9 разных форматов ячеек, а не 2, как кажется на первый взгляд, т.к. толстая линия по периметру создаст, фактически 8 различных вариантов форматирования. Добавьте к этому дизайнерские танцы со шрифтами и заливками и тяга к красоте в большом отчете приведет к появлению сотен и тысяч подобных комбинаций, которые Excel будет вынужден запоминать. Размер файла от этого, само собой, тоже не уменьшается.
Подобная проблема также часто возникает при многократном копировании фрагментов из других файлов в вашу рабочую книгу (например при сборке листов макросом или вручную). Если не используется специальная вставка только значений, то в книгу вставляются и форматы копируемых диапазонов, что очень быстро приводит к превышению лимита.
Как с этим бороться
Направлений тут несколько:
- Если у вас файл старого формата (xls), то пересохраните его в новом (xlsx или xlsm). Это сразу поднимет планку с 4000 до 64000 различных форматов.
- Удалите избыточное форматирование ячеек и лишние «красивости» с помощью команды Главная — Очистить — Очистить форматы (Home — Clear — Clear Formatting). Проверьте, нет ли на листах строк или столбцов отформатированных целиком (т.е. до конца листа). Не забудьте про возможные скрытые строки и столбцы.
- Проверьте книгу на наличие скрытых и суперскрытых листов — иногда на них и кроются «шедевры».
- Удалите ненужное условное форматирование на вкладке Главная — Условное форматирование — Управление правилами — Показать правила форматирования для всего листа (Home — Conditional Formatting — Show rules for this worksheet).
- Проверьте, не накопилось ли у вас избыточное количество ненужных стилей после копирования данных из других книг. Если на вкладке Главная (Home) в списке Стили (Styles) огромное количество «мусора»:
…то избавиться от него можно с помощью небольшого макроса. Нажмите 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). Макрос удалит все неиспользуемые стили, оставив только стандартный набор:
Ссылки по теме
- Как автоматически подсвечивать ячейки с помощью условного форматирования в Excel
- Что такое макросы, куда и как копировать код макроса на Visual Basic, как их запускать
- Книга 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 -
►
Макрос для удаления всех пользовательских стилей в документе
Загрузка файлов Excel в Интернете может быть сложной, когда дело доходит до ситуаций, когда в стиле форматирования присутствует много неожиданных стилей. Итак, вы хотите удалить стиль, но есть много стилей форматирования, которые нельзя удалить.
В следующей статье рассказывается о 3 способах удаления стиля в Excel, пожалуйста, следуйте инструкциям.
Метод 1: удалить стиль вручную
Этот метод применяется только к небольшому количеству стилей, которые нужно удалить, вам нужно сделать следующее:
В интерфейсе файла Excel, чтобы удалить стиль, выберите Главная -> Стили ячеек.
Появится стиль форматирования, вы хотите удалить любой стиль, щелкните его правой кнопкой мыши и выберите «Удалить».
Метод 2: удалить стиль с помощью кода VBA
С файлом Excel со многими стилями форматирования этот способ поможет вам автоматически удалить все стили в файле Excel, вы выполните следующие действия:
Шаг 1. В файле Excel, чтобы удалить упрямый стиль форматирования, выберите «Разработчик» -> «Visual Basic» или нажмите Alt + F11, чтобы открыть окно Microsoft Visual Basic для приложения.
Шаг 2: В этом окне выберите Вставить -> Модуль.
Шаг 3. Скопируйте приведенный ниже код и вставьте его в редактор кода, затем выключите окно.
Visual Basic. Sub StyleKill () Dim styT As Style Dim intRet As Integer при ошибке Возобновить далее для каждого стиля в ActiveWorkbook.Styles, если не styT.BuiltIn, тогда, если styT.Name «1», то styT.Delete End, если следующий стиль, конец Sub
Шаг 4: Выберите «Разработчик» -> «Макросы» или выберите «Обзор» -> «Макросы», чтобы открыть диалоговое окно «Макрос».
Шаг 5: Дважды щелкните StyleKill, чтобы запустить модуль удаления стиля форматирования.
Затем проверьте еще раз, выбрав «Главная» -> «Стили ячеек», и вы увидите, что стили были стерты.
Метод 3: удалить стиль, удалив файл Style.xml
Примечание. Если ваш компьютер не отображает формат файла, вы устанавливаете формат отображения. Если вы не знаете, как отображать, перейдите в проводник, выберите «Просмотр» -> «Параметры».
Появится диалоговое окно «Параметры папок», выберите вкладку «Просмотр», в дополнительных настройках снимите флажок перед строкой «Скрыть расширения для известных типов файлов» и нажмите «ОК».
Итак, вы открыли формат файла на компьютере, затем выполните следующие действия:
Шаг 1. Откройте файл Excel .xlsx (или .xls), а затем нажмите клавишу F12, чтобы открыть окно «Сохранить как», сохраните новый файл в формате .xlsm, как показано ниже.
Шаг 2. Перейдите в каталог, содержащий только что сохраненный файл .xlsm, измените формат .xlsm на формат .zip. Появится сообщение «Переименовать», выберите «Да».
Шаг 3: Дважды щелкните, чтобы открыть zip-файл, затем выберите папку xl.
Шаг 4: Откройте файл styles.xml в Блокноте.
Шаг 5. Здесь вы используете функцию поиска (Ctrl + F) и переходите к коду.
Шаг 6. Замените код следующим кодом, который вы сохраняете в файле styles.xml.
Шаг 7. Как только вы сохраните и закроете файл styles.xml, в папке winrar открываемого файла Excel появится измененный файл styles.xml, выберите «Да» и закройте файл .zip.
Шаг 8. Преобразуйте файл из формата .zip в .xlsm.
Вы открываете файл Excel, появляется сообщение. Мы обнаружили проблему с некоторым содержимым. вы выбираете Да. Итак, вы видите результаты, затем сохраните в формате .xlsx или .xls произвольно.
Макрос удаления неиспользуемых стилей оформления
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