2009-12-04 165 views
1

即時興趣實施的東西,但我不知道如果這是可能的,並希望你的攝入量。通過雙重條件填充列表

這裏是我的方案:

我將不得不將被顯示爲列表,我將挑選兩個驗證細胞。 這些是我的條件,我想見面並從數據庫中省略我的名單。

我應該繼續開展扔B13代理列表:B23和未來他們兩個我都假設我的數據的基礎上看起來數據 列這樣

B  C  D  E 
     X | Y | Z 
agent1 1 | 1 | 0 
agent2 0 | 1 | 0 
agent3 0 | 1 | 1 
agent4 1 | 0 | 0 

...

我想從B柱填充代理名稱的列表,當我從驗證小區1中進行選擇:X和驗證小區2:1 它應該只顯示

column: 
agent1 
agent4 

或代理列X與0 ...

我讀了一些關於數組公式的地方,但我不知道這是否方便,我不幸的是沒有宏中的任何背景:(但我知道在C++這樣的事情是公平的使用條件語句很容易。

在此先感謝,

回答

2

這是可能的。解決這個問題的一種方法是調用一個sub,當您的Worksheet_Change中的Target與驗證cell1或cell2相交時 - >驗證發生更改時,會向您列出相關代理。

然後,你將運行的子帶3個paramenters srcRange,validationColumn和validationValue該推移throgh srcRange和檢查中的每一行,如果在位置ROWNUMBER細胞,validationColumn等於validationValue如果是,則輸出該劑和集outputrow + 1

將這個VBA在你的表:

Option Explicit 

    Private Sub Worksheet_Change(ByVal Target As Range) 
     Dim watchRange As Range 
     Dim validationValue As Range 
     Dim validationColumn As Integer 
     Set watchRange = Me.Range("H1, I1") ' Validation Cells ' 

     If Not Intersect(Target, watchRange) Is Nothing Then 
      Set validationValue = Me.Range("I1") 
      validationColumn = 0 
      With Me.Range("H1") 
       If (.value = "X") Then validationColumn = 2 
       If (.value = "Y") Then validationColumn = 3 
       If (.value = "Z") Then validationColumn = 4 
      End With 
       listAgents Me.Range("B3:E6"), validationColumn, validationValue 
     End If 

    End Sub 

    Private Sub listAgents(ByRef srcRange As Range, ByVal validationColumn As Integer, ByRef validationValue As Range) 

     Dim outputStart As Range 
     Dim row As Range 
     Dim i As Long 

     Set outputStart = Me.Range("H3") 
     outputStart.CurrentRegion.Clear 

     If validationColumn = 0 Then 
      MsgBox "Can't find Validation Column" 
      Exit Sub 
     End If 

     i = 0 
     For Each row In srcRange.Rows 
      If (row.Cells(1, validationColumn) = validationValue) Then 
       outputStart(1 + i, 1) = row.Cells(1, 1) 
       i = i + 1 
      End If 
     Next row 
    End Sub 

我測試的例子,它的工作。

+0

你是對的,這是行不通的。它很好地工作。 我檢查了代碼,並試圖使用listAgents Me.Range(「B3:E6」),但從不同的工作表,例如 listAgents Me.Range(「sheet2!B3:E6」) 將工作,因爲它似乎沒有在我的工作。 – 2009-12-09 22:26:06

+0

我指的是代碼所在的工作表。所以你可以調用listAgents Sheet2.Range(「B3:E6」)| listAgents Sheets(「Sheet2」)。Range(「B3:E6」)or listAgents Sheets(2).Range(「B3:E6」) – marg 2009-12-09 22:37:42

+0

NIce,試試看! 感謝瑪格 – 2009-12-09 23:00:26