【问题标题】:Create List from Data matching Criteria从数据匹配标准创建列表
【发布时间】:2025-12-22 20:35:18
【问题描述】:

我有一个由 2 列组成的表格。 A 列包含客户名称列表,B 列包含项目名称。

我需要创建包含与特定客户名称相关的所有项目的列表(用于数据验证)。

客户名是用户手动输入的,根据输入的客户名,列表更新到对应的项目。

如何创建这样的列表?

问候

【问题讨论】:

    标签: arrays excel list


    【解决方案1】:

    通过连接创建 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 应该在同一个模块中。

    【讨论】:

    • 谢谢,但我不能使用宏。
    【解决方案2】:

    如果你不介意使用一个辅助列,你可以不用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)
    

    根据您的区域设置,您可能需要替换“;”由“,”

    【讨论】:

    • 感谢您的帮助,但没有奏效。我得到#N/A 而不是列表。有什么建议吗?
    • 它有效,我试过了 :) 将 D1 中的公式复制下来,直到至少得到第一个空白空间,不要忘记 Ctrl Shift Enter。请参阅我的编辑,公式是在 D1 而不是 C1 中。数据验证公式将尝试查找第一个空格,以便知道范围何时结束。
    • 现在可以了。问:有没有办法避开D列,把D列的方程放到OFFSET函数中?