2011-05-23 40 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