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