Страницы: 1
RSS
Чистка рабочей книги от неиспользуемых имён, стилей, и т.д.
 
Тема неоднократно поднималась на форуме, например, совсем недавно:
Пустая книга Excel 2010 - 137 КБ, Откуда берется размер?
Предлагается программная реализация естественного механизма Excel: удалять не используемые имена, стили, числовые форматы (возможно, это не полный список) при копировании содержимого в новую книгу (Выделить на листе >> Копировать >> Вставить)

Последовательность действий описана на листе книги "Справка"
Простота метода является кажущейся, что собственно, и послужило поводом для написания программы

Программа - рабочая книга Excel написана с открытым кодом
Авторы надеются на расширение творческого коллектива
Изменено: v__step - 26.01.2013 21:21:14 (Несколько исправлений - отчёт на листе "Журнал")
 
О! Вопрос-таки поднялся опять!
Сколько раз начинали, а так до завершенного "фитнесс-комбайна" и не довели ни разу - слишком много разных "отягощающих" факторов :)
Сейчас скачаю, завтра если будет время (???) на работе проверю на паре "монстров".
Если удастся поковыряться, обязательно отпишусь.
Изменено: Alex_ST - 20.01.2013 19:46:33
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
На работу притащил, но "ожиревший" файл для пробы найти что-то никакой не могу :(
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Есть сбой! - в одной книге неточно восстановилось разбиение окон
Возвращаясь к вопросу об очистке неиспользуемых имён
Чтобы обосновать уверенность, хочу завтра подготовить тестовую книгу с каскадными именованными ссылками
Найти неиспользуемые имена такого рода другим методом очень сложно
Твоя идея, высказанная в параллельной теме, о списке имён хороша, но такой список должен включать признак используемости, который предварительно предлагается получить упрощённым вариантом копирования
Заодно можно получить списки неиспользуемых стилей и числовых форматов
Удаление всего этого хлама непосредственно в исходной книге - хороший способ "мягкой" очистки на месте
Изменено: v__step - 26.01.2013 14:38:19
 
На работе завал.
Посмотрел код мельком.
Не нашёл где отсеиваются при копировании 0D-картинки и комментарии?
И для не 0D-комментариев в новом документе лучше копировать не только Shape.Left и Shape.Top, но и хотя бы ширину. А, может быть и вообще коллекцию Shape.Adjustments?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Нашёл ошибку! Наспех добавленная галочка для игнорирования "пустых листов" глючит по-чёрному (подлатаем в ближайшее время - пока не менять её значение)
Цитата
Alex_ST пишет:
Не нашёл где отсеиваются при копировании 0D-картинки и комментарии?
Такой возможности пока нет (только анализ)
Есть ещё 1 ошибка! - некачественный перенос графики в XL2007

26.01.013 - исправил замеченные ошибки, версию программы в первом сообщении обновил
Изменено: v__step - 26.01.2013 23:48:46
 
Тестовая книга для контроля очистки не используемых имён (имеет внешнюю связь)
Зелёными рамками выделены диапазоны/объекты со ссылками на имена
При работе чистилки эти имена сохраняются (исключение - диаграмма со ссылками на локальные именованные диапазоны - на слабом компе из-за неё даже возможно зависание Excel - лучше не проводить эксперимент на книге с такой диаграммой, и удалить её до начала чистки)
Если теперь удалить диапазоны/объекты в рамках, имена потеряют ссылки (предварительно можно перемещать эти диапазоны на другие листы - результат не изменится)
Чистилка распознает и удалит все "забытые" имена, включая "каскадные"
Результат не зависит от видимости имён
Найти подобные имена другим способом для большого количества ячеек проблематично
Для тестирования снять галочку "Защитить имена от удаления"
Пожалуйста, смотрите обновлённую версию в 1-м сообщении (я подправляю найденные ошибки)
Изменено: v__step - 26.01.2013 21:38:03
 
Тест на качество переноса графических объектов
Тестовая книга не будет особо сжиматься
Задача этого теста, в отличие от предыдущего - максимально сохранить, не навредить
Начиная с XL2007 перенести/скопировать объекты не так просто и в ручном режиме  :(  
Лёш, вспоминай - это твоё творение

Пожалуйста, смотрите обновлённую версию в 1-м сообщении (я исправляю найденные ошибки)
Изменено: v__step - 26.01.2013 21:43:18
 
Приветствую.
Может быть кому-то еще будет интересно.
Столкнулся с "жирностью" и в поисках набрел на это решение, которое оказалось нерабочим минимум в Excel 2010 в части очистки/удаления "заграничных" ячеек.
Других удобных и работающих вариантов не нашлось, так что потратил время на разборки и доработку предложенного здесь.
Правки ниже касаются функции Очистить_СтолбцыСтроки. Ошибочно определялось (скорее не определялось) значение переключателя _ЧиститьУдалять. И не работал оператор, задающий диапазон ячеек для последующей чистки/удаления (Set rToClear=...), диапазон оказывался пустым из-за переполнения.
После некоторых раздумий родился фикс, успешно справляющийся со своей задачей. Неработающие строки закомментированы, следом идут работающие.
Код
        If Not IsSheetEmpty(wsh) Then
            Set cLastCell = wsh.Cells.Find("*", wsh.Cells(1), xlFormulas, xlPart, xlByColumns, xlPrevious, False, False)
            If cLastCell.Column < wsh.Columns.Count Then
'                Set rToClear = Range(wsh.Columns(cLastCell.Column + 1), wsh.Cells(wsh.Cells.Count))
'                If ThisWorkbook.Names("_ЧиститьУдалять") = 1 Then
                 If ThisWorkbook.Names("_ЧиститьУдалять").RefersToRange.Value = 1 Then
'                    rToClear.Clear
                     wsh.Columns((cLastCell.Column + 1) & ":" & wsh.Columns.Count).Clear
                Else
'                    rToClear.Merge        'защита от автокоррекции высоты строк
                     wsh.Columns((cLastCell.Column + 1) & ":" & wsh.Columns.Count).Merge
'                    rToClear.Delete
                     wsh.Columns((cLastCell.Column + 1) & ":" & wsh.Columns.Count).Delete
                End If
            End If
            Set cLastCell = wsh.Cells.Find("*", wsh.Cells(1), xlFormulas, xlPart, xlByRows, xlPrevious, False, False)
            If cLastCell.Row < wsh.Rows.Count Then
'                Set rToClear = Range(wsh.Rows(cLastCell.Row + 1), wsh.Cells(wsh.Cells.Count))
'                If ThisWorkbook.Names("_ЧиститьУдалять") = 1 Then
                 If ThisWorkbook.Names("_ЧиститьУдалять").RefersToRange.Value = 1 Then
'                    rToClear.Clear
                    wsh.Rows((cLastCell.Row + 1) & ":" & wsh.Rows.Count).Clear
                Else
'                    rToClear.Merge
                    wsh.Rows((cLastCell.Row + 1) & ":" & wsh.Rows.Count).Merge
'                    rToClear.Delete
                    wsh.Rows((cLastCell.Row + 1) & ":" & wsh.Rows.Count).Delete
                End If
            End If
        End If
Изменено: NewcomerAl - 04.10.2017 15:07:25 (форматирование кода)
Страницы: 1
Читают тему
Наверх