2015-02-13 3 views
2

Итак, я создал довольно большой макрос, который создает презентации PowerPoint для моей компании. Я хотел бы иметь возможность запускать его на 2 разных регионах с использованием:Об ошибке Возобновление не работает

For each sRegion 

MyMacro(sRegion) 

Next 

Есть несколько строк, которые я хотел бы пропустить. Для первого запуска MyMacro работает отлично, и обработчик ошибок пропускает шаги. Однако для следующего sRegion обработчик ошибок не работает.

Даже если я прохожу через него по строкам, проходя через следующий ответ на ошибку, следующий оператор не работает и фактически просто останавливает макрос.

Я отправлю код, где это нарушение, хотя это совершенно не имеет значения (на втором прогоне через, работает хорошо, когда макрос вызывается первым)

On Error Resume Next 

PPPres.Slides(19).Moveto ToPos:=12 
PPPres.Slides(20).Moveto ToPos:=13 
PPPres.Slides(21).Moveto ToPos:=14 
PPPres.Slides(22).Moveto ToPos:=15 
PPPres.Slides(23).Moveto ToPos:=16 

On Error GoTo 0 

Он будет полностью игнорируют об ошибке и вызвать ошибку и остановить макрос.

Прежде чем кто говорит да, я проверил ли ошибки Ловушка на «Перерыв на необработанной ошибке», и это

Любых имел этот вопрос до или знают решение?

+0

Как вы определяете 'sRegion'? – Chrismas007

+1

Зачем это важно? Это касается только ошибки захвата – lererferler

+0

Ошибки приходят с входов. Если мы сможем выяснить вашу ошибку ввода, вы можете исправить ошибку. Как правило, синтаксис For Every - «Для каждого в коллекции somethings» – Chrismas007

ответ

4

Убедитесь, что после перехода на ошибки (вы использовали On Error GoTo) удалить состояние ошибки с помощью Resume или Resume Next или Resume <label> команду. Или, альтернативно, удалите это On Error GoTo, используйте только On Error Resume Next.

Основываясь на ваш вопрос и комментарии вы делаете следующее, какие всегда выдает ошибку на второе утверждение:

Sub WrongOne() 
    On Error Goto Handler1 'prepared for error 
    Statement1WithError() 'error causes jump 

    Handler1:     'jump done, error handling is now disabled 
    Statement2WithError() 'THIS WILL ALWAYS THROW ERROR 
End Sub 

Вы всегда получите ошибку на Statement2WithError()

Правильный путь:

Sub CorrectOne() 

    On Error Goto Handler1 '1. prepared for error 
    Statement1WithError() '2. error causes jump 

    Waypoint1:    '5. continuing here 
    On Error Goto Handler2 '6. prepared for another error 

    Statement2WithError() '7. error causes jump to Handler2 
    Statement3WithError() '10. error causes jump to Handler2 
    Statement4WithError() 'etc... 

Exit Sub 

          'EXAMPLE: after error, continue at SPECIFIC LABEL 
Handler1:     '3. jump done, error handling is now disabled 
    MsgBox(...) 
    Resume Waypoint1   '4. error handling is reloaded, jumping to label 

          'EXAMPLE: after error, continue with NEXT LINE 
Handler2:     '8. jump done, error handling is now disabled 
    MsgBox(...) 
    Resume Next    '9. error handling is reloaded, now jumping to line 
          ' following the line that caused error 

End Sub 

В вашем случае VBA работает как и ожидалось. Вы можете изучить how error handling works in VBA.

+0

Вы можете попробовать 'On Error Resume 'Next без каких-либо' On Error Goto' (или с правильно возобновленным обработчиком), поэтому выполнение будет проходить через все ошибки. При желании вы можете условно пропускать разделы кода, если вы можете заранее определить состояние ошибки. ('If Slides.Count <25 Then GoTo Label2') Другой подход должен быть выборочным относительно кода:' Dim Region = 1: If Region <2 Then 'code для первых 2 регионов End If: If Region = 2 Then' code for вторая область »и т. д. Затем измените« Dim Region = x »перед запуском кода. Или используйте InputBox(), чтобы получить его. – miroxlav

+0

Это помогло, но есть и другие проблемы, которые я сейчас верну, когда у меня будет лучший обзор того, что происходит. Извинения за отсутствие кода, но я не понимаю, как я должен размещать огромное количество кода и как это может быть полезно? – lererferler

+0

Не стесняйтесь задавать еще вопросы. Что касается проходов кода, получите некоторое ощущение, какие последовательности не важны и сгущают их, например. 'SomeCommandsHere()'. – miroxlav

0

Посмотрите на то, что происходит здесь:

On Error Resume Next 

' Error here, but we're ignoring it 
' because of On Error Resume Next: 
    PPPres.Slides(19).Moveto ToPos:=12 
' No more errors from here on: 
    PPPres.Slides(20).Moveto ToPos:=13 
    PPPres.Slides(21).Moveto ToPos:=14 
    PPPres.Slides(22).Moveto ToPos:=15 
    PPPres.Slides(23).Moveto ToPos:=16 
' But the err condition is still set ... you haven't cleared it, 
' so when we get here, it throws the error:  
    On Error GoTo 0 

Это звучит так, как будто на первой итерации, все идет хорошо, но что-то бросает Обнаружили ошибку во второй раз через. Я бы прокомментировал заголовок On Error Resume Next и выполнил код, чтобы увидеть, где он остановился с ошибкой.

Смежные вопросы