将它放在工作表的代码模块中。
更改 的定义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