Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2009, 11:08   #1
garik64
Форумчанин
 
Регистрация: 09.07.2009
Сообщений: 111
Вопрос Как убить лишние стили в документе Word 2003

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

Речь идёт именно об удалении стилей, а не об "очистке формата". (По организационным причинам использовать шаблон, защищать документ и т.п. нельзя).

После того, как текст обработан, в нём активны только десять собственных стилей. Вкладка «Стили» показывает, что не используются, но доступны разные «Стандартный HTML», «Знак», «Строгий», «Arial, 11 пт», «основной + полужирный» и т.п. Это всё мусор, его надо убить.

Сделал макрос:

***
Sub стилеубийца ()

' Определяем, какого рожна ищем
Dim DeadStyle As Word.Style

For Each DeadStyle In ActiveDocument.Styles

' Ищем пользовательский стиль. Если он не встроенный и не используется,

If DeadStyle.BuiltIn = False And DeadStyle.InUse = False Then

' убиваем вдребезги пополам
DeadStyle.Delete
End If

' Ищем следующий
Next DeadStyle

' Рапортуем о результатах
MsgBox "Всех убили!"

End Sub
***

Старательно ищет, но ничего не находит. Условие DeadStyle.InUse почему-то равно True. Вручную мусор убивается свободно, а вот как бы это автоматизировать?
garik64 вне форума Ответить с цитированием
Старый 09.07.2009, 22:02   #2
Busine2009
Новичок
Джуниор
 
Регистрация: 23.05.2009
Сообщений: 167
По умолчанию

При убитии стилей, соответственно текст потеряет свое оформление.

Как вы будете потом определять, каким образом должен быть оформлен текст?

Удалить стили из документа очень просто:

Сервис - Шаблоны и надстройки - Организатор - Вкладка Стили - В левом поле "Из Название документа" выделяете все стили (щелкаете по первому стилю, с помощью бегунка переходите к последнему стилю, щелкаете по последнему стилю, удерживая нажатой кн. Шифт - Все стили будут выделены) - Нажимаете удалить - Будут появлятся сообщения о том, что нельзя удалить встроенные стили - Затем переходите в левое поле - Также выделяете все стили и нажимаете Копировать. В этом документе остануться только стили из вашего шаблона.
Busine2009 вне форума Ответить с цитированием
Старый 10.07.2009, 00:23   #3
CaptainNemo
Пользователь
 
Аватар для CaptainNemo
 
Регистрация: 02.06.2009
Сообщений: 49
По умолчанию

Цитата:
Сообщение от garik64 Посмотреть сообщение
Sub стилеубийца ()
' Определяем, какого рожна ищем
Dim DeadStyle As Word.Style
For Each DeadStyle In ActiveDocument.Styles
' Ищем пользовательский стиль. Если он не встроенный и не используется,
If DeadStyle.BuiltIn = False And DeadStyle.InUse = False Then
' убиваем вдребезги пополам
DeadStyle.Delete
End If
' Ищем следующий
Next DeadStyle
' Рапортуем о результатах
MsgBox "Всех убили!"
End Sub
***
Осмелюсь предположить, что приведенный вами код не работает по двум причинам:
1) Логичнее было бы поставить оператор Or вместо And, поскольку в данном случае проверяется условие: если стиль не встроенный и не используемый, тогда его нужно удалить;
2) Если сделать так, как в пункте 1, то получите сообщение об ошибке потому, что свойство .InUse доступно только для чтения. Т.е. получится удалить только стили со свойством .BuiltIn=False
Android & Linux
CaptainNemo вне форума Ответить с цитированием
Старый 10.07.2009, 06:05   #4
garik64
Форумчанин
 
Регистрация: 09.07.2009
Сообщений: 111
По умолчанию

Цитата:
Сообщение от Busine2009 Посмотреть сообщение
При убитии стилей, соответственно текст потеряет свое оформление.

Как вы будете потом определять, каким образом должен быть оформлен текст?
Я же говорю: текст оформлен моими стилями. Они должны остаться.

Цитата:
Удалить стили из документа очень просто:
Да прекрасно я знаю, как это делается. Мне бы автоматизацию процесса! (В скобках заметим, что мне не нужны стили из нормалдота. Как шаблон используется сам документ. Так что удалять их приходится, просто открывая вкладку "Стили" и убивая по одному).
garik64 вне форума Ответить с цитированием
Старый 10.07.2009, 06:14   #5
garik64
Форумчанин
 
Регистрация: 09.07.2009
Сообщений: 111
По умолчанию

Цитата:
Сообщение от CaptainNemo Посмотреть сообщение
Осмелюсь предположить, что приведенный вами код не работает по двум причинам:
1) Логичнее было бы поставить оператор Or вместо And, поскольку в данном случае проверяется условие: если стиль не встроенный и не используемый, тогда его нужно удалить;
Не понял, почему логичнее? Мне и нужно убить НЕвстроенные НЕиспользуемые стили, отсюда и "And". (Конечно, проверку на встроенность можно и опустить, т.к. эти стили всё равно не убьются; она здесь для гладкости, чтобы Word не орал, что, мол, error и всё такое)

Если стиль НЕвстроенный, но используется - его надо оставить. По идее, макрос должен это делать. Но он считает, что таких стилей в документе нет. Видимо, я слишком многого не понимаю в программировании.
garik64 вне форума Ответить с цитированием
Старый 10.07.2009, 17:16   #6
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от garik64 Посмотреть сообщение
…Как шаблон используется сам документ. …
Документ используется как шаблон, или является шаблоном?
вот что я придумал. Должно получиться. Оказывается, что работать со стилями можно, в общем и нужно, через Органайзер. Стили документа нужны только для определения их имени.
Код:
Sub стилеубийца()

' Определяем, какого рожна ищем
Dim DeadStyle As Word.Style

For Each DeadStyle In ActiveDocument.Styles

' Ищем пользовательский стиль. Если он не встроенный и не используется,

If DeadStyle.BuiltIn = False And DeadStyle.InUse = False Then
  Application.OrganizerDelete ActiveDocument.Name, DeadStyle.NameLocal, wdOrganizerObjectStyles
End If

' Ищем следующий
Next DeadStyle
'Удаляем из шаблона, на котором основан документ
Dim oTmpl As Document
Set oTmpl = ActiveDocument.AttachedTemplate.OpenAsDocument
For Each DeadStyle In oTmpl.Styles
  Application.OrganizerDelete oTmpl.Name, DeadStyle.NameLocal, wdOrganizerObjectStyles
Next

' Рапортуем о результатах
MsgBox "Всех убили!"

End Sub
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 10.07.2009 в 17:21.
viter.alex вне форума Ответить с цитированием
Старый 11.07.2009, 07:15   #7
Busine2009
Новичок
Джуниор
 
Регистрация: 23.05.2009
Сообщений: 167
По умолчанию

То, что я выше написал - необдуманно. После такого действия всё оформление слетит.
Busine2009 вне форума Ответить с цитированием
Старый 11.07.2009, 10:21   #8
Busine2009
Новичок
Джуниор
 
Регистрация: 23.05.2009
Сообщений: 167
По умолчанию

После запуска этого макроса открывается документ с именем Normal, и сообщение об ошибке:
Run-time error 5512.
Стиль с таким именем не существует.
Ошибка в этом месте:

Application.OrganizerDelete oTmpl.Name, DeadStyle.NameLocal, wdOrganizerObjectStyles

А еще вот такая штука.

Я взял все удалил из документа (котрол А - делит), остался только знак абзаца, а справа в списке стилей, под названием Используемые целый перечень стилей, как это можно объяснить?

Вот цитата из Справки по Ворду (О, боже, справка, справка, - когда же ты будешь помогать юзерам?):
Выберите Доступное форматирование для восстановления стандартного режима, Используемое форматирование для отображения только форматирования, используемого в документе...

У меня документ с одним абзацем - это получается, что все 100 стилей, отображаемые в списке стилей, применены к этому знаку абзаца?

Последний раз редактировалось Busine2009; 11.07.2009 в 10:37.
Busine2009 вне форума Ответить с цитированием
Старый 11.07.2009, 10:31   #9
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Busine2009 Посмотреть сообщение
После запуска этого макроса открывается документ с именем Normal, и сообщение об ошибке:
Run-time error 5512.
Стиль с таким именем не существует.…
Ошибка не в коде, просто в шаблоне такого стиля нет, он хранится в документе. Сразу после имени процедуры добавьте On Error Resume Next, ну или сами напишите проверку на существование стиля в документе или в шаблоне

Цитата:
Сообщение от Busine2009 Посмотреть сообщение
…А еще вот такая штука.

Я взял все удалил из документа (котрол А - делит), остался только знак абзаци, а справа в списке стилей, под названием Используемые целый перечень стилей, как это можно объяснить?
Закрой и открой документ
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 11.07.2009, 10:34   #10
Busine2009
Новичок
Джуниор
 
Регистрация: 23.05.2009
Сообщений: 167
По умолчанию

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

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

Последний раз редактировалось Busine2009; 11.07.2009 в 10:36.
Busine2009 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многоуровневый список и стили в Word 2007 CaptainNemo Microsoft Office Word 12 08.06.2009 23:45
Стили MS WORD 2007 max38934 Microsoft Office Word 4 04.06.2009 02:25
как вставить ссылку на ячейку в документе Excel в Word? ruavia3 Microsoft Office Excel 3 19.03.2009 21:32
как вставить ссылку в Word на ячейку в документе Excel? ruavia3 Microsoft Office Word 2 19.03.2009 21:24
Фон в документе Microsoft Word AleksP Microsoft Office Word 8 14.09.2008 17:55