我有一个由2列组成的表。 A列保存客户名称列,B列保存项目名称。
我需要创建List(用于数据验证使用),其中包含与特定客户名称相关的所有项目。
客户手动输入客户名称,根据输入的客户名称,列表应更新为相应的项目。
如何创建此类列表?
问候
答案 0 :(得分:0)
通过串联制作DV列表并将其存储为全局字符串变量。一旦创建,它就可以用作DV标准。
制作名单:
Dim DVList As String
Sub MakeDVList()
Dim N As Long, I As Long
With Sheets("Sheet1")
N = .Cells(Rows.Count, "A").End(xlUp).Row
For I = 2 To N
If .Cells(I, "A").Value = "jim" Then
DVList = DVList & "," & .Cells(I, "B").Value
End If
Next I
DVList = Mid(DVList, 2)
End With
End Sub
这假设名称/项目数据从第2行开始
运行完毕后,选择一个单元格并运行:
Sub SetDV()
With ActiveCell.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=DVList
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End Sub
理想情况下,subs和global都应该在同一个模块中。
答案 1 :(得分:0)
如果您不介意使用一个辅助列
,您可以在没有VBA的情况下解决它在示例中(见图)C1包含名称,D列是aux列,ComboBox在E1中。
在D1中写下这个数组公式(不要忘记用Ctrl Shift Enter输入它)
=IFERROR(INDEX($B$2:$B$10;SMALL(IF($A$2:$A$10=$C$1;ROW($A$2:$A$10)-ROW($A$2)+1;"");ROWS($A$1:A1)));"")
将此公式复制到D10(或至少,当你得到第一个空格时)
现在在E1中输入数据验证,列表和来源输入公式:
=OFFSET(D1;0;0;MATCH("";D:D;0)-1;1)
根据您的区域设置,您可能需要替换“;”通过“,”