【发布时间】:2019-08-16 23:20:49
【问题描述】:
我有一个带有多列列表框和组合框的用户窗体。 ListBox 默认显示完整的数据集。 ComboBox 包含来自 ListBox 中某一列的值。从 ComboBox 中选择一个值会过滤 ListBox 数据。
当 ListBox 发生这种变化时,我想 Debug.Print "A message..." 但没有成功。
我没有收到任何错误消息。调试器甚至不会单步执行 ListBox_Change 事件过程。我在事件过程中只有上面的 Debug.Print... 行。
非常感谢您对解决方案/线索的帮助。
问题已更新:代码如下所示:
Dim arrAllData() As Variant
Private Sub UserForm_Initialize()
Call CentreForm(Me)
arrAllData = Range("tblData") 'Excel table of 11 columns
Me.lbxData.List = arrAllData
Set collProjName = UniqueItemsFromRanger(Range("tblData").Columns(2))
For i = 1 To collProjName.Count
Me.cboProjName.AddItem collProjName(i)
Next i
End Sub
Private Sub cboProjName_Change()
Dim NewList() As Variant, NewListSingleRow(0 To 0, 0 To 10) As Variant
Dim colNbr As Integer
Erase NewList
If Me.cboProjName.Value <> "" Then
With Me.lbxData
NewList = .List
NewList = FilterData(NewList, Me.cboProjName.Value, 2)
If UBound(NewList, 2) > 0 Then
.List = Application.Transpose(NewList)
Else
For i = 0 To UBound(NewList, 1)
NewListSingleRow(0, i) = NewList(i, 0)
.List = NewListSingleRow
Next i
End If
End With
End If
End Sub
Private Sub lbxData_Change()
Debug.Print "Test Message..."
End Sub
Function UniqueItemsFromRanger(Rng As Range) As Collection
Dim coll As New Collection, i As Long
On Error Resume Next
For i = 1 To Rng.Rows.Count
coll.Add Item:=Rng.Cells(i, 1), Key:=CStr(Rng.Cells(i, 1))
Next i
Set UniqueItemsFromRanger = coll
End Function
Function FilterData(arrData() As Variant, FilterFor As String, ColumnToFilter
As Long) As Variant
Dim arrDataFiltered() As Variant
Dim rowCount As Long, colCount As Long, filteredCount As Long
rowCount = UBound(arrData, 1)
colCount = UBound(arrData, 2)
filteredCount = 0
For i = 0 To rowCount
If arrData(i, ColumnToFilter - 1) = FilterFor Then
ReDim Preserve arrDataFiltered(0 To colCount, 0 To filteredCount)
For j = 0 To colCount
arrDataFiltered(j, filteredCount) = arrData(i, j)
Next j
filteredCount = filteredCount + 1
End If
Next i
FilterData = arrDataFiltered
End Function
【问题讨论】:
-
你好。请发布您尝试过的代码。我建议阅读Minimal Reprodudible Example 和How to Ask。
-
ListBox1_Change仅在列表框中选择项目时触发。不是在清除 LB 或添加项目时。 -
如果您是更改列表框的人,则无需处理
Change事件...将您的Debug.Print放入执行过滤的代码中。 -
我会删除
On Error Resume Next,直到您知道出现的错误(如果有)。我会听从@MathieuGuindon 对此的建议。 -
FWIW
Erase NewList是多余的,数组是本地的并且已经未初始化...
标签: excel vba listbox userform