【问题标题】:Listbox generates secondary Listbox based on selectionListbox根据选择生成二级Listbox
【发布时间】:2016-08-26 16:24:25
【问题描述】:

我对 VBA 还是很陌生,但我在工作表上有两个 activex 列表框。在一个列表框中,我有销售人员姓名(称为 lstNames),而另一个列表框有位置(lstSite)。我想要达到的目标如下:

  1. 从 lstNames 中选择名称
  2. 从 lstNames 中选择会生成 lstSite,其中包含与名称关联的几个位置的列表。

例如,如果我从 lstNames 列表框中选择 Bob,则 lstSites 列表框将填充 Bob 的所有站点,例如 NY、CO、CA、PA。如果我从 lstNames 中选择 Susan,则 lstSites 将清除 Bob 的并添加 Susan 的 TX、WA、OR 等站点。

lstNames 和 lstSite 从同一个工作表中提取:

 Column 1: Names
 Column 2: Site

我一直在尝试进行 Vlookup 以将项目添加到列表框,但它不起作用。我知道我可以执行 select case 语句并手动添加站点,但我想编写一个可以自动运行的好代码。

Select Case lstNames.Value
    Case "Bob"
    lstSites.AddItem WorksheetFunction.VLookup(lstDM.Text, wkbhcsfdata.Worksheets("Names+Sites").Range("Sites"), 1, False)
End Select

【问题讨论】:

  • 使用列表框事件触发一个宏,该宏在列表中运行并添加与 Bob 关联的项目。
  • 这个答案并没有真正的帮助。我一直在尝试在 lstNames 单击事件上执行此操作以运行 vlookup 函数以将项目添加到 lstSites 列表框。
  • 这不是一个答案,它是一个帮助拉近你的评论。不要使用Click 事件,在列表框中使用Change 事件。
  • 什么是“lstDM”? “站点”范围结构是什么样的? (有多少列,在哪里)

标签: excel vba select listbox vlookup


【解决方案1】:

尝试这是否有助于获得您需要的范围地址。为此,我对 Persons 使用命名范围,对 Locations 使用另一个命名范围。变量 strPerson 可以替换为单元格值。

Dim ws As Worksheet
Set ws = Worksheets("sheet2")

Dim rngPerson, rngLoc As Range
Set rngPerson = ws.Range("Person")
Set rngLoc = ws.Range("Location")

Dim iMatch, iCount As Integer
Dim strPerson As String
strPerson = "Bob"

iMatch = WorksheetFunction.Match(strPerson, rngPerson, 0)
iCount = WorksheetFunction.CountIf(rngPerson, strPerson)

Dim rngList As Range
Set rngList = ws.Range(rngLoc.Rows(iMatch), rngLoc.Rows(iMatch + iCount - 1))

一旦你有了 rngList 的动态范围,你就可以在 rngList 上循环使用类似的东西:

For Each rw in rngList.rows
    [Your code to insert list items]
Next

所有这些都需要在 ActiveX 事件中。

编辑:将 .Cells 更改为 .Rows

【讨论】:

  • 太好了,谢谢凯文。我几乎拥有它,除了我在以下位置定义了应用程序、对象定义错误:Set rnglist = wksDMSites.Range(rngLoc.Cells(imatch, 0), rngLoc.Cells(imatch + icount - 1, 0))跨度>
  • 刚刚注意到一个可能的问题,看看 Set rngList = wksDMSites.Range(rngLoc.Rows(iMatch), rngLoc.Rows(iMatch + iCount - 1)) 是否有效。另外,您可以使用 MsgBox iMatch 或调试,看看它是否返回 0?
  • 在 Excel VBA 中,转到查看>本地窗口,然后运行脚本。当 VBA 在 Set rngList 断点处停止时,检查本地窗口中的 Match 值。我能够在没有任何错误的情况下运行代码,但如果 Match 为 0,我可以复制它。此时代码中的 rngList 应该什么都没有。 link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
相关资源
最近更新 更多