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

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

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

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

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

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

Скорее всего в списке стилей отображается также и прямое форматирование.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 11.07.2009, 10:50   #12
Busine2009
Новичок
Джуниор
 
Регистрация: 23.05.2009
Сообщений: 167
По умолчанию

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

Сервис - Параметры - Правка - Вести учет форматирования.

У меня один абзац в документе, оформленный стилем Обычный. После применения макроса Витера, у меня в документе должны остаться только встроенные стили.

Но стилей по-прежнему куча. Получается, что макрос не работает, хотя бы очень пригодился для очистки документов.

Последний раз редактировалось Busine2009; 11.07.2009 в 11:03.
Busine2009 вне форума Ответить с цитированием
Старый 11.07.2009, 12:31   #13
garik64
Форумчанин
 
Регистрация: 09.07.2009
Сообщений: 111
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Документ используется как шаблон, или является шаблоном?
Стили находятся в самом документе, который и заполняют разные люди (точнее, одни люди присылают тексты, а другие потом копипастят их в итоговый документ. В самом конце эта мусорка попадает мне и я должен её привести в разумный вид).

Цитата:
Оказывается, что работать со стилями можно, в общем и нужно, через Органайзер. Стили документа нужны только для определения их имени.
А если имени нет? Человек вручную сделал красиво: CTRL-I, CTRL-B, да плюс заливку, да шрифт поменял? Всё равно ведь стиль. А в коллекцию не попадает.


"Application.OrganizerDelete ActiveDocument.Name, DeadStyle.NameLocal"

На этой строке спотыкается. Вставляю строку про "On Error Next". Открывает пустой нормал, сообщает, что всё лишнее уничтожено - да, в нём только встроенные, а документ как был, так и остался.

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

На всякий случай прицепляю файл "Пример" - гляньте, если не трудно. Если посмотреть на вкладку стилей, видно, что доступны совершенно ненужные оформления.
Вложения
Тип файла: doc пример.doc (62.5 Кб, 29 просмотров)
garik64 вне форума Ответить с цитированием
Старый 11.07.2009, 12:56   #14
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от garik64 Посмотреть сообщение
…А если имени нет? Человек вручную сделал красиво: CTRL-I, CTRL-B, да плюс заливку, да шрифт поменял? Всё равно ведь стиль. А в коллекцию не попадает. …
Вы путаетесь в понятиях. Есть понятие стилей, которые содержат в себе правила оформления частей документа. Каждый стиль имеет имя, обязательно. Стиль может быть встроенным или пользовательским, находиться в документе или в шаблоне.
А есть форматирование, которое отображается в списке стилей (сообщение 12 этой ветки)

Стили удалить можно, если они не встроенные. Как? Я уже показал. Форматирование можно только очистить. Поэтому, чтобы не видеть прямого форматирования, просто отключите его отображение в списке стилей.

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

Я включил в вашем документе отображение только используемых стилей и вся свалка пропала. Остались только нужные. Несмотря на то, что стоят галочки показывать форматирование.
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 11.07.2009 в 12:59.
viter.alex вне форума Ответить с цитированием
Старый 11.07.2009, 13:40   #15
garik64
Форумчанин
 
Регистрация: 09.07.2009
Сообщений: 111
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Вы путаетесь в понятиях.
Понял.

Цитата:
Форматирование можно только очистить.
Если на открытой вкладке, которая показывает форматирование, нажать на любой из них правой кнопкой мыши, выпадет меню: "Выделить все вхождения", "Изменить", "Удалить", "Обновить в соответствии с выделенным фрагментом". (И после очистки формата тоже). В моём примере первый пункт неактивен: таких фрагментов в документе нет. А удалить можно - если это не встроенный стиль, конечно. Вот эту задачу я и хотел автоматизировать.

Цитата:
Поэтому, чтобы не видеть прямого форматирования, просто отключите его отображение в списке стилей.
Чтобы не видеть, я просто не буду включать список стилей.

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

Цитата:
Я включил в вашем документе отображение только используемых стилей и вся свалка пропала. Остались только нужные. Несмотря на то, что стоят галочки показывать форматирование.
После того, как я вручную убираю мусор, текст уменьшается с ~ 500 килобайт до 180-200. Так что разница не только во внешнем виде. Кроме того, получают этот документ около восьмисот человек. У каждого менять настройки ворда? Нет, говорю же, организационные меры тут не помогут. Слишком давно это началось - задолго до меня. Свалка, можно сказать, исторически сложилась.

Ладно, буду думать дальше. В любом случае спасибо за помощь.
garik64 вне форума Ответить с цитированием
Старый 11.07.2009, 14:15   #16
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Интересная штука получается. Вот так можно получить список не встроенных стилей в документе:
Код:
Sub ExploreStyles()
  Dim oSt As Style, i As Integer, oTmpl As Document
  FilneNum = FreeFile
  Open ActiveDocument.Path & "\log.txt" For Output As #FilneNum 'открываем файл для записи
  Print #FilneNum, CStr(Now) 'Пишем текущее время в файл
  Print #FilneNum, "Пользовательские стили в документе" 'Заголовок
  For Each oSt In ActiveDocument.Styles
    i = i + 1
    If Not oSt.BuiltIn Then
      Print #FilneNum, i & " " & oSt.NameLocal & vbTab & "пользовательский" & vbTab & IIf(oSt.InUse, "используется", "не используется")
    End If
  Next
  i = 0
  Print #FilneNum, vbCr & vbCr & "Пользовательские стили в шаблоне"
  Set oTmpl = ActiveDocument.AttachedTemplate.OpenAsDocument
  For Each oSt In oTmpl.Styles
    i = i + 1
    If Not oSt.BuiltIn Then
      Print #FilneNum, i & " " & oSt.NameLocal & vbTab & IIf(oSt.BuiltIn, "встроенный", "пользовательский") & vbTab & IIf(oSt.InUse, "используется", "не используется")
    End If
  Next
  oTmpl.Close False
  Close #FilneNum
  Shell "notepad " & """" & ActiveDocument.Path & "\log.txt" & """"
End Sub
Сия нехитрая операция нам покажет, что даже если стиль не используется, он все равно считается InUse!


Что пишет справка по поводу параметра InUse:
Цитата:
True if the specified style is a built-in style that has been modified or applied in the document or a new style that has been created in the document. Read-only Boolean.
Т.е. если стиль был создан пользователем, то он всегда InUse
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 11.07.2009 в 14:21. Причина: Новые сведения об InUse
viter.alex вне форума Ответить с цитированием
Старый 11.07.2009, 14:51   #17
garik64
Форумчанин
 
Регистрация: 09.07.2009
Сообщений: 111
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Т.е. если стиль был создан пользователем, то он всегда InUse
Я так и знал: "это не баг, это фича!" Ну, многое становится понятным. Например, почему мой макрос ничего не убивает, даже когда очистишь формат и всему тексту назначишь какой-нибудь "Заголовок 3".
garik64 вне форума Ответить с цитированием
Старый 11.07.2009, 14:57   #18
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
Восклицание Нормальные герои всегда идут в обход!

Если у него все пользовательские стили всегда используются, то пойдем другим путем. Будем искать текст, оформленный тем или иным стилем. И если такой текст не найдем… то тут уж не обижайтесь: удалим без сантиментов.
Выскочил один небольшой фактик. В файле примера есть стиль " Знак Знак3 Знак" (с пробелом в начале имени), так вот он не хочет удаляться. Говорит, что нет такого стиля. Я хотел его было переименовать, а потом удалить, но не получается.
Может кто подскажет?
Код:
Sub DeleteUnusedStyles()
  Dim oSt As Style, sMsg As String
  For Each oSt In ActiveDocument.Styles
    On Error Resume Next
    If Not oSt.BuiltIn Then'Если стиль не встроенный
      With ActiveDocument.Range.Find
        .Style = oSt.NameLocal 'Ищем все вхождения текста, оформленного заданным стилем
        .Execute
        If (Not .Found) And Err.Number = 0 Then 'Если не нашли такой текст, и нет ошибок, то стиль удаляем
          sMsg = sMsg & "Удален """ & oSt.NameLocal & """" & vbCr: oSt.Delete
        ElseIf CBool(Err.Number) Then 'Если есть ошибка, то сообщаем об этом
          sMsg = sMsg & "Невозможно удалить """ & oSt.NameLocal & """" & ". Причина: " & Err.Description & vbCr
          Err.Clear
        End If
      End With
    End If
  Next
  MsgBox sMsg, vbInformation, "Результаты удаления стилей"
End Sub
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 11.07.2009, 14:59   #19
Busine2009
Новичок
Джуниор
 
Регистрация: 23.05.2009
Сообщений: 167
По умолчанию

Может я не в тему, но применение форматирования при галочке Вести учет форматирования создает полноценный стиль, имеющий имя.

У меня есть мои стили, которые я специально создал. Макрос Витера их не удаляет.

Витер, что за галочка Показывать форматирование?

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

Цитата:
Сообщение от Busine2009 Посмотреть сообщение
Может я не в тему, но применение форматирования при галочке Вести учет форматирования создает полноценный стиль, имеющий имя.
Ну почему не в тему? Теперь буду знать! Только, по-моему, стиль создается всегда, когда применяется прямое форматирование, а уж отображать его или нет, это уж пользователь сам решит
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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