2011-05-23 92 views
1

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

我在一张纸上列出了产品发布,包含在具有列名称,类型,状态的命名范围中。在另一张纸上,我希望用户能够从仅包含“姓名”的验证列表中进行选择。 此处的问题3741060介绍了如何使验证列表仅包含“名称”列。不过,我也需要过滤,以便用户无法选择状态为“已完成”的发布。 [状态栏只允许'已计划','已分配'或'已完成'。]

理想情况下,我还想根据另一个验证动态显示'Planned'或'Allocated'我可以完全过滤清单,我应该可以完成剩下的工作。 顺便说一句 - 我不得不为此使用Excel 2003,但我不认为这是一个主要因素。

回答

1

我用

  • 一个额外的范围LOV(为值列表)中隐藏工作表中,我填补了现行标准的用户可以从中选择(在我的情况下,这从行而异行,因为他/她填充片)
  • 在主表中的所有细胞是针对该范围LOV验证
  • 一个Selection_Change()触发后,从原始范围的可能的选择各光标移动加载LOV

这就是我重新生成我的LOV的方式(本质上用户已经在字符串CtyCd中传递给另一个单元格的国家代码中选择了一个国家代码,并且工作表现在已经预先准备好提供一些选择,这些选择只有GINI国家......所以也许类似于您的需求)

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 

在你的情况,因为数据似乎或多或少是静态的,你可以在Sheet_Activate或任何适当的距离[Prod_Release]所有的有效选择复制到LOV激活触发器。

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

+0

谢谢MikeD。我希望找到一个没有中间名单的方法。虽然我没有想过预先计算。我会看看,如果我不能在这个想法。 – Peter 2011-05-24 04:14:59