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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2012, 09:29   #1
caute
Форумчанин
 
Регистрация: 27.10.2009
Сообщений: 277
По умолчанию удаление неиспользуемых стилей

имеется макрос - то работает нормально, то выдаёт
Нажата кнопка 'End'
Run-time error '4198'
Дебаггер подсвечивает строку: ActiveDocument.Styles(st).Delete
весь код целиком таков:
Код:
Sub Удалить_лишние_стили()
Dim st As Style
Application.ScreenUpdating = False
With ActiveDocument.Content.Find
    .Text = ""
    .Replacement.Text = ""
    .ClearFormatting
End With
For Each st In ActiveDocument.Styles
    If Not ActiveDocument.Styles(st).BuiltIn And ActiveDocument.Styles(st).InUse Then
        With ActiveDocument.Content.Find
            .Style = st
            StatusBar = "Поиск стиля: " & st
            If .Execute(findText:="", Wrap:=wdFindContinue) = False Then
                ActiveDocument.Styles(st).Delete
            End If
        End With
    End If
Next
ActiveDocument.Content.Find.ClearFormatting
Application.ScreenUpdating = True
StatusBar = "Поиск завершен"
End Sub

Последний раз редактировалось caute; 19.01.2012 в 09:37.
caute вне форума Ответить с цитированием
Старый 19.01.2012, 09:41   #2
shanemac51
Участник клуба
 
Аватар для shanemac51
 
Регистрация: 12.08.2010
Сообщений: 1,077
По умолчанию

Код:
Sub Удалить_лишние_стили_120119_0938()
''удаления в коллекциях проводится от хвоста к началу
Dim st, js
Application.ScreenUpdating = False
With ActiveDocument.Content.Find
    .Text = ""
    .Replacement.Text = ""
    .ClearFormatting
End With
js = ActiveDocument.Styles.Count
Do While js > 1
js = js - 1
st = ActiveDocument.Styles(js).NameLocal

    If Not ActiveDocument.Styles(st).BuiltIn And ActiveDocument.Styles(st).InUse Then
        With ActiveDocument.Content.Find
            .Style = st
            StatusBar = "Поиск стиля: " & st
            If .Execute(findText:="", Wrap:=wdFindContinue) = False Then
                ActiveDocument.Styles(st).Delete
                Debug.Print js, st
            End If
        End With
    End If
Loop
ActiveDocument.Content.Find.ClearFormatting
Application.ScreenUpdating = True
StatusBar = "Поиск завершен"
End Sub
Имя-Галина== почта shanemac51@yandex.ru скайп shanemac51 c 8-15мск будни
Сфера интересов--word-excel-access-распознавание
shanemac51 вне форума Ответить с цитированием
Старый 19.01.2012, 10:18   #3
caute
Форумчанин
 
Регистрация: 27.10.2009
Сообщений: 277
По умолчанию

увы, косяк остался
caute вне форума Ответить с цитированием
Старый 19.01.2012, 13:56   #4
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Не встречал такого. Присмотритесь к стилю. Имя? Один и тот же? Сами создали или Word, автоматом? Дайте образец.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 19.01.2012, 14:24   #5
Пименов Александр
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 222
По умолчанию

Косяк макроса потому, что встроенные стили удалить нельзя их можно только скрыть из меню Стили:
Если заменить
ActiveDocument.Styles(st).Delete
на
ActiveDocument.Styles(st).Visibilit y = True, то ошибку выдавать не будет, если же оставлять ActiveDocument.Styles(st).Delete, то надо писать обработчик ошибки
Пименов Александр вне форума Ответить с цитированием
Старый 19.01.2012, 23:11   #6
caute
Форумчанин
 
Регистрация: 27.10.2009
Сообщений: 277
По умолчанию

вообще, макрос часть стилей удаляет благополучно, прежде чем выдать ошибку. Вот образец.doc
Замена на
Код:
ActiveDocument.Styles(st).Visibility = True
приводит к утере трудоспособности.

В принципе, если случай сложный, то не стоит возиться - в большинстве доков макрос работает хорошо. В крайнем случае всегда можно ручками дочистить.
caute вне форума Ответить с цитированием
Старый 20.01.2012, 11:24   #7
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от Пименов Александр Посмотреть сообщение
...встроенные стили удалить нельзя...
Макрос их уже отсеивает, проверкой...
Макросы на заказ и готовый пакет - http://mtdmacro.ru/

Последний раз редактировалось Вождь; 20.01.2012 в 12:08.
Вождь вне форума Ответить с цитированием
Старый 20.01.2012, 12:29   #8
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от caute Посмотреть сообщение
В образце имеется проблемный стиль "Знак знак". Команда Delete его удаляет, как бы, но и ошибку выдает тоже. Глюк какой-то. Проверял макросом:
Код:
Sub Удалить_стили()
    Debug.Print "<<< Старт " & Now
Dim myStyle As Word.Style
Dim i&, N1&, N2&
Dim S$
    N1 = 0: N2 = 0
    For i = ActiveDocument.Styles.Count To 1 Step -1
        Set myStyle = ActiveDocument.Styles(i)
        If myStyle.BuiltIn = True Then
        ElseIf myStyle.InUse <> True Then
        Else
            S = myStyle.NameLocal
            With ActiveDocument.Content.Find
                .ClearFormatting
                .Replacement.ClearFormatting
                .Format = True
                .Style = S
                .Execute Replace:=Word.wdReplaceNone
                If .Found = True Then
                Else
                    On Error Resume Next
                    myStyle.Delete
                    If Err.Number <> 0 Then
                        N2 = N2 + 1
                        Debug.Print _
                            "- Ошибка " & CStr(Err.Number) & " (" & Err.Description & ")" & _
                            " при удалении стиля """ & S & """"
                    End If
                    If IsObjectValid(myStyle) Then
                        Debug.Print "- Не был удален стиль """ & S & """"
                    Else
                        N1 = N1 + 1
                        Debug.Print "+ Удален стиль """ & S & """"
                    End If
                End If
            End With
        End If
    Next i
    Debug.Print "= Удалено: " & CStr(N1)
    Debug.Print "= Ошибок: " & CStr(N2)
    Debug.Print ">>> Финиш " & Now
End Sub
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 20.01.2012, 12:33   #9
Пименов Александр
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 222
По умолчанию

Значит оставить в макросе On Error

Последний раз редактировалось Пименов Александр; 20.01.2012 в 12:35. Причина: Утверждение
Пименов Александр вне форума Ответить с цитированием
Старый 20.01.2012, 17:06   #10
caute
Форумчанин
 
Регистрация: 27.10.2009
Сообщений: 277
По умолчанию

вы правы: затык был в этом дурацком стиле "знак знак". Он у меня давно в нормале маячит, хотя я его не создавал и никогда им не пользовался. Не без труда удалось-таки его удалить нафиг - макрос тут же заработал! спасибо за решение.
А вот этот код выше - стоит ли им заменить прежний? ваша версия макроса имеет иммунитет к ошибкам стилей, так я понял? или чего-то недопонял?

кстати, мой макрос наряду с лишними стилями почему-то удаляет иногда и нелишние (неоднократно используемые в документе). Можно ли как-то это поправить?

Последний раз редактировалось caute; 20.01.2012 в 17:09.
caute вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследование стилей внутренними тэгами??? ARTsev HTML и CSS 1 10.02.2010 13:22
значения стилей окна Windows. HWork Общие вопросы C/C++ 4 25.09.2009 09:26
Копирование стилей Busine2009 Microsoft Office Word 0 31.07.2009 21:41
Копирование стилей... Busine2009 Microsoft Office Word 2 27.06.2009 19:42