For Each vItem In Array("Заголовок 1", "Заголовок 3", "Заголовок 7")
With ThisDocument.Styles(vItem) 'ActiveDocument.Styles()
'...
End With
Next
Можно ли укоротить код?
Т.е. как-то так:
[COLOR="Navy"]for i = Заг3, Заг4, ТЕЗИС
... обработка
Next I.
[/COLOR]или надо воспользоваться некоей индексированной переменной? (если такая предусмотрена).
Спасибо.
Sub ОбработкаПредлога (ИмяСтиля As String)
...
End Sub
а в основном макросе:
Call ОбработкаПредлога("Заголовок 3")
Call ОбработкаПредлога("Заголовок 4")
Call ОбработкаПредлога("ТЕЗИС")
P.S. Кстати, я вроде нашёл способ убыстрить работу твоего макроса, я чуть позже тебе напишу, когда чуть-чуть потестирую это.
Код:
Вопрос к Катти:
1. Что значит объектно (ну тяжко мне дается эта архитектоника... объектно- ориентированная которая)?
2. "Call" - это же вызов процедуры из чего-то более старшего. А у меня в наборе макросов все только Sub'ы. Тогда что из-под чего вызывать. Или надо что-то новое написать?
3. По поводу "P.S". Спасибо большое. А вообще я подумал, что может быть быстрее просто задавать замену предлога в пробелах на пробел-предлог-Alt160. И перебрать "в лоб" все предлоги (их не много вроде).
4. А какой алгоритм при переборе стилей может быть быстрее - от Катти или от Пашульки?
5. Может быть приписать измерение времени на выполнение макроса и что бы в MsgBox'e выводились затраченные миллисекунды ;). И мы скурпулезно будем изучать данные.
Цитата: Dmitry2064
Вот у Пашульки понятнее (сейчас будем пробовать), хотя у Катти глобальнее.
Вопрос к Катти:
1. Что значит объектно (ну тяжко мне дается эта архитектоника... объектно- ориентированная которая)?
Вопрос к Катти:
1. Что значит объектно (ну тяжко мне дается эта архитектоника... объектно- ориентированная которая)?
Ой, лениво объяснять. Считай, что я это для красного словца.
Цитата:
2. "Call" - это же вызов процедуры из чего-то более старшего. А у меня в наборе макросов все только Sub'ы. Тогда что из-под чего вызывать. Или надо что-то новое написать?
У тебя было так (какие-то этапы возможно пустые):
Код:
Sub MyProg
Вступление
Обработка1
Обработка2
Обработка3
Концовка
End Sub
Вступление
Обработка1
Обработка2
Обработка3
Концовка
End Sub
А стать должно так:
Код:
Sub MyProg
Вступление
Call ОбработкаПредлога("Заголовок 3")
Call ОбработкаПредлога("Заголовок 4")
Call ОбработкаПредлога("ТЕЗИС")
Концовка
End Sub
Sub ОбработкаПредлога (ИмяСтиля As String)
Обработка
End Sub
Вступление
Call ОбработкаПредлога("Заголовок 3")
Call ОбработкаПредлога("Заголовок 4")
Call ОбработкаПредлога("ТЕЗИС")
Концовка
End Sub
Sub ОбработкаПредлога (ИмяСтиля As String)
Обработка
End Sub
Запускаемый макрос в обоих случаях - MyProg.
Цитата:
3. По поводу "P.S". Спасибо большое. А вообще я подумал, что может быть быстрее просто задавать замену предлога в пробелах на пробел-предлог-Alt160. И перебрать "в лоб" все предлоги (их не много вроде).
В этом и состоит план - использовать Вордовскую встроенную замену.
Цитата:
4. А какой алгоритм при переборе стилей может быть быстрее - от Катти или от Пашульки?
Абсолютно одинаково. 99,99% времени работы программы - это работа твоей обработки каждого стиля. Поэтому оставшиеся 0,01% принципиального значения не имеют.
Цитата:
5. Может быть приписать измерение времени на выполнение макроса и что бы в MsgBox'e выводились затраченные миллисекунды ;). И мы скурпулезно будем изучать данные.
Хочешь - припиши. :)
Может у меня не так было написано (пока без проверки на существование стиля)?
[COLOR="Navy"]For Each vItem In Array("Заголовок 3", "Заголовок 4")
Selection.HomeKey Unit:=wdStory '2
Selection.Find.ClearFormatting
For i = 1 To 1000
With ThisDocument.Styles(vItem) 'ActiveDocument.Styles()
With Selection.Find
.Text = " ^$^$ "
.Replacement.Text = "": .Forward = True: .Wrap = wdFindStop: .Format = True: .MatchCase = False:
.MatchWholeWord = False: .MatchWildcards = False: .MatchSoundsLike = False: .MatchAllWordForms = False
End With
End With
Selection.Find.Execute
If Selection.Find.Found = False Then GoTo Entt
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.TypeText Text:=Chr$(160)
Selection.MoveRight Unit:=wdCharacter, Count:=1
Next i[/COLOR]
Хотя секрет может быть в том, что например Заголовок 4 называется Заголовок 4 + Первая строка 0,95
Хотя в некоторых случаях мои макросы не реагируют на небольшое отклонения от названия (воспринимают именно ключевую часть названия), а в нек. случах не обрабатывают такие производные названия стилей. Во мокруха...
Код:
Private Sub Test()
For Each vItem In Array("Заголовок 1", "Заголовок 3", "Заголовок 7")
With ThisDocument.Styles(vItem) 'ActiveDocument.Styles()
MsgBox .NameLocal, vbExclamation, ""
End With
Next
End Sub
For Each vItem In Array("Заголовок 1", "Заголовок 3", "Заголовок 7")
With ThisDocument.Styles(vItem) 'ActiveDocument.Styles()
MsgBox .NameLocal, vbExclamation, ""
End With
Next
End Sub
Цитата: pashulka
Я думаю, что сначало нужно разобраться с предложенным вариантом, и когда это будет сделано, то вместо гадания на кофейной гуще, появится понимание для чего используется инструкция With и станет ясно, что источником проблемы является сам автор топика.
Код:
Private Sub Test()
For Each vItem In Array("Заголовок 1", "Заголовок 3", "Заголовок 7")
With ThisDocument.Styles(vItem) 'ActiveDocument.Styles()
MsgBox .NameLocal, vbExclamation, ""
End With
Next
End Sub
For Each vItem In Array("Заголовок 1", "Заголовок 3", "Заголовок 7")
With ThisDocument.Styles(vItem) 'ActiveDocument.Styles()
MsgBox .NameLocal, vbExclamation, ""
End With
Next
End Sub
Ну еще раз вставил этот код. Но такое впечатление, что инструкция With не выполняется. Т.е. обрабытваются не указанные стили, а все.
По варианту Катти макрос тоже обрабатывал ВСЕ СТИЛИ.
Повторю ещё раз: нужно не вставлять чужой код, а хотя бы немного разобраться в сути вопроса. Для начала, можно хотя бы просто выполнить макрос Test и воочию убедиться, что в цикле перебираются только нужные стили.
Option Explicit
Dim arStyles() as string
Sub FillArrStyles()
redim arStyles(0)
arStyles(0)="Имя стиля"
'И вот это повторять столько, сколько стилей нужно обработать
Redim Preserve arStyles(1)
arStyles(1)="Имя стиля"
...
End Sub
Sub ИмяВашегоМакросаПереборкиСлов()
...
Call FillArrStyles
'Далее делаем нужную нам работу - т. е. ищем все предлоги
...
'Мы выяснили, что это предлог
for x=LBound(arStyles) to UBound(arStyles)
If wrd.Style.NameLocal=arStyles(x) then 'wrd это переменная, полученная присваиванием ей слова, т. е. объекта Range
'Стиль нужный нашли. Делаем чегото с ним
...
Exit For
End If
Next x
...
End Sub
Вот это можно использовать и совместно с вордовским поиском.
Я чего-то недопонял: а зачем было 6 раз повторять одни и те же блоки кода? И что за мистификации по поводу команді Call? Она ж просто вызывает процедуру либо функцию и все! Можно ею и не пользоваться...