通过双条件填充列表

时间:2009-12-04 21:22:38

标签: excel excel-vba excel-formula excel-2003 vba

我有兴趣实施一些东西,但我不确定它是否可能,并希望你的摄入量。

这是我的情景:

我将有两个验证单元格,将显示为我将从中选择的列表。 这些是我想要见面的条件,并从数据库中省略我的列表。

我有一个代理商列表会抛出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

...

当我从验证cell1:X和验证cell2:1中选择时,我想填充B列中的代理名称列表。 它应该只显示

column:
agent1
agent4

或X列中的代理0 ...

我读了一些关于数组公式的地方,但我不知道这是否方便,我很遗憾没有宏的任何背景:(但我知道在C ++这样的条件语句相当容易。

提前感谢,

1 个答案:

答案 0 :(得分:2)

有可能。解决此问题的一种方法是,每当Worksheet_Change中的Target与验证cell1或cell2相交时,调用一个列出相关代理的子 - >验证改变了。

然后你将运行一个包含3个参数srcRange,validationColumn和validationValue的子程序,这些参数将转到srcRange的每一行并检查位置rownumber上的单元格,validationColumn是否等于validationValue,如果这样它输出代理并设置outputrow + 1 < / p>

将此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

我在你的例子上测试了它并且它有效。