首页 文章

Excel中的Visual Basic基于键的下拉列表填充

提问于
浏览
-3

我一直在尝试在工作表上创建一个下拉列表,该列表根据不同单元格中的条目填充,即

ws1 -------------------------------
|数字|下拉列表|
| 123 | - > 123关联列表|
| 456 | - > 456协会列表|


WS2 ----------------------
| 123 | tttttt | 9000 |
| 123 | kkkkkk | 8000 |
| 123 | hhhhhh | 7000 |
| 456 | yyyyyy | 6000 |
| 456 | uuuuuu | 5000 |

因此,当在数字单元格中键入123或456时,下拉列表从ws2中的相关单元格填充,即

"typed by user" | "auto populates list"
| 456 | yyyyyy-6000 |

  • uuuuuu-5000

然后用户可以选择yyyyyy或uuuuuu,并且单元格将填充列表选择中的字符单元格值 .

2 回答

  • 0

    由于第二列需要找到与第一列中的单个重复值相关联的多个值,因此我使用此函数

    =INDEX(ASP!$D2:$D$2048,SMALL _
    (INDEX((Sheet1!AH$2=ASP!$A2:$A$2048)* 
    (MATCH(ROW(ASP!$A2:$A$2048),ROW(ASP!$A2:$A$2048)))+ _
    (Sheet1!AH$2<>ASP!$A2:$A$2048)*2048,0,0),ROW($A1)))
    

    并根据程序限制将其向下拖动一段合理的行 . 这是一个令人讨厌的功能,根据正在查看的单元格范围可能需要几秒钟才能完成 .
    即如果你只使用"ASP!A:A"而不是"ASP!A2:A2028",这最终会运行n ^ 2个索引调用,并且需要永久 .

    然后我用

    =VLOOKUP(AI2,ASP!$D:$G,4,0)
    

    根据第一组找到的内容填充下一组列

    然后我用

    =IFERROR(CONCATENATE(AI2,"|",AJ2),"")
    

    将第二列和第三列放在一起,以便在使用列表下拉列表时存在两个数据点 .

    在此之后,我只使用数据验证列表并使用最后一列中的值填充它们,使用IFERROR使列表中没有任何与之相关的数据点的单元格显示为空白 . 我使用on_change事件来遍历列表列中当前更改的值以拆分连接,并仅使用所需的值填充单元格 .

    这样做是为了使用户不必查看excel工作簿的多个页面来选择适当的数据点来填写他们只能在最初所需类别中键入的提交页面,然后列表将显示可用选项以及这些选项的数量 .

  • 0

    这是我的选择列表应用程序的一个版本 .

    在输入数字的工作表的更改事件中:

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("A5")) Is Nothing Then Fill_X_list (Me.Range("A5"))
    End Sub
    

    在代码模块中:

    Sub Fill_X_list(myX As String)
    Dim locx As Long, YBottom As Long
    Dim listcounter As Long
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    listcounter = 2
    Sheets("Lists").Range("A:Z").ClearContents
    Sheets("Lists").Range("A1") = myX
    Sheets("WS1").Range("C5") = "All Values"
    YBottom = Sheets("WS2").Cells(Rows.Count, 1).End(xlUp).Row
    
    For locx = 1 To YBottom
        If Sheets("WS2").Cells(locx, 1) = myX Then
            Sheets("lists").Cells(listcounter, 1) = Sheets("WS2").Cells(locx, 2) & "-" & Sheets("WS2").Cells(locx, 3)
            listcounter = listcounter + 1
        End If
    Next locx
    
    Sheets("Lists").Range("A2:A" & Sheets("lists").Cells(Rows.Count, 1).End(xlUp).Row).Name = "YList"
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    End Sub
    

    输入'123'的单元格应该是更改事件中的范围(即A5) . 范围表(“列表”) . 单元格(“A2:A3”)应命名为“YList” . 当子运行时,范围的大小将改变 .

    选择列表所在的单元格应该具有source = YList的验证“list” .

    我想就是这样 . 如果我错过了什么让我知道 . 我有一个工作的例子 .

相关问题