前面我们分享了使用TreeView控件来输入科目的方法,(Excel VBA 选择输入/TreeView控件、补充:Excel VBA 选择输入/TreeView控件/在工作表中如何顺利使用TreeView控件?),今天,我们分享VBA另一个非常重要的控件,那就是ListView,用来分析和展示数据:
首先说明一下,我们准备做一个“科目汇总表",但今天由于时间与篇幅的关系,我们只做了一点点,只是搭了一个框架,科目汇总还没有做,展示的是明细数据,请不要感到奇怪。
那么,今天的主题应该叫“ListView展示明细账数据"。下面我们来分析一下过程。
第一步,先在明细账中插入一个命令按钮,Name改为CmdSum,Caption改为“科目汇总表",代码后面再加。
第二步,进入VBA代码编辑器,插入用户窗体,改名为Usf_Sum
第三步,在用户窗体上添加“标签”并改名,调整大小
第四步,在用户窗体上添加“ListView"控件,并改名,调整大小
第五步,双击用户窗体,在右上事件窗口,选择“Initialize“,
输入代码:
Private Sub UserForm_Initialize()
Dim arrSum(), arrDetail(), TbTitle()
Dim iCol As Integer
Dim iRow As Integer
Dim DicAccount
Dim LvItem As ListItem
On Error Resume Next
iCol = Sheets("明细账").UsedRange.Columns.count
iRow = Sheets("明细账").UsedRange.Rows.count
arrDetail = Sheets("明细账").Range(Cells(2, 1), Cells(iRow, iCol)).Value
TbTitle = Sheets("明细账").Range(Cells(1, 1), Cells(1, iCol)).Value
With Me.LvDetail
.View = lvwReport 'listview控件的显示外观
.Gridlines = True '是否有表格线,True有表格线
'.Sorted = True '是否排序
'.CheckBoxes = True '是否显示勾选框
.LabelEdit = lvwManual
.FullRowSelect = True '是否整行选跳
.ForeColor = vbBlue '字体颜色
'添加表头
For i = 1 To UBound(TbTitle, 2)
If TbTitle(1, i) <> "" Then
If i = 1 Then
.ColumnHeaders.Add , , TbTitle(1, i), 80
Else
.ColumnHeaders.Add , , TbTitle(1, i), 80 ', lvwColumnCenter
End If
End If
Next
'添加数据
For i = 1 To iRow - 1
If arrDetail(i, 1) <> "" Then
Set LvItem = Me.LvDetail.ListItems.Add
LvItem.Text = arrDetail(i, 1)
For j = 1 To iCol - 1
LvItem.SubItems(j) = arrDetail(i, j + 1)
Next
End If
Next
End With
End Sub
在设计模式下双击CmdSum,输入代码:
Private Sub CmdSum_Click()
Usf_Sum.Show 0
End Sub
简单解释一下代码:
这段代码用于在用户窗体初始化时将 Excel 工作表中的数据填充到列表视图控件中。
-
Dim
语句声明了几个变量,包括存储工作表数据的数组arrSum()
、arrDetail()
和TbTitle()
,表示列和行的数量的变量iCol
和iRow
,一个字典变量DicAccount
和一个列表项变量LvItem
。 -
On Error Resume Next
语句用于在运行时忽略错误。 -
使用
UsedRange
属性获取工作表中使用的范围,即非空单元格所在的区域,并将其列数和行数分别存储在iCol
和iRow
变量中。 -
将
arrDetail
数组初始化为包含从单元格A2
到iRow
和iCol
的值。arrDetail
数组将用于填充列表视图控件。 -
将
TbTitle
数组初始化为包含从单元格A1
到iCol
的值。TbTitle
数组将用于填充列表视图控件的列标题。 -
使用
With
语句引用名为Me.LvDetail
的列表视图控件,并设置其外观和属性。 -
使用
For
循环添加列表视图控件的列标题。如果列标题不为空,则使用ColumnHeaders.Add
方法将其添加到列表视图控件中,并设置列的宽度为 80。 -
使用
For
循环添加列表视图控件的数据。如果第一列不为空,则创建一个新的列表项并将第一列的值设置为列表项的文本,将其他列的值设置为子项。
上面是AI的解释,请原谅我的懒惰,算了,还是啰嗦几句吧:
.View = lvwReport:应该叫报表视图,就跟我们的excel表格一样,既然这么说,那么一定还有其他视图,由于我不常用到,所以就不浪费口舌去说了,有兴趣的同学自己摸索吧。
添加表头:可以按一个个具体的名称去添加,它有个文本对齐的属性lvwColumnCenter,lvwColumnLeft,lvwColumnRight,看我们的if过程,两条分支语句是一样的,这里暂时留个活口,待有时间再慢慢设置,可以根据不同的表头,通过if语句来分别设置它的宽度,对齐方式等。
添加数据:通过listitems.add的方法添加一条记录,它第一列叫Text,其他列叫subitem,它有个索引值从1开始,我们通过索引值来给它赋值。
On Error Resume Next:容错语句,这里不得不用它了,因为ListView不接受Null值,所以如果有单元格是空的,就会报错。要么把所有Null值都给它替换成别的什么字符,感觉没有那个必要。
今天我们就分享到这里,接下来我会把它做成科目汇总表,再完善一下其他功能。
题外话,我们这里分享的是方法、思路,是为了展示Excel的一些功能,具体到某种实际需求来说,并不一定是最优方案。
比如今天我们说要做“科目汇总表“,我只是借”科目汇总表“这个由头来解释、展示一下ListView的功能,实际上,如果要做一个比较象样的财务软件,我们应该把明细数据放到另外一个地方,比如Access数据库,至少我们使用另外一个excel文件来存放数据,再用一个excel文件来录入、展示数据。这样能相对保证数据的安全性,防止误操作等。扯远了,就此打住(实际上我已经完成了一个相对完美的财务管理系统,就是采用Excel VBA+Access做的,以后有机会慢慢分享给大家!)
技术交流,软件开发,欢迎微信沟通: