VBA学习笔记59-4: listview控件

VBA学习笔记59-4: listview控件

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


七、设置合计行

因为是销售数据,如果有汇总合计金额,看起来会比较清晰,这就需要在listview根据筛选的数据添加合计行,为了让合计数醒目,同时把合计行设置为红色粗体。

Private Sub ComboBox1_Change()
Dim ITM As ListItem
Dim ITM1 As ListItem
Dim 销量合计, 销售金额合计
Dim i%
ListView1.ColumnHeaders.Clear
ListView1.ListItems.Clear
ListView1.ColumnHeaders.Add 1, , "省份", ListView1.Width / 5
ListView1.ColumnHeaders.Add 2, , "客户", ListView1.Width / 4, lvwColumnCenter
ListView1.ColumnHeaders.Add 3, , "销售数量", ListView1.Width / 4, lvwColumnRight
ListView1.ColumnHeaders.Add 4, , "销售金额", ListView1.Width / 4, lvwColumnRight
ListView1.View = lvwReport
ListView1.Gridlines = True
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)
        ITM.SubItems(2) = Format(Cells(i, 3), "#,###.00")
        ITM.SubItems(3) = Format(Cells(i, 4), "#,###.00")
        销量合计 = 销量合计 + Cells(i, 3)
        销售金额合计 = 销售金额合计 + Cells(i, 4)
    End If
Next i
Set ITM1 = ListView1.ListItems.Add()
ITM1.Text = "合计"
'第二列是客户名称,不用合计,所以直接写第三列,subiitem(2)
ITM1.SubItems(2) = Format(销量合计, "#,###.00") '设置销量合计的数据格式然后输出
ITM1.SubItems(3) = Format(销售金额合计, "#,###.00") '设置销售金额合计的数据格式然后输出
ITM1.ForeColor = RGB(255, 0, 0) '设置字体颜色为红色
ITM1.Bold = True '设置字体为粗体
For X = 2 To ListView1.ColumnHeaders.Count - 1
    'SubItems是数组,所以刚刚只设置了第一列,后面的要对ListSubItems(对象)设置,所以有字体属性
    ITM1.ListSubItems(X).ForeColor = RGB(255, 0, 0)
    ITM1.ListSubItems(X).Bold = True
Next X
End Sub

关于设置字体格式,可以使用以下属性:

设置行标的字符格式:ListItems的Forecolor属性,Bold属性

设置表格内容和的字符格式:ListSubItems的Forecole属性,Bold属性

运行演示:


八、删除选取行

在Listview直接删除不需要的行(但源数据不变)。

我们单讲一个知识点哈,就不整这么复杂了,其实为了更实用可以和上面的例子融合的,比如,删除选取行再输入数据到工作表,或在Listview删除后,在源数据也对应删除。

如果只需要删除一行:

listview1.ListItems.Remove listview1.SelectedItem.Index   

最后的index可以让光标返回选取的位置。

如果对listview有设置可以选取多行MultiSelect的话,

ListView1.MultiSelect = True

那么删除多行需要使用循环语句,一般用倒循环,不然容易出错:

Private Sub CommandButton1_Click()
Dim i%, list
For i = Me.ListView1.ListItems.Count To 1 Step -1 '删除行一般用倒循环
    If Me.ListView1.ListItems(i).Selected Then  'selected判断某行是否被选中了
        Me.ListView1.ListItems.Remove i
    End If
Next i