2016-08-23 2 views
0

Я пытаюсь добавить раскрывающийся список проверки данных, и я отлаживал его некоторое время безрезультатно. Я получаю ошибку времени выполнения 1004, определенную приложением или объектную ошибку. Ошибка возникает в команде настройки Формулы 1 инструкции Validation.Add.Ошибка списка проверки данных

Я попытался использовать ссылку на строку с именованным диапазоном, ссылку на строку со стандартным диапазоном и, как показано ниже, строку списка с разделителями-запятыми, созданную из списка на листе, как показано в приведенном ниже коде. Я проверил строку списка с Debug.Print и получил ожидаемый результат.

Sub addPT_Validation() 
Dim sValidationList As String 
Dim cell As Range 

For Each cell In ThisWorkbook.Names("PT_Puldown").RefersToRange 
    sValidationList = sValidationList & cell.Value & "," 
Next cell 

sValidationList = Left(sValidationList, Len(sValidationList) - 1) 

With ActiveSheet.Range("D14").Validation 
    .Add Type:=xlValidateList, _ 
      AlertStyle:=xlValidAlertStop, _ 
      Operator:=xlEqual, _ 
      Formula1:=sValidationList 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .ShowError = True 
End With 
End Sub 

Заранее благодарим за любые указания.

ответ

4

Все код работает (конечно, может быть оптимизирован), все, что вам нужно do - удалить проверку, если она уже существует.

Если вы пытаетесь добавить проверку в ячейку, которая уже содержит один, вы получите ошибку 1004.

Sub addPT_Validation() 
    Dim sValidationList As String 
    Dim cell As Range 

    For Each cell In ThisWorkbook.Names("PT_Puldown").RefersToRange 
     sValidationList = sValidationList & cell.Value & "," 
    Next cell 

    sValidationList = Left(sValidationList, Len(sValidationList) - 1) 

    With ActiveSheet.Range("D1").Validation 
     '/Delete first., in case of any any existing validation 
     .Delete 

     .Add Type:=xlValidateList, _ 
       AlertStyle:=xlValidAlertStop, _ 
       Operator:=xlEqual, _ 
       Formula1:=sValidationList 
     .IgnoreBlank = True 
     .InCellDropdown = True 
     .ShowError = True 
    End With 
End Sub 
1

Как указано @cyboashu, ваша ошибка исходит из того факта, что вы не удалили проверку перед добавлением нового.

Что касается вашего другого вопроса о попытке передать диапазон Formula1 непосредственно:

Formula1 должны относиться к диапазону в виде строки. например:

Formula1:="=$G$2:$G$7" 

или, используя переменные:

Formula1:="=" & ThisWorkbook.Names("PT_Puldown").RefersToRange.Address 

или, проще:

Formula1:="=" & Range("PT_Puldown").Address 
+0

, что это прекрасно (не самый лучший путь), но вы можете передать строку тоже и его приемлемым. Ошибка 1004 связана с отсутствующей инструкцией удаления. – cyboashu

+0

@cyboashu Я не делал никаких тестов скорости, но вы можете избежать строкового кодирования, просто передав адрес аргументу. –

+0

@cyboashu О, и я согласен с вами о значении недостающего 'delete' –

2

Я бы использовать ссылку с именем диапазона, чтобы создать формулу, чтобы положить в Formula1 параметра Validation объект Add() метод, как следует

Sub addPT_Validation() 
Dim formula As String 

With ThisWorkbook.Names("PT_Puldown").RefersToRange 
    formula = "'" & .Parent.Name & "'!" & .Address(External:=False) 
End With 

With ActiveSheet.Range("D14").Validation 
    .Add Type:=xlValidateList, _ 
      AlertStyle:=xlValidAlertStop, _ 
      Operator:=xlEqual, _ 
      Formula1:=formula 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .ShowError = True 
End With 
End Sub 
+0

это все равно сбой и выдача ошибки 1004, код должен удалить любую существующую проверку данных для прежде чем пытаться добавить новую. – cyboashu

+0

@cyboashu, так что давайте добавим его! Забавно, что никто не заботится о ссылках на листы в параметре Formula1, который, хотя и не определен, кажется почти вероятной проблемой из кода OP, где для списка используется имя области с названием рабочей книги и ссылка ActiveSheet для ячейки, связанной с ее размещением ... – user3598756

+0

Не принимайте мои комментарии иначе. Просто хотел указать на завершение. Не намеревался начинать какие-либо аргументы или критиковать :) – cyboashu

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