listview qt 选中值_VBA学习笔记59-3: listview控件

3f883227bc24f9a853814f499e1c5872.png

学习资源:《Excel VBA从入门到进阶》第59集 by兰色幻想


四、筛选数据

筛选数据只需要配合循环和判断 , 把符合条件的添加到listview控件中。

例:把下表的销售数据添加到listview里显示,并设置为能按省份展示数据。

弟弟

565a7fe0b7b3e0227924e1bb45fbc283.png

①初始化用户窗体的代码:

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

代码讲解:

  1. 清除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 '设置可以多行选取

运行演示:

ae1531907dd3a1c5c86f4e257511745a.gif

五、控件数据输入到工作表

获取控件数据然后输入到工作表中。

例:接上面的例子,查看了单独省份的数据,想把单独省份的数据输入到空白工作表中。

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

运行演示:

18657b9355136e16b0dd7c3b0a35c037.gif

六、选取的行输入到工作表

只需要其中一行数据的输入的话,就用到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

运行演示:

8e8b9647728ec199f71f68ec498fae26.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值