2015-03-14 5 views
0

Я хочу создать выпадающий список штатов, районов, подрайонов и т. Д. Выбирая одно из состояний из списка состояний drpoDown, выпадающий список округа должен содержать только список районов, принадлежащих этому конкретному состоянию , Как это сделать, используя код vba. Это действительно возможно?Dynamic DropDown in excel

+0

Является ли это действительно необходимо использовать VBA? Это можно сделать без VBA. –

+0

Не нужно использовать VBA. –

+0

Одно видео стоит тысячи слов: https://www.youtube.com/watch?v=-78bH0RZ7MA –

ответ

0

Это немного грубо идея ... попробовать - я разработал все sheet2 Сначала создайте данных

[A1] [B1] [C1] 
State Dist SubDist 
State1 Dist1 SD1 
State1 Dist1 SD1 
State1 Dist1 SD1 
State1 Dist1 SD2 
State1 Dist1 SD2 
State1 Dist2 SD1 
State1 Dist2 SD1 
State1 Dist2 SD2 
State1 Dist2 SD2 
State1 Dist2 SD2 
State1 Dist3 SD3 
State1 Dist3 SD3 
State2 Dist1 SD1 
State2 Dist1 SD1 
State2 Dist1 SD1 
State2 Dist1 SD2 
State2 Dist1 SD2 
State2 Dist2 SD1 
State2 Dist2 SD1 
State2 Dist2 SD2 
State2 Dist2 SD2 
State2 Dist2 SD2 
State2 Dist3 SD3 
State2 Dist3 SD3 

Крит Критерии для Advance Фильтр [J1] [K1] [L1] Государственного Dist SubDist State1 dist1

Первый Добавьте уникальное состояние значения в раскрывающемся 1 «drpState» и назначить getDist() к раскрывающемуся государственному отбору (сделать более 2 для других selecitons как дист, к югу дист ...)

Создать 3 Dropdowns 'drpState' [Макро: getDist()], 'drpDist' [Macro: getSDist()], 'drpSDist'

Sub getDist()'<< Assign to State Selection 
    Call GetDropdownValue("drpState", Sheet2.Range("J2")) 
    Sheet2.Range("J1").CurrentRegion.Offset(1, 1).Clear 
    Call GetSubList("drpDist", 2, Sheet2.Range("O1")) 
End Sub 

Sub getSDist() '<< Assign to Destic Selection 
    Call GetDropdownValue("drpDist", Sheet2.Range("K2")) 
    Call GetSubList("drpSDist", 3, Sheet2.Range("O1")) 
End Sub 

Sub GetDropdownValue(ByVal DropdownName As String, OutPutRange As Range) 
    With Sheet2.DropDowns(DropdownName) 
     OutPutRange.Value = .List(.ListIndex) 
    End With 
End Sub 

Sub GetSubList(ByVal DropdownName As String, ByVal intLevel As Integer, ByVal OutPutRange As Range) 

    Dim rngMainData As Range 
    Dim rngList  As Range 

    If OutPutRange.Value <> vbNullString Then 
     OutPutRange.CurrentRegion.Clear 
    End If 

    Set rngMainData = Sheet2.Range("A1").CurrentRegion.Columns(1).Resize(, intLevel) 
    rngMainData.AdvancedFilter xlFilterCopy, Sheet2.Range("J1").CurrentRegion.Columns(1).Resize(, intLevel), OutPutRange, True 

    With OutPutRange.CurrentRegion.Columns(intLevel) 
     Set rngList = .Offset(1).Resize(.Rows.Count - 1) 
    End With 

    With Sheet2.DropDowns(DropdownName) 
     .List = rngList.Value 
    End With 
End Sub 

Я думаю, что это поможет вам решить ваш вопрос .. .

+0

Создание выпадающих списков с использованием drpDist FormControls ',' drpDist ' – Arya

+0

O1 - это место, где будут отображаться отфильтрованные данные и K1 if выбранные данные из выпадающего списка [J], [K] [L] 1 ** Государственный \t \t Dist SubDist ** 2 State2 \t dist1 – Arya

+0

http://1drv.ms/1MCuAqL – Arya

1

Скажем, у нас есть основной раскрывающийся в ячейке B2 на основе значений в колонке H:

enter image description here

Столбец I содержит вторичную раскрывающуюся информацию как разделенные запятой списки, каждый список в одной ячейке. Следующий макрос события обнаружит изменения в ячейке B2 и установит DV в ячейке C2 соответственно.

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim v As Variant, r As Range 
    If Intersect(Target, Range("B2")) Is Nothing Then Exit Sub 
    If Range("B2").Value = "" Then Exit Sub 
    Application.EnableEvents = False 

    v = Target.Value 
    Set r = Range("H3:H5").Find(What:=v, After:=Range("H3")).Offset(0, 1) 
    v = r.Value 

    With Range("C2").Validation 
      .Delete 
      .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
      xlBetween, Formula1:=v 
      .IgnoreBlank = True 
      .InCellDropdown = True 
      .InputTitle = "" 
      .ErrorTitle = "" 
      .InputMessage = "" 
      .ErrorMessage = "" 
      .ShowInput = True 
      .ShowError = True 
    End With 
    Application.EnableEvents = True 
End Sub 

Поскольку это таблица кода, очень проста в установке и автоматическое использование:

  1. правой кнопкой мыши на название вкладки в нижней части окна Excel
  2. выберите View Code - это вызывает окно VBE
  3. вставить материал в и закройте окно VBE

Если у вас есть озабоченность сначала попробуйте на пробном листе.

Если вы сохраните книгу, макрос будет сохранен вместе с ней. Если вы используете версию Excel позже 2003 года, вы должны сохранить файл как .xlsm, а не.XLSX

Чтобы удалить макрос:

  1. подвезти окна VBE как выше
  2. ясный код из
  3. закрыть окно VBE

Чтобы узнать больше о макросах в целом , см.:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

и

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

Чтобы узнать больше о Event Macros (таблица кодов), см:

http://www.mvps.org/dmcritchie/excel/event.htm

Макросы должны быть разрешены для этой работы!

Вот как будет выглядеть C2 выпадающий:

enter image description here

+0

Красивый ответ. Однако, не будет ли это просто поместить всю ценность клетки в новый DV: «бигль, мопс, колли»? Я думаю, что OP означает, что на основе одного выбора из списка в B2, появится другой список DV ** ** в C2. На каждой отдельной строке: «бигль» * следующая строка * «мопс» * следующая строка * «колли». –

+0

@ BranislavKollár Дайте ему попробовать ............... * DV * может быть настроен либо с частичным столбцом ячеек, либо с помощью строки, разделенной запятой **. –

+0

Amazing. Работает как шарм.Спасибо за то, что поделился этим. –