根据命名范围内的列过滤验证列表

时间:2011-05-23 05:27:39

标签: excel validation excel-vba vba

我正在寻找一种基于多列命名范围在Excel中过滤列表验证的方法。

我在一张表上有一个产品发布列表,其中包含一个命名范围,其中包含以下列:名称,类型,状态。在另一张表中,我希望用户能够从仅包含“名称”的验证列表中进行选择。 这里的问题3741060涵盖了如何使验证列表仅包含“名称”列。但是,我还需要进行过滤,以便用户无法选择状态为“已完成”的版本。 [状态列仅允许“已计划”,“已分配”或“已完成”。]

理想情况下,我还想基于另一个验证动态显示'计划'或'已分配'版本 - 但我想如果我可以完全过滤列表,我应该能够完成剩下的工作。 顺便说一句 - 我被迫使用Excel 2003,虽然我不认为这是一个主要因素。

1 个答案:

答案 0 :(得分:1)

我用

  • 隐藏工作表中的额外范围LOV(用于值列表),我填写了用户可以选择的当前条件(在我的情况下,当他/她填充工作表时,这会因行而异)
  • 主表中的所有单元格都根据此范围LOV
  • 进行验证
  • 每个光标从原始可能选择范围移动后,Selection_Change()触发器加载LOV

这就是我重新生成我的LOV的方式(本质上,用户已经在字符串CtyCd中传递的另一个单元格中选择了一个国家/地区代码,现在该表格已经准备好提供一些可能的选项,称为GINI for只有这个国家...所以可能与你的要求相似)

Sub LoadL2LOV(CtyCd As String, LOVL2 As Range)
'
' CtyCd is a selection criterium for the original list in range GINI
' LOVL2 is the target range containing the current list of values
' all cells in sheet have a validation against range LOV defined
'
Dim GINI As Range, Idx As Long, Jdx As Long, LName As Name, Adr As String

    ' clear current PoP_L2
    Set LName = ActiveWorkbook.Names(LOVL2.Name.Name)
    Set GINI = Worksheets("GINI Availability").Range("GINI")
    LOVL2.ClearContents

    ' set new LOV for PoP_L2
    If CtyCd <> "" Then
        Idx = 2
        Jdx = 1

        ' find 1st occurence of CtyCd in GINI
        Do While GINI(Idx, 4) <> CtyCd And GINI(Idx, 4) <> ""
            Idx = Idx + 1
        Loop

        ' GINI is sorted, just read until the end of selected CtyCd
        Do While GINI(Idx, 4) = CtyCd
            LOVL2(Jdx, 1) = GINI(Idx, 1) & "-" & GINI(Idx, 2) & "-" & GINI(Idx, 3)
            Idx = Idx + 1
            Jdx = Jdx + 1
        Loop
    End If

    ' redefine LOV name to contain all current valid choices
    LOVL2.CurrentRegion.Name = LOVL2.Name.Name
End Sub

在您的情况下,由于数据似乎或多或少是静态的,您可以将所有有效选择从[Prod_Release]复制到Sheet_Activate的LOV或任何适当的激活触发器。

希望这有帮助......祝你好运MikeD