2015-08-13 4 views
1

У меня есть этот код, чтобы найти конкретное значение на листе excel с помощью команды Ctrl + F, но когда код не найдет ничего, я хочу, чтобы он послал сообщение.Об ошибке Оператор GOTO в VBA

sub test() 
    f=5 
    do until cells(f,1).value=""  
    On Error goto hello 
     Cells.Find(what:=refnumber, After:=ActiveCell, LookIn:=xlFormulas, _ 
        lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
        MatchCase:=False, SearchFormat:=False).Activate 

f=f+1 

     hello: Msgbox"There is an error" 

    loop 

    endsub 

Проблема в том, что даже если ошибка не найдена, сообщение все еще отображается. Я хочу, чтобы окно сообщения отображалось только при возникновении ошибки.

+0

Используйте '' 'Err.Number''', например:' '' Если Err.Number <> 0 Then MsgBox "Существует ошибка" '' ' – dee

+0

нормально, что если у меня есть несколько таких условий, как VB узнает, какое имя err.number принадлежит какому условию – Anarach

+0

'' 'Err''' содержит информацию о ошибках времени выполнения. Свойства объекта '' 'Err'' будут заполняться при ошибке. Таким образом, объект '' 'Err'' не принадлежит ни одному условию, он просто сообщает, произошла ли ошибка или нет. См. Также '' 'Err.Clear'''. – dee

ответ

3

Для этого случая вы должны использовать Exit Sub или Exit Function, и пусть ваш hello ярлык к последней части кода. Смотрите пример:

Sub test() 

    f = 5 

    On Error GoTo message 

check: 
    Do Until Cells(f, 1).Value = "" 

     Cells.Find(what:=refnumber, After:=ActiveCell, LookIn:=xlFormulas, _ 
       lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
       MatchCase:=False, SearchFormat:=False).Activate 
    Loop 

    Exit Sub 

message: 
    MsgBox "There is an error" 
    f = f + 1 
    GoTo check 

End Sub 
+0

В чем разница между выводом sub и end sub? – Anarach

+0

Я не хочу, чтобы код заканчивался после ошибки, я хочу, чтобы он продолжался, – Anarach

+0

Ничего, 'Exit' - это ключевое слово, чтобы остановить текущий процесс. Итак, для выхода 'Funciton' используйте' Exit Function', для выхода 'Sub', используйте' Exit Sub' –

3

Вам нужен exit sub (или exit function, если это является частью функции вместо суб) строки кода перед hello: Msgbox"There is an error", иначе всегда будет выполняться код под ним. Смотрите этот пост в качестве справочно-

How to stop VBA macro automatically?

кодекса ПРИМЕР-

on error goto bad 
    call foo 
    exit sub 
bad: 
    msgbox "bad" 
    'clean up code here 
exit sub 

public sub foo 
    msgbox 1/0 'could also trigger the error handling code by doing err.raise, to use user defined errors 
end sub 

Update:

Чтобы исправить петлю, вы должны переместить код обработки ошибок вне петли , но до сих пор сохраняйте exit sub, чтобы предотвратить его выполнение независимо.

sub test() 
f=5 

do until cells(f,1).value=""  

On Error goto hello 

    Cells.Find(what:=refnumber, After:=ActiveCell, LookIn:=xlFormulas, _ 
       lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
       MatchCase:=False, SearchFormat:=False).Activate 


loop 

exit sub 

hello: 
    Msgbox"There is an error" 

endsub 
+0

Я обновил вопрос, я не хочу выходить из do до цикла – Anarach

+0

Я понимаю, что при нахождении ошибки он выйдет, но я хочу, чтобы он вернулся в цикле. возможно ли вам – Anarach

+0

@Anarach вам понадобится отдельный оператор goto (в коде обработки ошибок), который вернет вас в цикл (условный тест до этого, конечно). – iliketocode

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