Фильтрация списка проверки на основе столбцов в именованном диапазоне

#validation #excel #vba

#проверка #excel #vba

Вопрос:

Я ищу способ отфильтровать проверку списка в Excel на основе именованного диапазона с несколькими столбцами.

У меня есть список выпусков продукта на одном листе, содержащийся в именованном диапазоне, который содержит столбцы: Имя, тип, статус. На другом листе я хочу, чтобы пользователь мог выбирать из списка проверки, содержащего только ‘Name’. Здесь рассматривается вопрос 3741060 о том, как сделать так, чтобы список проверки содержал только столбец ‘Name’. Однако мне также нужно выполнить фильтрацию, чтобы пользователь не мог выбрать выпуск со статусом «Завершено». [Столбец состояния допускает только «Запланировано», «Выделено» или «Завершено».]

В идеале я также хотел бы динамически отображать только «Запланированные» ИЛИ «Выделенные» выпуски на основе еще одной проверки — но я думаю, что если я смогу отфильтровать список вообще, я смогу сделать все остальное. Кстати — я вынужден использовать Excel 2003 для этого, хотя я не считаю, что это было бы важным фактором.

Ответ №1:

Я использую

  • дополнительный диапазон LOV (для списка значений) на скрытом листе, который я заполняю текущими критериями, из которых пользователь может выбрать (в моем случае это варьируется от строки к строке по мере заполнения листа)
  • все ячейки на главном листе проверяются на соответствие этому диапазону LOV
  • триггер Selection_Change() загружает LOV после каждого перемещения курсора из исходного диапазона возможных вариантов

Вот как я повторно генерирую свой LOV (по сути, пользователь уже выбрал код страны в другой ячейке, переданной здесь в строке CtyCd, и теперь таблица подготовлена, чтобы предложить выбор возможных вариантов чего-то под названием GINI только для этой страны… так что, возможно, похоже на ваше требование)

 Sub LoadL2LOV(CtyCd As String, LOVL2 As Range)
'
' CtyCd is a selection criterium for the original list in range GINI
' LOVL2 is the target range containing the current list of values
' all cells in sheet have a validation against range LOV defined
'
Dim GINI As Range, Idx As Long, Jdx As Long, LName As Name, Adr As String

    ' clear current PoP_L2
    Set LName = ActiveWorkbook.Names(LOVL2.Name.Name)
    Set GINI = Worksheets("GINI Availability").Range("GINI")
    LOVL2.ClearContents

    ' set new LOV for PoP_L2
    If CtyCd <> "" Then
        Idx = 2
        Jdx = 1

        ' find 1st occurence of CtyCd in GINI
        Do While GINI(Idx, 4) <> CtyCd And GINI(Idx, 4) <> ""
            Idx = Idx   1
        Loop

        ' GINI is sorted, just read until the end of selected CtyCd
        Do While GINI(Idx, 4) = CtyCd
            LOVL2(Jdx, 1) = GINI(Idx, 1) amp; "-" amp; GINI(Idx, 2) amp; "-" amp; GINI(Idx, 3)
            Idx = Idx   1
            Jdx = Jdx   1
        Loop
    End If

    ' redefine LOV name to contain all current valid choices
    LOVL2.CurrentRegion.Name = LOVL2.Name.Name
End Sub
  

В вашем случае, поскольку данные кажутся более или менее статичными, вы можете скопировать все допустимые выборки из [Prod_Release] в LOV с помощью Sheet_Activate или любого соответствующего триггера активации.

Надеюсь, это поможет …. удачи MikeD

Комментарии:

1. Спасибо MikeD. Я надеялся найти способ обойтись без промежуточного списка. Однако я не подумал о предварительном вычислении. Я посмотрю, смогу ли я развить эту идею.