2015-09-03 2 views
1

Я использую VBA для добавления проверки в ячейку, которая зависит от другой ячейки, где есть еще одна проверка. Формула во всей этой проверке назвала диапазоны. То, что я пробовал:Range.Validation method occure 1004 error

-place значения в ячейке, которые зависят от этой валидации;

-recalculate книги после размещения значения от

-i отладить весь код и нет никаких ошибок в нем (ошибка происходит только в этом коде)

Вот код.

Public Sub MakeValidation(ByVal ValidString As String, ByVal ValidAddress As String, ByVal ValidSheet As String, ByRef WB As Workbook) 
    Dim n As Long 
NewStart: 
    Err.Clear 
    n = n + 1 
    If n = 10 Then Exit Sub 
    On Error GoTo NewStart 
    WB.Worksheets(ValidSheet).Range(ValidAddress).Validation.Delete 
    Debug.Print "'" & Err.Number; "'" & " " & Err.Description 
    On Error GoTo NewStart 
    If CheckValidation(ValidAddress, ValidSheet, WB) = True Then 
     WB.Worksheets(ValidSheet).Range(ValidAddress).Validation.Delete 
    End If 
    WB.Worksheets(ValidSheet).Range(ValidAddress).Validation.Add Type:=xlValidateList, _ 
                   AlertStyle:=xlValidAlertStop, _ 
                   Operator:=xlBetween, _ 
                   Formula1:=ValidString 

End Sub 

У U какие-либо идеи, почему "On Error GoTo Newstart" не работает? И почему, когда я запускаю код, нажав «F5», он не работает, но когда я отлаживаю код, он работает?

Большое спасибо за ваш ответ. Мой английский не очень хороший. Извините за ошибки.

+0

Вам нужно будет использовать «Возобновить», чтобы избежать сбоя обработчика ошибок, поскольку он будет обрабатывать первую ошибку, с которой вы сталкиваетесь, до тех пор, пока она не встретится с инструкцией 'Resume'. См. Ответ в секундах. – R3uK

ответ

0

Resume Это должно быть достаточно, чтобы избежать проблему (как объяснено в комментариях):

Public Sub MakeValidation(ByVal ValidString As String, ByVal ValidAddress As String, ByVal ValidSheet As String, ByRef WB As Workbook) 
    Dim n As Long 
NewStart: 
    Err.Clear 
    n = n + 1 
    If n = 10 Then Exit Sub 
    Resume KeepRunning 
KeepRunning: 

    On Error GoTo NewStart 

    WB.Worksheets(ValidSheet).Range(ValidAddress).Validation.Delete 
    Debug.Print "'" & Err.Number; "'" & " " & Err.Description 
    If CheckValidation(ValidAddress, ValidSheet, WB) = True Then 
     WB.Worksheets(ValidSheet).Range(ValidAddress).Validation.Delete 
    End If 
    WB.Worksheets(ValidSheet).Range(ValidAddress).Validation.Add Type:=xlValidateList, _ 
                   AlertStyle:=xlValidAlertStop, _ 
                   Operator:=xlBetween, _ 
                   Formula1:=ValidString 
End Sub 

Я также избавиться от второго On Error GoTo NewStart, который был бесполезным, так как вы не «пошел» предыдущее заявление с On Error GoTo 0