我有兴趣实施一些东西,但我不确定它是否可能,并希望你的摄入量。
这是我的情景:
我将有两个验证单元格,将显示为我将从中选择的列表。 这些是我想要见面的条件,并从数据库中省略我的列表。
我有一个代理商列表会抛出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 ++这样的条件语句相当容易。
提前感谢,
答案 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
我在你的例子上测试了它并且它有效。