2015-05-27 3 views
18

Я искал онлайн столько, сколько мог (за исключением веб-сайта поддержки Microsoft, который почему-то заблокирован на работе). Я пытаюсь просто пропустить ошибку. Мой код, написанный здесь, упрощен, но должен работать одинаково.VBA Excel простая обработка ошибок

Что мой код должен делать: Один из моих сабвуфер создает фигуры в цикле и имена их (btn_1, btn_2 и т.д.). Но перед их созданием он вызывает sub, который пытается удалить их, чтобы не создавать дубликаты. Эта подпрограмма перебирает (btn_1, btn_2 и т.д.) и удаляет форму с помощью:

for i = 1 to (a certain number) 
    Set shp = f_overview.Shapes("btn_" & i) 
    shp.delete 
next 

Конечно, случается, что форма не может быть удалена, потому что она просто не существует. Я обнаружил, что большую часть времени исправленное исправление заключается в том, чтобы добавить (при ошибке возобновить дальше) перед установкой фигуры, так как я получаю сообщение об ошибке, которое не существует. Я попробовал его внутри цикла, перед циклом, и т.д., например, так:

for i = 1 to (a certain number) 
    On Error Resume Next 
    Set shp = f_overview.Shapes("btn_" & i) 
    shp.delete 
next 

Насколько я понимаю, это, как предполагается петли прямо через, если форма не существует, но я все еще получаю то же самое ошибка, добавляю ли я следующее сообщение об ошибке «Вкл.»! Что я делаю не так?

РЕДАКТИРОВАТЬ: нет ошибок, когда формы существуют.

ответ

8

Похоже, у вас есть неправильное сообщение об ошибке улавливающего набор опций. В редакторе VBA выберите Tools -> Options. В открывшемся окне выберите General tab и выберите переключатель Break on Unhandled Errors. Это должно позволить Excel правильно обработать команду On Error Resume Next.

Я подозреваю, что вы выбрали Break on All Errors.

+0

Спасибо! Я продолжал пробовать предложения других ответчиков, и все провалилось. Вот почему, хотя они также предоставили ценную информацию! –

+0

@ DavidGrand'Maison Я согласен с тем, что обработка ошибок в других ответах чище и лучше. Но ваш исходный код должен сработать. – Degustaf

2

Try:

On Error Resume Next 

for i = 1 to (a certain number) 
    Set shp = f_overview.Shapes("btn_" & i) 
    if err<>0 then err.clear else shp.delete 
next 

on Error Goto 0 
14

Вместо того чтобы пытаться слепо удалять фигуры и пропускать ошибки, почему бы не запустить список известных фигур и удалить их. Тогда вам не нужно беспокоиться о On Error Resume Next, который часто в конечном итоге подвергается насилию.

Sub Test(TheSheet As Worksheet) 

Dim Shp as Shape 

For Each Shp in TheSheet.Shapes 
    If left(Shp.Name, 4) = "btn_" Then 
    Shp.Delete 
    End if 
Next 

End Sub 

Если вы хотите удалить все формы, удалить If заявление. Если вы хотите удалить несколько разных именованных фигур, измените инструкцию If соответствующим образом.

+0

++ Еще один хороший способ удаления фигур :) –

+0

AH отлично! Именно так я и сделаю это. Спасибо за исправление. +1 для ответа, даже если вы не объясняете, как использовать обработку ошибок :-) –

+0

Вы верны в отсутствии детализации обработки ошибок - этот цикл не требует этого, особенно не так, как вы думали. [Mat's Mug] (http://stackoverflow.com/a/30489275/2344413) отлично справляется с обработкой ошибок в целом. – FreeMan

22

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

НЕТ!

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

Самый простой способ избежать ошибки во время выполнения, чтобы проверить на наличие ошибок и избежать выполнения кода, что приводит к интенсивности отказов 100%, как пытается запустить метод на ссылке объект, который Nothing:

For i = 1 To (a certain number) 
    Set shp = f_overview.Shapes("btn_" & i) 
    If Not shp Is Nothing Then shp.Delete 
Next 

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

Private Sub DoSomething() 
    On Error GoTo CleanFail 

    '...code... 

CleanExit: 
    'cleanup code here 
    Exit Sub 

CleanFail: 
    If Err.Number = 9 Then 'subscript out of range 
     Err.Clear 
     Resume Next 
    Else 
     MsgBox Err.Description 
     Resume CleanExit 
    End If 
End Sub 
+1

++ на правильной обработке ошибок :) –

+0

@SiddharthRout да, за исключением того, что я не тестировал его, и теперь, чем больше я думаю об этом, тем больше я полагаю, что назначение вызовет ошибку индекса за пределами диапазона, и в этом случае [Ответ FreeMan] (http://stackoverflow.com/a/30489225/1188513) имеет лучшее решение. –

+0

Это, хорошо :) Отредактируйте свой код. Мой комментарий был правильной обработкой ошибок, которые вы показали в нижней части сообщения. я даже упоминал об этом в своем посте :) –

13

Там нет ничего плохого в использовании ОЭРН (On Error Resume Next) при условии, вы понимаете, что вы делаете, и как это будет влиять на ваш код.

В вашем случае это совершенно нормально использовать ОЭРН

Dim shp As Shape 

For i = 1 To (a certain number) 
    On Error Resume Next 
    Set shp = f_overview.Shapes("btn_" & i) 
    shp.Delete 
    On Error GoTo 0 
Next 

В то же время, убедитесь, что вы не делаете что-то вроде

On Error Resume Next 
<Your Entire Procedure> 
On Error GoTo 0 

это подавляет все ошибки. Используйте правильную обработку ошибок, как показано Мэттом

Edit:

Вот еще один прекрасный пример того, как использовать ОЭРН Эта функция проверяет, является ли конкретная таблица существует или нет.

Function DoesWSExist(wsName As String) As Boolean 
    Dim ws As Worksheet 

    On Error Resume Next 
    Set ws = ThisWorkbook.Sheets(wsName) 
    On Error GoTo 0 

    If Not ws Is Nothing Then DoesWSExist = True 
End Function 

Если вы хотите, вы также можете пройти через все листы, чтобы проверить, существует ли лист или нет!

+0

Спасибо за объяснение! Причина, по которой это была неудача, состояла в том, что у меня были неправильные настройки (см. Выбранный ответ). –

+3

++, но, к сожалению, большинство из них не понимают последствий использования OERN. Мне нравится этот аббревиатура.Я держу его. – RubberDuck