VBA: проверить настройки списка - PullRequest
1 голос
/ 11 мая 2010
Sub Macro1()
'
' Macro1 Macro
'

'
    Worksheets("Drop-down").Select
    For i = 1 To 10
        ActiveSheet.Cells(i, 2).Select
        With Selection.Validation
            .Delete
            ' Error in this line
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:=Range(Worksheets("Misc").Cells(2, i), Worksheets("Misc").Cells(2, i).End)
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
    Next i
End Sub

Я получаю сообщение об ошибке в строке ниже комментария, но я не знаю, как это исправить Было бы здорово услышать некоторые предложения. Заранее спасибо!

1 Ответ

4 голосов
/ 11 мая 2010

Есть две проблемы; во-первых, вам не хватает обязательного аргумента для функции End, которая является именованной константой Excel для обозначения направления.

вместо Worksheets("Misc").Cells(2, i).End в этой строке попробуйте Worksheets("Misc").Cells(2, i).End(xlDown)

Вы также можете использовать xlLeft, вправо или вверх, но, я думаю, вы ищете именно down.

Вторая проблема - значение для Formula1 должно быть строковым адресом (я думаю), и вы передаете объект фактического диапазона.

Попробуйте это для этой строки

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=Range(Worksheets("Misc").Cells(2, i), Worksheets("Misc").Cells(2, i).End(xlDown)).Address

Это сработало на моей машине без ошибок. Я, конечно, заглушил фиктивные данные, поэтому не знаю, подходит ли он для вашего рабочего листа

РЕДАКТИРОВАТЬ (в ответ на комментарий Стэна)

Там может быть более сексуальный путь, но это хорошо и просто (что само по себе тоже сексуально); оператор if просто проверяет ячейку в следующей строке. Если он не пустой, то он работает с тем же решением, что и раньше. Если он пуст, он использует только одну ячейку в качестве диапазона проверки.

For i = 1 To 10
    If Worksheets("Misc").Cells(3, i).Value <> "" Then
        Set validationRange = Range(Worksheets("Misc").Cells(2, i), Worksheets("Misc").Cells(2, i).End(xlDown))
    Else
        Set validationRange = Worksheets("Misc").Cells(2, i)
    End If

    With Worksheets("Drop-down").Cells(i, 2).Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ 
                    Formula1:=validationRange.Address.......

Я сложил твои

Worksheet.Selection
Selection.DoStuff

пар, в

Worksheet.DoStuff

Я думаю, это выглядит немного лучше.

Дайте мне знать, если это работает для вас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...