学习资源:《Excel VBA从入门到进阶》第59集 by兰色幻想
四、筛选数据
筛选数据只需要配合循环和判断 , 把符合条件的添加到listview控件中。
例:把下表的销售数据添加到listview里显示,并设置为能按省份展示数据。
弟弟
①初始化用户窗体的代码:
Private Sub UserForm_Initialize()
Dim i, d As Object, arr
Set d = CreateObject("scripting.dictionary")
arr = Range("a2:a50")
For i = 1 To UBound(arr)
If Not d.exists(arr(i, 1)) Then d(arr(i, 1)) = ""
Next i
ComboBox1.list = d.keys
ListView1.FullRowSelect = True '设置可以整行选取
ListView1.MultiSelect = True '设置可以多行选取
ListView1.ColumnHeaders.Add 1, , "省份", ListView1.Width / 4
ListView1.ColumnHeaders.Add 2, , "客户", ListView1.Width / 4, lvwColumnCenter
ListView1.ColumnHeaders.Add 3, , "销售数量", ListView1.Width / 4, lvwColumnCenter
ListView1.ColumnHeaders.Add 4, , "销售金额", ListView1.Width / 4, lvwColumnCenter
ListView1.View = lvwReport
ListView1.Gridlines = True
End Sub
②控件数值变化事件的代码(选取不同省份引起变化):
Private Sub ComboBox1_Change()
Dim ITM As ListItem
Dim i%
ListView1.ListItems.Clear '清除所有行(除列标题
For i = 2 To [A65536].End(xlUp).Row
If Cells(i, 1) = ComboBox1.Text Then
Set ITM = ListView1.ListItems.Add()
ITM.Text = Cells(i, 1)
ITM.SubItems(1) = Cells(i, 2).Value
ITM.SubItems(2) = Cells(i, 3)
ITM.SubItems(3) = Cells(i, 4)
End If
Next i
End Sub
代码讲解:
- 清除listview数据。
因为需要按省份展示数据,所以选中别的省份时要把原数据删除,再展示新的数据。但不需要把表格标题行删除,所以上面用的是ListItems.Clear,如果连列标题都要删除的话就用ColumnHeaders.Clear。
'ListView1.ColumnHeaders.Clear '清除所有行(包括列标题
2. 导入数据的部分之前也讲过,只不过这里需要判断下省份,所以多加了一个if语句。就不多说了。
If Cells(i, 1) = ComboBox1.Text Then
3. 复合框部分用了数组+字典用储存省份数据(提取不重复值)
Set d = CreateObject("scripting.dictionary")
arr = Range("a2:a50")
For i = 1 To UBound(arr) '如果字典中没有就储存进来
If Not d.exists(arr(i, 1)) Then d(arr(i, 1)) = ""
Next i
4. 设置列表数据可以多选
ListView1.MultiSelect = True '设置可以多行选取
运行演示:
五、控件数据输入到工作表
获取控件数据然后输入到工作表中。
例:接上面的例子,查看了单独省份的数据,想把单独省份的数据输入到空白工作表中。
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Dim i, j
On Error Resume Next'跳过错误
Range("A:D").ClearContents
For i = 1 To ListView1.ColumnHeaders.Count '设置列方向的循环
Cells(1, i) = ListView1.ColumnHeaders(i).Text
For j = 1 To ListView1.ListItems.Count '设置行方向的循环
If i = 1 Then
'第一列设置的是Text,在每一行都是只有一个Text。
Cells(j + 1, 1) = ListView1.ListItems(j).Text
Else
'但后面几列都是Listitems,要区分,所以写成Subitems来区分。(在59-1笔记有写)
Cells(j + 1, i) = ListView1.ListItems(j).SubItems(i - 1)
End If
Next j
Next i
Application.ScreenUpdating = True
End Sub
运行演示:
六、选取的行输入到工作表
只需要其中一行数据的输入的话,就用到Listview的SelectedItem属性。
依旧接上例,筛选出需要的省份,选中需要的数据,双击它让数据登记在表格的后面。
Private Sub ListView1_DblClick() '双击事件
Dim X As Long
X = [A65536].End(xlUp).Row + 1
Cells(X, 1) = ListView1.SelectedItem.Text '正在选取的行的行标
Cells(X, 2) = ListView1.SelectedItem.SubItems(1)
Cells(X, 3) = ListView1.SelectedItem.SubItems(2)
Cells(X, 4) = ListView1.SelectedItem.SubItems(3)
End Sub
运行演示: