Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/определить "наличие" стиля - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
определить "наличие" стиля
карандаш Дата: Суббота, 04.04.2015, 13:16 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
есть цикл для перебора стилей с целью поиска ненужных, "лишних" стилей и их удаления.
Однако возникает ошибка с пояснением к ней "такого стиля не существует"
При этом счетчик циклов "неофициально" (т.е. при наведении мыши на переменную в тексте кода) после аварийного прерывания выполнения макроса показывает 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 или какие-то иные способы проверки возможности работы с очередным стилем.
Хотелось бы очистить чужой документ от посторонних стилей прежде чем скопировать в него свои стили для форматирования.

Или, на крайний случай, просто их все спрятать (сделать скрытыми) и убрать из линейки экспресс-стилей.
К сообщению приложен файл: Doc1.docx (16.6 Kb)
 
Ответить
Сообщениеесть цикл для перебора стилей с целью поиска ненужных, "лишних" стилей и их удаления.
Однако возникает ошибка с пояснением к ней "такого стиля не существует"
При этом счетчик циклов "неофициально" (т.е. при наведении мыши на переменную в тексте кода) после аварийного прерывания выполнения макроса показывает 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 или какие-то иные способы проверки возможности работы с очередным стилем.
Хотелось бы очистить чужой документ от посторонних стилей прежде чем скопировать в него свои стили для форматирования.

Или, на крайний случай, просто их все спрятать (сделать скрытыми) и убрать из линейки экспресс-стилей.

Автор - карандаш
Дата добавления - 04.04.2015 в 13:16
anvg Дата: Суббота, 04.04.2015, 13:57 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток
Если вы что то хотите удалять в коллекции, обходя её циклом, то лучше это делать с конца, чтобы не получать ошибок. Второе, встроенные стили нельзя удалить, а так, полагая, что удалить нужно пользовательские стили документа, начинающиеся с точки, будет приблизительно так
[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
[/vba]

Автор - anvg
Дата добавления - 04.04.2015 в 13:57
карандаш Дата: Суббота, 04.04.2015, 19:36 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
anvg, спасибо

но удалить/спрятать надо как раз "чужие" стили и родные вордовские, которых там тьма тьмущая, которые не нужны и только захламляют кладовку со стилями

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

как почистить ленту с эспресс-стилями? (если нельзя удалить)
 
Ответить
Сообщениеanvg, спасибо

но удалить/спрятать надо как раз "чужие" стили и родные вордовские, которых там тьма тьмущая, которые не нужны и только захламляют кладовку со стилями

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

как почистить ленту с эспресс-стилями? (если нельзя удалить)

Автор - карандаш
Дата добавления - 04.04.2015 в 19:36
anvg Дата: Воскресенье, 05.04.2015, 07:35 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Попробуйте так
[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
[/vba]
Успехов.


Сообщение отредактировал anvg - Воскресенье, 05.04.2015, 07:48
 
Ответить
СообщениеПопробуйте так
[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
[/vba]
Успехов.

Автор - anvg
Дата добавления - 05.04.2015 в 07:35
карандаш Дата: Понедельник, 06.04.2015, 14:48 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
вот файл, на нём не получается ваши макросом спрятать стили
из экспресса исчезают только начинающиеся с точки, т.к. нужные.
К сообщению приложен файл: 4569627.docx (16.6 Kb)
 
Ответить
Сообщениевот файл, на нём не получается ваши макросом спрятать стили
из экспресса исчезают только начинающиеся с точки, т.к. нужные.

Автор - карандаш
Дата добавления - 06.04.2015 в 14:48
anvg Дата: Понедельник, 06.04.2015, 15:52 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Что то я вас не пойму. Какие нужные? По подробнее, желательно. Вы писали
Цитата
Хотелось бы очистить чужой документ от посторонних стилей прежде чем скопировать в него свои стили для форматирования.

Последний макрос прибивает все. Вот ваш файл
К сообщению приложен файл: 6059484.docx (17.0 Kb)
 
Ответить
СообщениеЧто то я вас не пойму. Какие нужные? По подробнее, желательно. Вы писали
Цитата
Хотелось бы очистить чужой документ от посторонних стилей прежде чем скопировать в него свои стили для форматирования.

Последний макрос прибивает все. Вот ваш файл

Автор - anvg
Дата добавления - 06.04.2015 в 15:52
карандаш Дата: Воскресенье, 12.04.2015, 12:02 | Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
anvg, не знаю в чём дело
может нужен ещё Normai.dot?

вот прилагаю два файла
пример + normal

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

прошу прощения за долгий неответ, не было возможности
К сообщению приложен файл: Dogovor4.docx (40.4 Kb) · Normal.dotm (92.2 Kb)


Сообщение отредактировал карандаш - Воскресенье, 12.04.2015, 12:03
 
Ответить
Сообщениеanvg, не знаю в чём дело
может нужен ещё Normai.dot?

вот прилагаю два файла
пример + normal

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

прошу прощения за долгий неответ, не было возможности

Автор - карандаш
Дата добавления - 12.04.2015 в 12:02
anvg Дата: Понедельник, 13.04.2015, 02:57 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток
Макрос надо было запускать из проекта того документа, в котором надо было "почистить" стили. Во вложение в шаблоне форма 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]
К сообщению приложен файл: 7049024.dotm (88.9 Kb) · Dogovor4-res.docx (76.1 Kb)


Сообщение отредактировал anvg - Понедельник, 13.04.2015, 03:35
 
Ответить
СообщениеДоброе время суток
Макрос надо было запускать из проекта того документа, в котором надо было "почистить" стили. Во вложение в шаблоне форма 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]

Автор - anvg
Дата добавления - 13.04.2015 в 02:57
карандаш Дата: Понедельник, 13.04.2015, 14:15 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
Макрос надо было запускать из проекта того документа, в котором надо было "почистить" стили.


что значит "из проекта того документа"? Если макрос расположен в Normal.dot, то он не будет работать?

Я открываю "чужой" документ, но мне макрос доступен, потому как он сохранён в нормал-дот и выведена кнопочка его запуска "на панель быстрого доступа".
Открыв этот "чужой" документ, нажимаю кнопочку, макрос срабатывает, но линейка экспресс-стилей не очищается.
В то время как открыв новый документ я без всякого применения получаю пустую линейку экспресс-стилей с надписью серым курсивом "Без стилей"

Заполнение списка стилей зависит от множества сложных настроек. Проще в названии своих стилей поставить первым знаком точку или другой знак, чтобы при выводе "по алфавиту" они просто были первыми.

p.s. а ваш макрос не работает. Он и теоретически не может работать, т.к. идёт присвоение того что и так есть. Наверное, нужно было определить новый стиль и задать какие-то параметры ему перед присвоением в цикле его стиля существующим параграфам
 
Ответить
Сообщение
Макрос надо было запускать из проекта того документа, в котором надо было "почистить" стили.


что значит "из проекта того документа"? Если макрос расположен в Normal.dot, то он не будет работать?

Я открываю "чужой" документ, но мне макрос доступен, потому как он сохранён в нормал-дот и выведена кнопочка его запуска "на панель быстрого доступа".
Открыв этот "чужой" документ, нажимаю кнопочку, макрос срабатывает, но линейка экспресс-стилей не очищается.
В то время как открыв новый документ я без всякого применения получаю пустую линейку экспресс-стилей с надписью серым курсивом "Без стилей"

Заполнение списка стилей зависит от множества сложных настроек. Проще в названии своих стилей поставить первым знаком точку или другой знак, чтобы при выводе "по алфавиту" они просто были первыми.

p.s. а ваш макрос не работает. Он и теоретически не может работать, т.к. идёт присвоение того что и так есть. Наверное, нужно было определить новый стиль и задать какие-то параметры ему перед присвоением в цикле его стиля существующим параграфам

Автор - карандаш
Дата добавления - 13.04.2015 в 14:15
anvg Дата: Понедельник, 13.04.2015, 15:56 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Цитата
что значит "из проекта того документа"?
Если вы откроете редактор VBA, то откройте Project Explorer слева, по-умолчанию, увидите проекты документов и шаблонов. Код нужно вставлять в модуль проекта документа в котором вы хотите произвести изменения. Если вы хотите выполнения изменения из кода, размещённого в Normail, то измените ThisDocument (ссылка на документ в котором выполняется код) на ActiveDocument.
В панели стилей. После работы первого макроса (с формой в Normal) остаются названия изменения произведённые непосредственно над текстом пользователем, но основанном на встроенном стиле. Такие изменения не входят в коллекцию стилей документа. Поэтому макрос с формой их не удаляет.
Но, если воспользоваться таким "странным" макросом то стили параграфа возвращаются по оформлению к стандартным, так как носят стандартные имена, только дополненные оформлением пользователя непосредственно над текстом, а не применением созданного в документе или другом шаблоне стиле.
Выкладываю пример, что получается после применения этого макроса. Остаются только такие описания изменений в тексте, которые произведены внутри параграфа. Их не много.
Как добраться и сбросить изменения внутри параграфа пока не знаю.
Успехов.
К сообщению приложен файл: 2837237.docx (74.3 Kb)


Сообщение отредактировал anvg - Понедельник, 13.04.2015, 15:59
 
Ответить
Сообщение
Цитата
что значит "из проекта того документа"?
Если вы откроете редактор VBA, то откройте Project Explorer слева, по-умолчанию, увидите проекты документов и шаблонов. Код нужно вставлять в модуль проекта документа в котором вы хотите произвести изменения. Если вы хотите выполнения изменения из кода, размещённого в Normail, то измените ThisDocument (ссылка на документ в котором выполняется код) на ActiveDocument.
В панели стилей. После работы первого макроса (с формой в Normal) остаются названия изменения произведённые непосредственно над текстом пользователем, но основанном на встроенном стиле. Такие изменения не входят в коллекцию стилей документа. Поэтому макрос с формой их не удаляет.
Но, если воспользоваться таким "странным" макросом то стили параграфа возвращаются по оформлению к стандартным, так как носят стандартные имена, только дополненные оформлением пользователя непосредственно над текстом, а не применением созданного в документе или другом шаблоне стиле.
Выкладываю пример, что получается после применения этого макроса. Остаются только такие описания изменений в тексте, которые произведены внутри параграфа. Их не много.
Как добраться и сбросить изменения внутри параграфа пока не знаю.
Успехов.

Автор - anvg
Дата добавления - 13.04.2015 в 15:56
карандаш Дата: Понедельник, 13.04.2015, 21:35 | Сообщение № 11
Группа: Проверенные
Ранг: Обитатель
Сообщений: 329
Репутация: 8 ±
Замечаний: 0% ±

2010
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]


Сообщение отредактировал карандаш - Понедельник, 13.04.2015, 21:36
 
Ответить
Сообщение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]

Автор - карандаш
Дата добавления - 13.04.2015 в 21:35
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!