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

我正在寻找一种方法来筛选基于名称范围的多列Excel中的列表validation。

我在一张纸上列出了产品发布,包含在具有列名称,types,状态的命名范围中。 在另一张纸上,我希望用户能够从仅包含“名称”的validation列表中进行select。 这里的问题3741060介绍了如何使validation列表只包含“名称”列。 不过,我也需要过滤,以便用户不能select状态为“已完成”的版本。 [状态栏只允许“已计划”,“已分配”或“已完成”。]

理想情况下,我也想根据另一个validationdynamic显示“已计划”或“已分配”版本,但是我认为如果能够完全过滤列表,我应该可以完成剩下的工作。 顺便说一句 – 我不得不为此使用Excel 2003,但我不相信会是一个主要因素。

我用

  • 一个额外的范围LOV(价值清单)在一个隐藏的表格,我填写了当前的标准,用户可以select(在我的情况下,这是因为他/她填写表单不同)
  • 主工作表中的所有单元格都将根据此范围LOV进行validation
  • 一个Selection_Change()触发器在每个光标从原始可能select范围移动之后加载LOV

这是我重新生成我的LOV(实质上,用户已经在stringCtyCd中通过这里传递的另一个单元格中select了一个国家代码,现在工作表被准备提供一个select的可能selectGINI只为这个国家…所以也许类似于你的需求)

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 

在你的情况下,由于数据看起来或多或less是静态的,你可以在Sheet_Activate或任何适当的激活触发器中将[Prod_Release]中的所有有效select复制到LOV。

希望这有助于…祝你好运MikeD