【发布时间】:2016-09-12 06:13:58
【问题描述】:
我正在构建一个 Excel VBA 项目,该项目使用 ListBox 在树结构中导航。通过双击一个项目,它会在下面展开其他项目。我的目标是,通过进行此选择,将进行更改并且 ListBox 将更新,同时保留用户刚刚单击的选择并将其保留在视图中。
我创建了一个单独的工作簿来隔离问题,我必须让它变得更简单,并且我将能够将任何解决方案复制到我的原始项目中。
我的 ListBox 是使用 RowSource 填充的。值存储在工作表上(出于真正的原因,我将在这篇文章中省略以保持重点),对工作表进行更改,然后再次调用 RowSource 以更新 ListBox。通过这样做,ListBox 将更新,然后跳到视图中最后一项所做的选择,但现在选择的列表项是在先前选择的位置不正确的项。
例子:
- 用户使用滚动条向下滚动 ListBox 并双击项目“Test 100”
- ListBox 已更新,但选择不正确。 'Test 86' 被选中,它位于前一个选择'Test 100' 的位置,它被放置在视图的底部。
Here's a download link for the example workbook
我希望有人能够提出一个优雅的解决方案来纠正这种行为!
我已尝试在 RowSource 更新后以编程方式进行选择,但这没有效果。通过添加一个短暂的暂停并调用 DoEvents (在示例中注释),我已经能够在一定程度上完成这项工作,但是我发现它并不是一直都有效,我不想强制执行暂停,因为它使 ListBox 在我的原始项目中感觉反应迟钝。
Private selection As Integer
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
selection = ListBox1.ListIndex
Call update
End Sub
Private Sub UserForm_Initialize()
Call update
End Sub
Sub update()
With Sheets("Test")
ListBox1.RowSource = .Range("A2:A" & .Range("A99999").End(xlUp).Row - 1).Address(, , , True)
End With
'Sleep 300
'DoEvents
ListBox1.ListIndex = selection
End Sub
【问题讨论】:
-
为什么没有第二个列表框来显示与第一个列表框中所选行相关的项目子集?
-
@tigeravatar 最终的解决方案将适用于大约 10 个级别(可能更多),因此我需要 10 个单独的元素,使用这些元素可能对用户非常不友好。还有一部分功能是可以在不同区域扩展多个部分,以便可以以相同的形式比较它们。
标签: vba excel excel-2010 userform