#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. Я надеялся найти способ обойтись без промежуточного списка. Однако я не подумал о предварительном вычислении. Я посмотрю, смогу ли я развить эту идею.