Excel - 已过滤表格中的数据验证列表

时间:2015-03-02 23:59:27

标签: excel validation

我正在寻找一种从过滤表中提取数据验证列表的方法。 防爆。我有一张名为customers的工作表,其中包含一个名为CustomerList的表 A列=客户B =地址C =城市D =州 在另一张名为Quote的工作表中,我有一个客户名称的单元格C13,它具有一个动态范围的Sheet Customers列A Customer的数据验证列表。在我的列表中,它显示了所有1800个客户,即使我过滤表格只显示某个州的客户。我希望能够在表格上设置过滤器来对我的客户进行排序,并让我的数据验证列表仅显示过滤列表中显示的客户。对于我的生活,我无法弄清楚这一点。任何帮助将不胜感激。 TIA。

1 个答案:

答案 0 :(得分:0)

在工作表 Customers 中,选择一些单元格并输入:

=SUBTOTAL(103,A:A)

每次为 A 列更改过滤器时,都会重新计算此公式。

Customers 工作表代码区域中,安装以下事件宏:

Private Sub Worksheet_Calculate()
    Call makeDV
End Sub

在标准模块中,安装以下代码:

Public DVList As String

Public Sub makeDV()

    Dim A As Range, r As Range
    Dim c As Collection, v As Variant
    Set c = New Collection
    Set A = Intersect(Range("A2:A" & Rows.Count), ActiveSheet.UsedRange).Cells.SpecialCells(xlCellTypeVisible)
    DVList = ""

    On Error Resume Next

    For Each r In A
        v = r.Value
        If v <> "" Then
           c.Add v, CStr(v)
           If Err.Number = 0 Then
               DVList = DVList & "," & v
           Else
            Err.Clear
           End If
        End If
    Next r

    If Len(DVList) <> 0 Then DVList = Mid(DVList, 2)
    On Error GoTo 0

    Dim Quote As Worksheet
    Set Quote = Sheets("Quote")

    With Quote.Range("C13").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

每当在工作表客户上修改过滤器时,工作表报价上的单元格 C13 的数据验证将会更新。