Как обработать ошибку
А если у меня нет одного из предложенных заголовков, то макрос останавливается и пишет
(от гад :D )
Как заставить это игнорировать - ну нет и не надо. Мол, обработай те, заголовки, что есть.
Private Sub Test()
For Each vItem In Array("Заголовок 1", "Заголовок 3", "Хрень")
If ExistStyle(vItem) = True Then
With ThisDocument.Styles(vItem) 'ActiveDocument.Styles()
'...
End With
Else
MsgBox "Обломись", , ""
End If
Next
End Sub
Private Function ExistStyle(vStyleName) As Boolean
Dim objStyle As Style
For Each objStyle In ThisDocument.Styles 'ActiveDocument.Styles
If objStyle = vStyleName Then
ExistStyle = True
Exit Function
End If
Next
ExistStyle = False
End Function
'With ThisDocument.Styles(vItem) 'ActiveDocument.Styles()
' '...
'End With
Selection.HomeKey Unit:=wdStory '2
Selection.Find.ClearFormatting
For i = 1 To 1000
[COLOR="Navy"]стопорится на этой строке[/COLOR] 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
Entt:
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting '1 буква
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 Ent
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
Ent:
Next
End Sub
Только прошу не ругать за конструкцию for-next вместо While-Wend (как было рекомендовано). Почему-то с While'ом часто зацикливалась и приходилось останаливать Break'ом).
Что касается For-Next-While-Wend - можно разобраться, если есть желание.
А там два варианта. Надо использовать какой-то один или это для разных сред?
Желание есть. Я попробую восстановить код, когда все бесконечно начинало циклиться и покажу.
А что, разве нет какой-то простенькой инструкции типа OnError - Goto ... ?
Вот в верстальных скриптах есть команда Try. Т.е. прога просто пытается вполнить действие. Если не идет, то не ругается, а молча идет дальше. - Дешево и сердито.
Есть. Пример:
On Error GoTo ErrCase
'основной код
Exit Sub
ErrCase: 'это метка
'код обработки ошибочной ситуации
End Sub
Аналог на VB/VBA/VBS: [color=blue]On Error Resume Next[/color]
Однако, это далеко не лучший вариант с точки зрения качества работы программы. Впрочем, надо признать, иногда совершенно необходимый.
Там не два варианта. Там вспомогательная функция ExistStyle (нижняя часть кода) и макет основного кода, в котором она используется (верхняя часть)
А, кстати, работа макроса с On Error будет идти наверное быстрее, чем если писать вспомогат. функцию по проверке существования перечисляемых стилей?
P.S. Про "вспомогательность" уяснил.
А, кстати, работа макроса с On Error будет идти наверное быстрее, чем если писать вспомогат. функцию по проверке существования перечисляемых стилей?
Сложно сказать... В любом случае, это совершенно незначительное время в общих 36 секундах, которые работает твой макрос. Не всё ли равно одна сотая секунды или две сотых, если остальное работает полминуты?