Макрос с оператором IF

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Аватара пользователя
stan85
Сообщения: 6
Зарегистрирован: 24 янв 2008, 11:39

Такая ситуация, мне необходимо чтоб в документе проходила проверка, что то на подобии

если надпись существует, то
заменить
в противном случае
пропустить


вот мой пример, но он не работает =(

Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
If Selection.Find.Text = "1037739913771, выд. 16.10.2003г." = True Then
Selection.HomeKey Unit:=wdStory
Else
Selection.Find.Text = "1037739913771, выд. 16.10.2003"
Selection.Find.Execute
Selection.TypeText Text:="1037739913771, выд. 16.10.2003г."
Selection.Delete Unit:=wdCharacter, Count:=1
Selection.TypeText Text:=" "
Selection.Tables(1).Rows.HeightRule = wdRowHeightAtLeast
Selection.Tables(1).Rows.Height = CentimetersToPoints(0.54)
End If

смысл этой надписи, если есть надпись "1037739913771, выд. 16.10.2003г.", то замену делать не надо и курсор должен перемещеться в верх страницы, в противном случае, делает замену по шаблону.

Но он почему то все время делает замену, не могу понять почему, проверка не проходит.

Жду помощи опытных.
tolikt
Сообщения: 93
Зарегистрирован: 29 окт 2005, 12:33
Откуда: NewVasюbirsk

Может быть из-за этого.
Конструкция Selection.Find.Text = "1037739913771, выд. 16.10.2003г." = True
VBA проверяет её с конца. Выражение "1037739913771, выд. 16.10.2003г." = True само по себе является ложным (False). И далее проверятся условие Selection.Find.Text = False, которое ложное.

Может быть, попробовать после Selection.Find.Execute проверку If Selection.Find.Found = True

Или попробывать заменять непосредственно через Find (из хелпа по VBA Word)
.Find.Execute FindText:="hi", ReplaceWith:="hello", _
Replace:=wdReplaceAll
Аватара пользователя
stan85
Сообщения: 6
Зарегистрирован: 24 янв 2008, 11:39

Отлично, спасибо большое =)
В VBA я профан =(
я думал об этом, но я не знал функцию Selection.Find.Found - ОФЕГИТЕЛЬНАЯ

Второй вариант не подходит, т.к. уже пробовал - начинает дублировать буквы!

Если не сложно, можно где-нибудь взять мануал по VBA (help Word не совсем подходит) - просто я не очень онимаю структуру функций Selection.Find.Found и т.д.
Програмировал на более легких языках, хочу попробовать и тут.
Аватара пользователя
stan85
Сообщения: 6
Зарегистрирован: 24 янв 2008, 11:39

А можено записывать набор функций в строчку? Чтобы не в столбик, а в строчку? Какие разделители надо ставить?
bi-lya
Сообщения: 97
Зарегистрирован: 07 июн 2007, 14:08

Можно использовать двоеточие, но не стоит. Лучше используйте это:

Код: Выделить всё

With Selection
  .HomeKey Unit:=wdStory
  .Find.ClearFormatting
  If .Find.Text = "1037739913771, выд. 16.10.2003г." = True Then
    .HomeKey Unit:=wdStory
  Else
    .Find.Text = "1037739913771, выд. 16.10.2003"
...
End With
Pavel55
Сообщения: 418
Зарегистрирован: 20 окт 2006, 11:40
Откуда: Moscow

Попробуйте пробел двоеточие пробел
" : "
Аватара пользователя
stan85
Сообщения: 6
Зарегистрирован: 24 янв 2008, 11:39

Тут появился вопрос, а как можно забить в переменную то что скопировали в документе?

Selection.HomeKey Unit:=wdStory
Selection.MoveRight Unit:=wdCharacter, Count:=6, Extend:=wdExtend
Selection.Copy

a = Selection.PasteAndFormat(wdPasteAndFormat)
MsgBox a

это не верно, не знаю как сделать =(
bi-lya
Сообщения: 97
Зарегистрирован: 07 июн 2007, 14:08

Код: Выделить всё

a = Selection '.PasteAndFormat(wdPasteAndFormat)
:)
Ответить