Как создать динамические выпадающие в Excel на основе другой ячейки - PullRequest
0 голосов
/ 15 апреля 2019

Например, допустим, у меня есть 2 таблицы. Таблица A - это провинции, а таблица B - города.

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

Провинция

ID, Title
1, Ontario
2, Quebec

Город

ID, ProvinceID, Title
1, 1, Ottawa
2, 1, Toronto
3, 2, Quebec City

У меня есть третья таблица, давайте назовем ее, таблица с посещениями города. Эта таблица выглядит примерно так

ID, Provivince, City    
1, [Province Drop down based on the entire column], [INSERT ISSUE HERE]

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

Значения раскрывающегося списка городов определяются на основе того, что выбрано в раскрывающемся списке провинции.

Спасибо за помощь:)

Ответы [ 3 ]

0 голосов
/ 15 апреля 2019

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

AGGREGATE(15, 7, Range, k даст вам k th наименьшее (15) значение в Range, которое не является ошибкой или скрытой строкой (7). Итак, нам нужно определить Range как массив, который возвращает идентификатор, когда провинция соответствует нашему выбору, или Error (эй, смотри, функция NA() возвращает ошибку!), Если это не так.

Это кажется достаточно простым: IF(E$1:E$4=$H$2,D$1:D$4,NA()) вернет значение в столбце D, если столбец E соответствует ячейке H2, или ошибку #NA!, если нет

Что касается k? Итак, мы хотим начать сверху (k = 1) и двигаться вниз по строкам, поэтому мы можем использовать ROW()-1 для начала в строке 2:

=AGGREGATE(15,7,IF(E$1:E$4=$H$2,D$1:D$4,NA()),ROW()-1)

NB Вам нужно будет нажать Ctrk + Shift + Введите после ввода формулы, чтобы убедиться, что это массив Формула (в окружении { и })

Тогда нам просто нужен столбец контрольной суммы, чтобы указать количество строк данных: =--NOT(ISERROR(I:I)) даст нам 1 для строки, в которой находится город, или 0 для строки ошибки. Мы можем просто SUM этот столбец использовать в OFFSET для построения вашего Именованного диапазона для выпадающего списка

Image showing an example of the formula in use, with the data from the Question Post

0 голосов
/ 15 апреля 2019

Вот решение без формул массива VBA или противного (IMO), но оно работает только для одного выпадающего списка "Провинция".

enter image description here

Он сосредоточен вокруг формулы в столбце «Параметры города», ID:

MINIFS($G$3:$G$5,$H$3:$H$5,INDEX($D$3:$D$4,MATCH($B$1,$E$3:$E$4,0)),$G$3:$G$5,">"&MAX($K$1:$K1))

Получает список идентификаторов городов для выбранной провинции.Затем он оборачивается в IF, чтобы заменить нули на пустые строки.

Затем вы можете установить список проверки данных на L3: LXX.Таким образом, список будет меняться при изменении выбранной провинции.

0 голосов
/ 15 апреля 2019

Предположим, что Лист 1 имеет структуру, подобную изображению ниже:

enter image description here

Используйте этот код на листе 1 события изменения:

Option Explicit


Private Sub Worksheet_Change(ByVal Target As Range)

    Dim strID As String, strarr As String
    Dim i As Long, LastRow As Long

    With ThisWorkbook.Worksheets("Sheet1") '<- Change sheet name if needed

        If Not Intersect(Target, .Range("B1")) Is Nothing And Target.Count = 1 Then '<- Lets say that province drop down appears in cell B1.If cell affected then

            Application.EnableEvents = False

                .Range("B2").ClearContents  '<- Clear Cities drop down

                strID = Target.Value '<- Let as assume that province drop down includes provinces ID NOT Title

                LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row '<- Find the last row of the Cities table

                For i = 3 To LastRow '<- Loop cities table and get the cities with provincesw choicen

                    If .Range("E" & i).Value = strID Then

                        If strarr = "" Then
                             strarr = .Range("F" & i).Value
                        Else
                             strarr = strarr & "," & .Range("F" & i).Value
                        End If

                    End If

                Next i

                With .Range("B2").Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                    xlBetween, Formula1:=strarr
                End With

            Application.EnableEvents = True

        End If

    End With

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