Заполните раскрывающийся список отфильтрованными данными - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь найти способ сделать выпадающий список, который содержит элементы, только если условие выполняется в другом столбце исходной таблицы.

Так что в основном у меня есть таблица со списком всех работ, прошлых и настоящих. Некоторые были завершены, а некоторые все еще открыты. Столбец A содержит номера работ, которые являются уникальными, а столбец P позволяет пользователю узнать, открыто или закрыто задание. Если задание закрыто, ячейка содержит «Y», если задание все еще открыто, ячейка пуста.

У меня есть другая таблица, в которой есть выпадающий список, который позволяет пользователю выбрать работу, над которой он работает. Чтобы размер выпадающего списка был разумным, я хочу, чтобы он содержал только номера заданий, которые все еще открыты. Есть ли способ использовать оператор IF или аналогичный, чтобы заполнить раскрывающийся список только номерами заданий из столбца A, если столбец P пуст?

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

1 Ответ

0 голосов
/ 07 ноября 2018

Я думаю, что самый простой способ составить список - это использовать макрос для этого.

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

Sub makeList()
Dim arr() As Variant, i As Integer, lnght As Long
lnght = Range("A" & Rows.Count).End(xlUp).Row
i = 0
For Each cell In Range("A1:A" & lnght)
    If Not cell.Offset(0, 15).Value = "Y" Then
        ReDim Preserve arr(0 To i) As Variant
        arr(i) = cell.Value
        i = i + 1
    End If
Next

With Range("C1").Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
        Formula1:=Join(arr, ",")
End With
End Sub

Это помещает раскрывающийся список в "C1", поэтому просто измените его на то место, где оно должно быть.

Это необходимо обновлять каждый раз, когда задание добавляется, удаляется или изменяется на закрытое. Вы можете иметь кнопку обновления или просто поместить код на листе. Я бы предложил вызывать его с Worksheet_Change, и если вы не хотите, чтобы оно запускалось при каждом изменении, добавьте метод пересечения, чтобы проверить, соответствует ли цель изменения списку.

Также предполагается, что разделителем является «,», поэтому при необходимости измените его.

...