Тема неоднократно поднималась на форуме, например, совсем недавно: Пустая книга Excel 2010 - 137 КБ, Откуда берется размер? Предлагается программная реализация естественного механизма Excel: удалять не используемые имена, стили, числовые форматы (возможно, это не полный список) при копировании содержимого в новую книгу (Выделить на листе >> Копировать >> Вставить)
Последовательность действий описана на листе книги "Справка" Простота метода является кажущейся, что собственно, и послужило поводом для написания программы
Программа - рабочая книга Excel написана с открытым кодом Авторы надеются на расширение творческого коллектива
О! Вопрос-таки поднялся опять! Сколько раз начинали, а так до завершенного "фитнесс-комбайна" и не довели ни разу - слишком много разных "отягощающих" факторов Сейчас скачаю, завтра если будет время (???) на работе проверю на паре "монстров". Если удастся поковыряться, обязательно отпишусь.
Есть сбой! - в одной книге неточно восстановилось разбиение окон Возвращаясь к вопросу об очистке неиспользуемых имён Чтобы обосновать уверенность, хочу завтра подготовить тестовую книгу с каскадными именованными ссылками Найти неиспользуемые имена такого рода другим методом очень сложно Твоя идея, высказанная в параллельной теме, о списке имён хороша, но такой список должен включать признак используемости, который предварительно предлагается получить упрощённым вариантом копирования Заодно можно получить списки неиспользуемых стилей и числовых форматов Удаление всего этого хлама непосредственно в исходной книге - хороший способ "мягкой" очистки на месте
На работе завал. Посмотрел код мельком. Не нашёл где отсеиваются при копировании 0D-картинки и комментарии? И для не 0D-комментариев в новом документе лучше копировать не только Shape.Left и Shape.Top, но и хотя бы ширину. А, может быть и вообще коллекцию Shape.Adjustments?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Нашёл ошибку! Наспех добавленная галочка для игнорирования "пустых листов" глючит по-чёрному (подлатаем в ближайшее время - пока не менять её значение)
Цитата
Alex_ST пишет: Не нашёл где отсеиваются при копировании 0D-картинки и комментарии?
Такой возможности пока нет (только анализ) Есть ещё 1 ошибка! - некачественный перенос графики в XL2007
26.01.013 - исправил замеченные ошибки, версию программы в первом сообщении обновил
Тестовая книга для контроля очистки не используемых имён (имеет внешнюю связь) Зелёными рамками выделены диапазоны/объекты со ссылками на имена При работе чистилки эти имена сохраняются (исключение - диаграмма со ссылками на локальные именованные диапазоны - на слабом компе из-за неё даже возможно зависание Excel - лучше не проводить эксперимент на книге с такой диаграммой, и удалить её до начала чистки) Если теперь удалить диапазоны/объекты в рамках, имена потеряют ссылки (предварительно можно перемещать эти диапазоны на другие листы - результат не изменится) Чистилка распознает и удалит все "забытые" имена, включая "каскадные" Результат не зависит от видимости имён Найти подобные имена другим способом для большого количества ячеек проблематично Для тестирования снять галочку "Защитить имена от удаления" Пожалуйста, смотрите обновлённую версию в 1-м сообщении (я подправляю найденные ошибки)
Тест на качество переноса графических объектов Тестовая книга не будет особо сжиматься Задача этого теста, в отличие от предыдущего - максимально сохранить, не навредить Начиная с XL2007 перенести/скопировать объекты не так просто и в ручном режиме Лёш, вспоминай - это твоё творение
Пожалуйста, смотрите обновлённую версию в 1-м сообщении (я исправляю найденные ошибки)
Приветствую. Может быть кому-то еще будет интересно. Столкнулся с "жирностью" и в поисках набрел на это решение, которое оказалось нерабочим минимум в 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