从自身调用时,VBA列表框不会更新以反映新的源列表

时间:2015-11-04 02:34:44

标签: excel vba listbox

修改:

进一步发挥作用,似乎你无法通过.list = somelist方法将新数组分配给列表框,当响应单击列表框本身时发生分配。或者更确切地说,您可以分配列表,但它不会在视觉上填充列表框...虽然Excel似乎认为它在那里。

然而.additem或.removeitem方法在从列表框单击调用时会导致视觉更改,这意味着您必须以我想的方式构建新数组。多么乏味。

可以通过CommandButton启动的操作使用.list = somelist方法为列表框提供一个全新的数组。但是用户必须明显单击按钮才能执行此操作。在我的情况下,这个目的无法实现。

编辑结束。

我正在设计一个UserForm来帮助过滤数据透视表。它是现有数据透视表过滤器功能和切片器之间的交叉。如果您双击PivotField标题,则会看到以下内容:

enter image description here

请注意顶部的“搜索”字段以及该搜索字段正下方的三个按钮。如果在该字段中键入内容,则不是显示当前已过滤的所有内容,而是获取任何匹配项的列表,然后可以通过这三个CommandButtons将这些搜索结果应用于基础数据透视表。第一个cb只是过滤数据透视表以反映搜索,另外两个允许您添加或删除现有过滤器的任何搜索结果。

我想取消这三个命令按钮,而不是(如果执行搜索)只需在列表框顶部列出返回任何搜索结果的三个选项。单击这三个选项将触发与命令按钮当前触发的完全相同的代码。

如果我实际在“搜索”框中输入了某些内容,那么这就是当前的显示方式(注意我还没有删除这个从搜索框中删除的三个命令按钮):

enter image description here

我在lbResults_Change()事件处理程序中添加了一小段代码,用于检查用户是否单击了前三个选项中的任何一个。所有代码都会触发完全相同的例程,如果他们只是简单地点击实际的命令按钮本身就会被触发:

For i = 0 To 4
    If Me.lbResults.Selected(i) Then Exit For
Next i
Select Case i
    Case 0: cmdApplySearch_Click
    Case 1: cmdAddToFilter_Click
    Case 2: cmdSubtractFromFilter_Click
    Case 3: Me.lbResults.Selected(3) = False
End Select

这里的问题:如果点击这些命令按钮,列表框会更新得很好,如下所示。已相应地过滤了数据透视表,并且已从列表框顶部删除了这些上下文搜索选项(并清除了搜索字段):

enter image description here

但如果通过点击列表框本身的前三个选项之一触发完全相同的例程,则列表框不会更新:

enter image description here

从上面的屏幕截图中可以看出,它仍然显示顶部的这三个选项,即使它们不在我分配给列表框的数组中,如下面的屏幕截图所示:

enter image description here

但是从早期的截图中可以看出,它显示了ListBox中的7个项目,而不是实际存在的3个项目。但是确实只有三个项目应该显示在该列表框中:

? .ListCount 3 ? .LIST(0) 263213:ICT系统测试工程师 ? .LIST(1) 263299:未来的ICT支持和测试工程师 ? .LIST(2) 839313:产品测试员

基本上,只要我尝试通过单击列表框本身来更新列表框中的内容,我就无法更新它。

如果在执行过滤代码之前将焦点设置为列表框以外的其他内容似乎并不重要,我甚至尝试使用.clear完全清除列表框。它只是不清楚,直到我再次手动点击其中一个命令按钮。

任何人都有任何指示?

1 个答案:

答案 0 :(得分:0)

啊,我是一个多么愚蠢的人,因为他忽略了这个痛苦明显的解决方案。列表框列表很高兴地重绘以响应任何事件其他而不是ListBox_Click事件,对吧?所以我需要做的就是使用ListBox_ 单击事件来确定点击的内容(就像我目前所做的那样),然后使用ListBox_ MouseUp 事件触发实际更新ListBox列表。是一种享受。

希望这篇文章将来会为其他人带来两天的痛苦。可能是我。