
本文于2023年4月17日首发于本人同名公众号:Excel活学活用,更多文章敬请关注!
前面我们分享了使用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 WithEnd Sub
在设计模式下双击CmdSum,输入代码:
Private Sub CmdSum_Click() Usf_Sum.Show 0End 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开始,我们通过索引值来给它赋值。
OnError Resume Next:容错语句,这里不得不用它了,因为ListView不接受Null值,所以如果有单元格是空的,就会报错。要么把所有Null值都给它替换成别的什么字符,感觉没有那个必要。
今天我们就分享到这里,接下来我会把它做成科目汇总表,再完善一下其他功能。
题外话,我们这里分享的是方法、思路,是为了展示Excel的一些功能,具体到某种实际需求来说,并不一定是最优方案。
比如今天我们说要做“科目汇总表“,我只是借”科目汇总表“这个由头来解释、展示一下ListView的功能,实际上,如果要做一个比较象样的财务软件,我们应该把明细数据放到另外一个地方,比如Access数据库,至少我们使用另外一个excel文件来存放数据,再用一个excel文件来录入、展示数据。这样能相对保证数据的安全性,防止误操作等。扯远了,就此打住(实际上我已经完成了一个相对完美的财务管理系统,就是采用Excel VBA+Access做的,以后有机会慢慢分享给大家!)。我们下期再会。
本文使用 文章同步助手 同步,本文于2023年4月17日首发于本人同名公众号:Excel活学活用,更多文章敬请关注!