Excel数据验证-填充的下拉列表

Excel数据验证-填充的下拉列表,excel,list,validation,drop-down-menu,Excel,List,Validation,Drop Down Menu,我在表1上有一个主表: 作业语言名称 1英国约翰 2法国弗兰克 3西班牙川 4英国詹姆斯 5英国约翰 我设法在“语言”列上设置了数据验证,因此有一个包含语言的下拉列表。但是,我希望在列名中有一个下拉菜单,其中包含任何说Sheet2表中所选语言的人 Sheet2如下所示-有多种语言和名称: 语言名称 英国约翰 英国詹姆斯 法国弗兰克 西班牙语传 西班牙亚历杭德罗 正如你所看到的,每种语言都有多个人 有没有办法在下拉菜单中只显示所选语言的人员 像这样: 选择语言->在下拉列表中仅显示说该语言的人 谢

我在表1上有一个主表:
作业语言名称
1英国约翰
2法国弗兰克
3西班牙川
4英国詹姆斯
5英国约翰

我设法在“语言”列上设置了数据验证,因此有一个包含语言的下拉列表。但是,我希望在列名中有一个下拉菜单,其中包含任何说Sheet2表中所选语言的人

Sheet2如下所示-有多种语言和名称:

语言名称
英国约翰
英国詹姆斯
法国弗兰克
西班牙语传
西班牙亚历杭德罗

正如你所看到的,每种语言都有多个人

有没有办法在下拉菜单中只显示所选语言的人员

像这样: 选择语言->在下拉列表中仅显示说该语言的人

谢谢你的帮助

在VBA代码编辑器(ALT+F11)中,添加与事件更改相关的工作表函数

下面是VBA程序的代码。 当您更改语言时,过程开始。它使用表2中的人员列表更改所有数据验证列表

如果程序在您的机器上正常工作,请反馈

Option Base 1

Private Sub Worksheet_Change(ByVal Target As Range)
Dim arrTemp() As Variant
Dim intNumberOfRowsSheet1 As Integer, intNumberOfRowsSheet2 As Integer
Dim i As Integer, j As Integer
Dim strCurrentLanguage As String
Dim wksSheet1 As Worksheet, wksSheet2 As Worksheet
Dim intNumberOfPersons As Integer

 Set wksSheet1 = Worksheets("sheet1")
 Set wksSheet2 = Worksheets("sheet2")

intNumberOfRowsSheet1 = wksSheet1.Range("a1").CurrentRegion.Rows.Count  'number of rows in sheet1
intNumberOfRowsSheet2 = wksSheet2.Range("a1").CurrentRegion.Rows.Count 'number of rows in sheet2

 If Target.Column = 2 Then     'execute when value in column 2 (language) changes

   For i = 2 To intNumberOfRowsSheet1
      strCurrentLanguage = Cells(i, 2).Value  
      intNumberOfPersons = 0
      ReDim arrTemp(1)
        For j = 2 To intNumberOfRowsSheet2
          If wksSheet2.Cells(j, 1) = strCurrentLanguage Then
            intNumberOfPersons = intNumberOfPersons + 1
            ReDim Preserve arrTemp(intNumberOfPersons)
            arrTemp(intNumberOfPersons) = wksSheet2.Cells(j, 2)
          End If
        Next j
      If intNumberOfPersons = 0 Then arrTemp(1) = "no persons speaks " & wksSheet1.Cells(i, 2)
      With wksSheet1.Cells(i, 3).Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
         Operator:=xlBetween, Formula1:=Join(arrTemp, ",")
      End With
   Next i
 End If
End Sub

您必须创建一些命名范围,并使用
INDIRECT
选择合适的范围。请参阅本指南,了解如何执行此操作的详细说明。谢谢,我已经尝试过此操作,但问题更大,因为我有大量包含语言和名称的表,需要先按语言进行筛选,以减少下拉列表中的名称数量。我不想为每种语言创建新的表/工作表。然而,这可能是最简单的解决方案——制作一个脚本,在某个地方只使用一种语言创建表,下拉列表将从那里获取数据。谢谢!这是我要找的东西。我试着把它放进去,但当我改变语言并点击名称下拉列表时,它是空的。您能指定intNumberOfRowsSheet吗?我尝试使用范围(“a1:a5”)等,但没有帮助。您好,请检查示例:[链接]的共享文件