Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Можно ли укоротить код?

248
14 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Вот такой вопрос. Благодаря помощи Залетина Виталия и Cutty Sark'a удалось вписать в макросы Ворда обработку предлогов. Но потом возникла задача обрабатывать это дело в 3 типах заголовков (Заголовк 4, Заголовк 3 и Заголовок "ТЕЗИС".) Вдобавок ищется то однобуквенный предлог, то двухбуквенный. Итого мне пришлось повторить секцию кода про предлоги 6(!) раз. А если вдруг потребуется обработать еще один-два заголовка? Вот можно ли как загнать в массив названия Стилей и заставить макрос просто перебирать указанные стили самостоятельно?
Т.е. как-то так:
[COLOR="Navy"]for i = Заг3, Заг4, ТЕЗИС
... обработка
Next I.
[/COLOR]
или надо воспользоваться некоей индексированной переменной? (если такая предусмотрена).

Спасибо.
267
15 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Мысли объектно!

Sub ОбработкаПредлога (ИмяСтиля As String)
...
End Sub

а в основном макросе:
Call ОбработкаПредлога("Заголовок 3")
Call ОбработкаПредлога("Заголовок 4")
Call ОбработкаПредлога("ТЕЗИС")


P.S. Кстати, я вроде нашёл способ убыстрить работу твоего макроса, я чуть позже тебе напишу, когда чуть-чуть потестирую это.
275
15 декабря 2006 года
pashulka
985 / / 19.09.2004
Dmitry2064, Вот так можно перебрать только нужные стили. Принцип действует и для остальных семейств.

 
Код:
For Each vItem In Array("Заголовок 1", "Заголовок 3", "Заголовок 7")
    With ThisDocument.Styles(vItem) 'ActiveDocument.Styles()
         '...
    End With
Next
248
15 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Вот у Пашульки понятнее (сейчас будем пробовать), хотя у Катти глобальнее.
Вопрос к Катти:
1. Что значит объектно (ну тяжко мне дается эта архитектоника... объектно- ориентированная которая)?
2. "Call" - это же вызов процедуры из чего-то более старшего. А у меня в наборе макросов все только Sub'ы. Тогда что из-под чего вызывать. Или надо что-то новое написать?
3. По поводу "P.S". Спасибо большое. А вообще я подумал, что может быть быстрее просто задавать замену предлога в пробелах на пробел-предлог-Alt160. И перебрать "в лоб" все предлоги (их не много вроде).
4. А какой алгоритм при переборе стилей может быть быстрее - от Катти или от Пашульки?
5. Может быть приписать измерение времени на выполнение макроса и что бы в MsgBox'e выводились затраченные миллисекунды ;). И мы скурпулезно будем изучать данные.
267
15 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Цитата: Dmitry2064
Вот у Пашульки понятнее (сейчас будем пробовать), хотя у Катти глобальнее.
Вопрос к Катти:
1. Что значит объектно (ну тяжко мне дается эта архитектоника... объектно- ориентированная которая)?


Ой, лениво объяснять. Считай, что я это для красного словца.

Цитата:

2. "Call" - это же вызов процедуры из чего-то более старшего. А у меня в наборе макросов все только Sub'ы. Тогда что из-под чего вызывать. Или надо что-то новое написать?


У тебя было так (какие-то этапы возможно пустые):

 
Код:
Sub MyProg
   Вступление
   Обработка1
   Обработка2
   Обработка3
   Концовка
End Sub


А стать должно так:
Код:
Sub MyProg
   Вступление
   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 выводились затраченные миллисекунды ;). И мы скурпулезно будем изучать данные.


Хочешь - припиши. :)

248
15 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
А оч. понятно объяснено (я имею в виду перечисленные выше пункты-вопросы). Начнем пробовать с Call'ами. Кстати, по методике Пашульки макрос обрабатывал все существующие стили! невзирая...
Может у меня не так было написано (пока без проверки на существование стиля)?

[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
Хотя в некоторых случаях мои макросы не реагируют на небольшое отклонения от названия (воспринимают именно ключевую часть названия), а в нек. случах не обрабатывают такие производные названия стилей. Во мокруха...
275
15 декабря 2006 года
pashulka
985 / / 19.09.2004
Я думаю, что сначало нужно разобраться с предложенным вариантом, и когда это будет сделано, то вместо гадания на кофейной гуще, появится понимание для чего используется инструкция 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
248
15 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Цитата: 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



Ну еще раз вставил этот код. Но такое впечатление, что инструкция With не выполняется. Т.е. обрабытваются не указанные стили, а все.
По варианту Катти макрос тоже обрабатывал ВСЕ СТИЛИ.

275
16 декабря 2006 года
pashulka
985 / / 19.09.2004
Повторю ещё раз: нужно не вставлять чужой код, а хотя бы немного разобраться в сути вопроса. Для начала, можно хотя бы просто выполнить макрос Test и воочию убедиться, что в цикле перебираются только нужные стили.
8.9K
16 декабря 2006 года
Залетин Виталий
71 / / 10.12.2005
Чего-то Вы тут понамудрили. А почему бы не завести глобальный массив с названиями стилей и в нужный момент проходить его и сравнивать стиль слова с имеющимися в массиве названиями и если такового не нашлось, то ничего не делать. При желании можно в массив добавлять названия стилей. Например, так:

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? Она ж просто вызывает процедуру либо функцию и все! Можно ею и не пользоваться...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог