2016-03-19 4 views
0

Обычно опция записи в Excel великолепна, но на этот раз это не помогло.Создание списка проверки данных с косвенной формулой через VBA

я могу создать список проверки достоверности данных с помощью VBA с настоящим Кодексом:

Sub Macro 8() 

With Range("C8").Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
    xlBetween, Formula1:="=Land" 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
End With 
End Sub 

Теперь это работает. Но в ячейке ниже мне нужна формула =INDIRECT($C$8). Таким образом, использование диктофона я получил почти такой же код:

Sub Macro1() 

With Range("C9").Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
    xlBetween, Formula1:="=indirect($C$8)" 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
End With 
End Sub 

Но с помощью этого кода я всегда получите «приложения или объекта определяется ошибка» указывает на линию

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
    xlBetween, Formula1:="=indirect($C$8)" 

Может кто-нибудь скажи мне, где моя ошибка?

ответ

0

Ваш код в основном правильный. Для части Indirect() вам не нужно много кода. Вот все это:

Sub Macro8() 

With Range("C8").Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
    xlBetween, Formula1:="=Land" 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
End With 
Range("C9").Formula = "=INDIRECT(""$C$8"")" 
End Sub 
+0

Привет, Майк, Спасибо за ответ! Мне нужна ячейка INDIRECT, чтобы она тоже была сбрасывается ... Если я делаю это вручную, это работает, поскольку значения, которые я получаю из C8, - это имена списков на моем листе, поэтому я получаю выбор из этого списка в C9 С просто вставкой = НЕПРАВИЛЬНО ($ C $ 8) это не сработает ... Любая идея? –

+0

Вы должны использовать = Косвенный («$ C $ 8»). Помимо этого, я бы рассмотрел этот вопрос. Для любых дальнейших вопросов лучше всего начинать новый вопрос. – MikeC

0

Хорошо, я получил его на РАЗ работать с этим, теперь я получаю ту же ошибку снова ...:

With Range("C9").Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
    xlBetween, Formula1:="=Indirect(" & Range("C8").Address & ")" 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
End With 

Я не совсем понимаю, почему Тхо ... может кто-нибудь объяснить, что такое

" & Range("C8").Address & " 

средства?

+0

Он вычисляет адрес C8. Поэтому он оценивает значение «C8». Так что это одно и то же. – MikeC

+0

Так почему это работает так, но не так, как у меня было ??? –

+0

У вас был аргумент C8. Ему нужен аргумент как адрес в виде строки; так что это должно быть «C8» или какое-то строковое выражение, которое оценивается как «C8» – MikeC

0

Получил это, чтобы работать!

Я кладу существующий код в отдельный макрос и сделал его относительно ActiveCell

теперь работает каждый раз, когда что-то выбрано в ячейке выше

Благодаря Тхо!