2013-03-28 7 views
3

настоящего времени у меня есть таблица, которая выглядит следующим образом:Excel отфильтрованных данных на основе содержимого ячейки

| A |  B  | 
    +-------+-----------+ 
1 | State | City  | 
    +=======+===========+ 
2 | NSW | Goulburn | 
3 | NSW | Sydney | 
4 | VIC | Melbourne | 
5 | VIC | Horsham | 
6 | NSW | Tamworth | 

И тогда у меня другая таблица, которая выглядит следующим образом:

| A |  B  |  C  | 
    +-------+-----------+------------+ 
1 | State | City  | Other data | 
    +=======+===========+============+ 
2 |  |   |   | 

В этом вторая таблица. Я применил проверку данных как для столбца State, так и для City, ссылаясь на данные из первой таблицы. Поэтому у меня есть списки всех штатов и городов.

То, что я хочу быть в состоянии сделать это, если пользователь вводит «NSW» в столбце Состояние, список опций в колонке города фильтруется, чтобы показать только города, расположенные в Новом Южном Уэльсе

+0

Используйте 'Worksheet_Change' событие для динамического сброса проверки, на основе значения, введенного в столбце А. –

+0

Любая идея, как написать этот сценарий? – McShaman

+0

Да. См. Ниже ... –

ответ

1

Место это в модуле кода рабочего листа.

Измените определение shTable, чтобы обратиться к рабочему листу, на котором находится ваша таблица поиска.

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim myVal As String 
Dim cityList As String 
Dim table As Range 
Dim cl As Range 
Dim shTable As Worksheet: Set shTable = Sheets("Index") '<modify as needed' 

If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub 

myVal = Target.Value 
With shTable 
    Set table = .Range("A2", .Range("A2").End(xlDown)) 'contains your city/state table' 
End With 
    For Each cl In table 
    'Build a comma-separated list of matching cities in the state.' 
     If cl.Value = myVal Then 
      If cityList = vbNullString Then 
       cityList = cl.Offset(0, 1) 
      Else: 
       If InStr(1, cityList, cl.Offset(0,1).Value, vbBinaryCompare) > 0 Then 
       'avoid duplicates, but this is not a foolproof method.' 
       'probably should rewrite using an array or scripting dictionary' 
       'otherwise the possibility of partial match is a potential error.' 
        cityList = cityList & "," & cl.Offset(0, 1) 
       End If 
      End If 

     End If 
    Next 

'Now, with the cell next to the changed cell, remove ' 
' any existing validation, then add new validation ' 
' based on the cityList we compiled above. 
With Target.Offset(0, 1).Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
    xlBetween, Formula1:=cityList 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
End With 

End Sub 
+0

Ваш гений Дэвид! Два вопроса, было бы легко фильтровать любые дубликаты здесь? Также возможно использовать именованные диапазоны вместо статической ссылки? Если да, то какой синтаксис? – McShaman

+0

Например, если ваша таблица имеет именованный диапазон, прикрепленный к ней, вы можете сделать «Установить таблицу = .Range (« Именованный диапазон »)» (соответственно обновить). Я обновлю ответ, чтобы избежать дубликатов. –

+0

Большое спасибо за вашу помощь Дэвид. Мне пришлось изменить символ «>» на знак равенства «=», но кроме этого он отлично работает. Я думаю, что мой следующий шаг будет заключаться в том, как работать с массивами в VBA. Но эта плита кода стала очень полезной для понимания некоторых основных концепций VBA. – McShaman