【发布时间】:2025-12-22 20:35:18
【问题描述】:
我有一个由 2 列组成的表格。 A 列包含客户名称列表,B 列包含项目名称。
我需要创建包含与特定客户名称相关的所有项目的列表(用于数据验证)。
客户名是用户手动输入的,根据输入的客户名,列表更新到对应的项目。
如何创建这样的列表?
问候
【问题讨论】:
我有一个由 2 列组成的表格。 A 列包含客户名称列表,B 列包含项目名称。
我需要创建包含与特定客户名称相关的所有项目的列表(用于数据验证)。
客户名是用户手动输入的,根据输入的客户名,列表更新到对应的项目。
如何创建这样的列表?
问候
【问题讨论】:
通过连接创建 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 应该在同一个模块中。
【讨论】:
如果你不介意使用一个辅助列,你可以不用VBA来解决它
在示例中(见图)C1包含名称,D列是辅助列,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)
根据您的区域设置,您可能需要替换“;”由“,”
【讨论】: