【问题标题】:Populate list via a bi-Condition通过双条件填充列表
【发布时间】:2010-12-23 09:52:09
【问题描述】:

我有兴趣实现一些东西,但我不确定它是否可能并且希望你能接受它。

这是我的场景:

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

我有一个要抛出 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

...

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

column:
agent1
agent4

或 X 列中带有 0 的代理...

我在某处读到了有关数组公式的信息,但我不知道这是否方便,不幸的是我没有宏的任何背景:( 但我知道在 C++ 中使用条件语句相当容易。

提前致谢,

【问题讨论】:

    标签: excel excel-formula excel-2003 vba


    【解决方案1】:

    这是可能的。解决此问题的一种方法是,只要 Worksheet_Change 中的目标与验证单元格 1 或单元格 2 相交 -> 验证已更改,就调用一个列出相关代理的子程序。

    然后您将运行一个带有 3 个参数 srcRange、validationColumn 和 validationValue 的子程序,它通过 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
    

    我在您的示例中对其进行了测试,它确实有效。

    【讨论】:

    • 你是对的,这确实有效。而且效果很好。我检查了代码并尝试使用 listAgents Me.Range("B3:E6") 但从不同的工作表中提取数据,例如 listAgents Me.Range("sheet2!B3:E6") 会起作用,因为它似乎没有尽我所能。
    • Me 指的是代码所在的工作表。因此您可以调用 listAgents Sheet2.Range("B3:E6") | listAgents Sheets("Sheet2").Range("B3:E6") 或 listAgents Sheets(2).Range("B3:E6")
    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多