Как убедиться, что валидация принимает непустые значения? - PullRequest
1 голос
/ 17 июня 2019

Список значений

LIST OF VALUES

Выпадающее

DROPDOWN

У меня есть код, который принимает значения от А2 до последней строки и создает раскрывающийся список. Я хочу изменить его таким образом, чтобы раскрывающийся список содержал только непустые значения. Пожалуйста, проверьте изображение для лучшего понимания

For i = 2 To LastRow1 + 1
        With sht.Range("A" & i).Validation
            .delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Operator:=xlBetween, Formula1:="=DropDown!A2:A" & LastRowAT
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = "Value not present in drop down."
            .ShowInput = True
            .ShowError = True
        End With
Next i

1 Ответ

1 голос
/ 17 июня 2019

Вам понадобится временный рабочий столбец, который может (необязательно) находиться на скрытом листе.

Затем вы можете использовать INDEX для извлечения значений из столбца (INDEX(DropDown!A:A,ROWNUM,1) - нам просто нужно выяснить, из какой строки получать данные.

Очень полезная функция здесь - AGGREGATE - это позволяет нам использовать функциональность таких вещей, как SUM, MIN, COUNTA или SMALL при пропуске скрытых строк и / или значений ошибок. В этом случае мы хотим SMALL (получить k th наименьшее число из списка), и мы будем использовать ISBLANK, чтобы сгенерировать ошибку #DIV0!, когда клетка пуста.

Для скорости расчета будут обрабатываться только первые 100 строк в столбце A

AGGREGATE(15, 6, ROW(DropDown!$A$1:$A$100)/--NOT(ISBLANK(DropDown!$A$1:$A$100)), ROW())

Первый бит (AGGREGATE(15, 6,) означает, что мы хотим SMALL и исключаем любые строки с ошибками. Последний бит (, ROW())) означает, что в строке 1 st нам нужно наименьшее значение, затем в строке 2 nd следующее наименьшее и т. Д., Пока мы не запустим из значений без ошибок.

Средний бит (ROW(DropDown!$A$1:$A$100)/--NOT(ISBLANK(DropDown!$A$1:$A$100))) начинается с выбора номера строки для каждой ячейки из раскрывающегося списка и деления его на 1 (если ячейка не пустая) или 0 (если ячейка пуста). Все, что разделено на 1, само по себе дает номер строки, а все, что разделено на 0, даст ошибку.

Затем мы можем вставить это в нашу INDEX формулу как строку для извлечения, например так:

=INDEX(DropDown!$A:$A, AGGREGATE(15, 6, ROW(DropDown!$A$1:$A$100)/--NOT(ISBLANK(DropDown!$A$1:$A$100)), ROW()), 1)

Затем вы можете назначить свой выпадающий список этому списку (или установить динамический именованный диапазон, который будет автоматически изменять размер, например =OtherDropDown!$A$1:INDEX(OtherDropDown!$A:$A,COUNTA(DropDown!$A:$A),1))

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