есть цикл для перебора стилей с целью поиска ненужных, "лишних" стилей и их удаления. Однако возникает ошибка с пояснением к ней "такого стиля не существует" При этом счетчик циклов "неофициально" (т.е. при наведении мыши на переменную в тексте кода) после аварийного прерывания выполнения макроса показывает 5 или 9 Хотя MsgBox (выводящий имя очередного стиля) срабатывает только один раз в цикле.
вот код [vba]
Код
Sub Маскрос1() ' ' Dim st As Style, CntSt, i As Integer, str As Characters
ActiveDocument.FormattingShowFilter = wdShowFilterStylesAll ActiveDocument.StyleSortMethod = wdStyleSortByName Selection.ClearFormatting With ActiveDocument CntSt = .Styles.Count - 1 MsgBox ((CntSt)) For i = 1 To CntSt - 20 ' If InStr(.Styles(i).NameLocal, ".") Then If .Styles(i).BuiltIn Then If Left(.Styles(i).NameLocal, 1) <> "." Then MsgBox ((.Styles(i).NameLocal)) ' .Styles(i).Delete End If Next i End With
End Sub
[/vba]
Как можно избежать ошибки? Есть ли в VBA операторы типа exept или какие-то иные способы проверки возможности работы с очередным стилем. Хотелось бы очистить чужой документ от посторонних стилей прежде чем скопировать в него свои стили для форматирования.
Или, на крайний случай, просто их все спрятать (сделать скрытыми) и убрать из линейки экспресс-стилей.
есть цикл для перебора стилей с целью поиска ненужных, "лишних" стилей и их удаления. Однако возникает ошибка с пояснением к ней "такого стиля не существует" При этом счетчик циклов "неофициально" (т.е. при наведении мыши на переменную в тексте кода) после аварийного прерывания выполнения макроса показывает 5 или 9 Хотя MsgBox (выводящий имя очередного стиля) срабатывает только один раз в цикле.
вот код [vba]
Код
Sub Маскрос1() ' ' Dim st As Style, CntSt, i As Integer, str As Characters
ActiveDocument.FormattingShowFilter = wdShowFilterStylesAll ActiveDocument.StyleSortMethod = wdStyleSortByName Selection.ClearFormatting With ActiveDocument CntSt = .Styles.Count - 1 MsgBox ((CntSt)) For i = 1 To CntSt - 20 ' If InStr(.Styles(i).NameLocal, ".") Then If .Styles(i).BuiltIn Then If Left(.Styles(i).NameLocal, 1) <> "." Then MsgBox ((.Styles(i).NameLocal)) ' .Styles(i).Delete End If Next i End With
End Sub
[/vba]
Как можно избежать ошибки? Есть ли в VBA операторы типа exept или какие-то иные способы проверки возможности работы с очередным стилем. Хотелось бы очистить чужой документ от посторонних стилей прежде чем скопировать в него свои стили для форматирования.
Или, на крайний случай, просто их все спрятать (сделать скрытыми) и убрать из линейки экспресс-стилей.карандаш
Доброе время суток Если вы что то хотите удалять в коллекции, обходя её циклом, то лучше это делать с конца, чтобы не получать ошибок. Второе, встроенные стили нельзя удалить, а так, полагая, что удалить нужно пользовательские стили документа, начинающиеся с точки, будет приблизительно так [vba]
Код
Public Sub deldotStyles() Dim i As Long, p As Style For i = ThisDocument.Styles.Count To 1 Step -1 Set p = ThisDocument.Styles(i) If Not p.BuiltIn And Left$(p.NameLocal, 1) = "." Then p.Delete End If Next End Sub
[/vba]
Доброе время суток Если вы что то хотите удалять в коллекции, обходя её циклом, то лучше это делать с конца, чтобы не получать ошибок. Второе, встроенные стили нельзя удалить, а так, полагая, что удалить нужно пользовательские стили документа, начинающиеся с точки, будет приблизительно так [vba]
Код
Public Sub deldotStyles() Dim i As Long, p As Style For i = ThisDocument.Styles.Count To 1 Step -1 Set p = ThisDocument.Styles(i) If Not p.BuiltIn And Left$(p.NameLocal, 1) = "." Then p.Delete End If Next End Sub
Public Sub deldotStyles() On Error Resume Next Dim i As Long, p As Style For i = ThisDocument.Styles.Count To 1 Step -1 ThisDocument.Styles(i).QuickStyle = False ThisDocument.Styles(i).Delete Next ThisDocument.FormattingShowFilter = wdShowFilterStylesInUse End Sub
[/vba] Успехов.
Попробуйте так [vba]
Код
Public Sub deldotStyles() On Error Resume Next Dim i As Long, p As Style For i = ThisDocument.Styles.Count To 1 Step -1 ThisDocument.Styles(i).QuickStyle = False ThisDocument.Styles(i).Delete Next ThisDocument.FormattingShowFilter = wdShowFilterStylesInUse End Sub
anvg, не знаю в чём дело может нужен ещё Normai.dot?
вот прилагаю два файла пример + normal
попробуйте, пожалуйста. Прибьёт или нет? у меня ничего не меняется - как была куча стилей в списке стилей и куча стилей в линейке экспресс-стилей, так обе кучи и остались без всякого движения.
прошу прощения за долгий неответ, не было возможности
anvg, не знаю в чём дело может нужен ещё Normai.dot?
вот прилагаю два файла пример + normal
попробуйте, пожалуйста. Прибьёт или нет? у меня ничего не меняется - как была куча стилей в списке стилей и куча стилей в линейке экспресс-стилей, так обе кучи и остались без всякого движения.
прошу прощения за долгий неответ, не было возможностикарандаш
Доброе время суток Макрос надо было запускать из проекта того документа, в котором надо было "почистить" стили. Во вложение в шаблоне форма fmDelDocStyles запустите её и выберите документ для чистки стилей. Останутся стили, которые использованы в документе. Чтобы вернуть в экспресс панели стили выполните: кнопка Изменить стили/Набор стилей/Восстановить экспресс-стили шаблона. Успехов. P. S. Можно ещё таким кодом сбросить оформление параграфов к состоянию по-умолчанию исходного шаблона. Код для модуля в документе в котором исправляются стили. [vba]
Код
Public Sub test() Dim p As Paragraph For Each p In ThisDocument.Paragraphs p.Style = p.Style Next End Sub
[/vba]
Доброе время суток Макрос надо было запускать из проекта того документа, в котором надо было "почистить" стили. Во вложение в шаблоне форма fmDelDocStyles запустите её и выберите документ для чистки стилей. Останутся стили, которые использованы в документе. Чтобы вернуть в экспресс панели стили выполните: кнопка Изменить стили/Набор стилей/Восстановить экспресс-стили шаблона. Успехов. P. S. Можно ещё таким кодом сбросить оформление параграфов к состоянию по-умолчанию исходного шаблона. Код для модуля в документе в котором исправляются стили. [vba]
Код
Public Sub test() Dim p As Paragraph For Each p In ThisDocument.Paragraphs p.Style = p.Style Next End Sub
Макрос надо было запускать из проекта того документа, в котором надо было "почистить" стили.
что значит "из проекта того документа"? Если макрос расположен в Normal.dot, то он не будет работать?
Я открываю "чужой" документ, но мне макрос доступен, потому как он сохранён в нормал-дот и выведена кнопочка его запуска "на панель быстрого доступа". Открыв этот "чужой" документ, нажимаю кнопочку, макрос срабатывает, но линейка экспресс-стилей не очищается. В то время как открыв новый документ я без всякого применения получаю пустую линейку экспресс-стилей с надписью серым курсивом "Без стилей"
Заполнение списка стилей зависит от множества сложных настроек. Проще в названии своих стилей поставить первым знаком точку или другой знак, чтобы при выводе "по алфавиту" они просто были первыми.
p.s. а ваш макрос не работает. Он и теоретически не может работать, т.к. идёт присвоение того что и так есть. Наверное, нужно было определить новый стиль и задать какие-то параметры ему перед присвоением в цикле его стиля существующим параграфам
Макрос надо было запускать из проекта того документа, в котором надо было "почистить" стили.
что значит "из проекта того документа"? Если макрос расположен в Normal.dot, то он не будет работать?
Я открываю "чужой" документ, но мне макрос доступен, потому как он сохранён в нормал-дот и выведена кнопочка его запуска "на панель быстрого доступа". Открыв этот "чужой" документ, нажимаю кнопочку, макрос срабатывает, но линейка экспресс-стилей не очищается. В то время как открыв новый документ я без всякого применения получаю пустую линейку экспресс-стилей с надписью серым курсивом "Без стилей"
Заполнение списка стилей зависит от множества сложных настроек. Проще в названии своих стилей поставить первым знаком точку или другой знак, чтобы при выводе "по алфавиту" они просто были первыми.
p.s. а ваш макрос не работает. Он и теоретически не может работать, т.к. идёт присвоение того что и так есть. Наверное, нужно было определить новый стиль и задать какие-то параметры ему перед присвоением в цикле его стиля существующим параграфамкарандаш
Если вы откроете редактор VBA, то откройте Project Explorer слева, по-умолчанию, увидите проекты документов и шаблонов. Код нужно вставлять в модуль проекта документа в котором вы хотите произвести изменения. Если вы хотите выполнения изменения из кода, размещённого в Normail, то измените ThisDocument (ссылка на документ в котором выполняется код) на ActiveDocument. В панели стилей. После работы первого макроса (с формой в Normal) остаются названия изменения произведённые непосредственно над текстом пользователем, но основанном на встроенном стиле. Такие изменения не входят в коллекцию стилей документа. Поэтому макрос с формой их не удаляет. Но, если воспользоваться таким "странным" макросом то стили параграфа возвращаются по оформлению к стандартным, так как носят стандартные имена, только дополненные оформлением пользователя непосредственно над текстом, а не применением созданного в документе или другом шаблоне стиле. Выкладываю пример, что получается после применения этого макроса. Остаются только такие описания изменений в тексте, которые произведены внутри параграфа. Их не много. Как добраться и сбросить изменения внутри параграфа пока не знаю. Успехов.
Цитата
что значит "из проекта того документа"?
Если вы откроете редактор VBA, то откройте Project Explorer слева, по-умолчанию, увидите проекты документов и шаблонов. Код нужно вставлять в модуль проекта документа в котором вы хотите произвести изменения. Если вы хотите выполнения изменения из кода, размещённого в Normail, то измените ThisDocument (ссылка на документ в котором выполняется код) на ActiveDocument. В панели стилей. После работы первого макроса (с формой в Normal) остаются названия изменения произведённые непосредственно над текстом пользователем, но основанном на встроенном стиле. Такие изменения не входят в коллекцию стилей документа. Поэтому макрос с формой их не удаляет. Но, если воспользоваться таким "странным" макросом то стили параграфа возвращаются по оформлению к стандартным, так как носят стандартные имена, только дополненные оформлением пользователя непосредственно над текстом, а не применением созданного в документе или другом шаблоне стиле. Выкладываю пример, что получается после применения этого макроса. Остаются только такие описания изменений в тексте, которые произведены внутри параграфа. Их не много. Как добраться и сбросить изменения внутри параграфа пока не знаю. Успехов.anvg
про "Project Explorer слева" был в курсе. Дело было в ThisDocument. Поменял на ActiveDocument и все заработало. Только надо всё менять. Получилось следующее:
[vba]
Код
Public Sub DelStyles() ' 'удалить "лишние" стили On Error Resume Next Dim i As Long, p As Style With ActiveDocument For i = .Styles.Count To 1 Step -1 If Left$(.Styles(i).NameLocal, 1) <> "." Then .Styles(i).QuickStyle = False .Styles(i).Delete End If Next End With 'ActiveDocument.FormattingShowFilter = wdShowFilterStylesInUse ActiveDocument.FormattingShowFilter = wdShowFilterStylesAvailable End Sub
[/vba]
убираем всё форматирование [vba]
Код
Public Sub deFormat() ' ' убрать всё форматирование Dim p As Paragraph, ch As Characters For Each p In ActiveDocument.Paragraphs p.Style = p.Style Next End Sub
[/vba]
anvg, большое спасибо
про "Project Explorer слева" был в курсе. Дело было в ThisDocument. Поменял на ActiveDocument и все заработало. Только надо всё менять. Получилось следующее:
[vba]
Код
Public Sub DelStyles() ' 'удалить "лишние" стили On Error Resume Next Dim i As Long, p As Style With ActiveDocument For i = .Styles.Count To 1 Step -1 If Left$(.Styles(i).NameLocal, 1) <> "." Then .Styles(i).QuickStyle = False .Styles(i).Delete End If Next End With 'ActiveDocument.FormattingShowFilter = wdShowFilterStylesInUse ActiveDocument.FormattingShowFilter = wdShowFilterStylesAvailable End Sub
[/vba]
убираем всё форматирование [vba]
Код
Public Sub deFormat() ' ' убрать всё форматирование Dim p As Paragraph, ch As Characters For Each p In ActiveDocument.Paragraphs p.Style = p.Style Next End Sub