VBA ListView控件使用详解
一、VBALISTVIEW控件
VBALISTVIEW控件是VBA开发中输出列表样式最方便的窗体,与常规列表不同,它把自己当做表格处理,类似于Excel的表格,可以很方便地添加、删除、修改、查找自己所需的数据。
二、VBALISTVIEW删除源数据
删除VBALISTVIEW控件中的源数据非常简单。根据VBALISTVIEW控件的开发方式,只需要将源数据从数据表中删除,就可以在VBALISTVIEW中也实现删除效果。
Private Sub btnDelete_Click()
Dim iRow As Integer
iRow = ListView1.ListItems.Item(ListView1.SelectedItem.Index).Index
'删除数据
Sheet1.Cells(iRow, 1).EntireRow.Delete
'删除项
ListView1.ListItems.Remove ListView1.SelectedItem.Index
End Sub
三、VBALISTVIEW修改数据
修改VBALISTVIEW控件中的数据也非常简单。修改数据需要选定某项,然后将该项对应的数据表中的值更新即可。同样的,可以在VBALISTVIEW中实现修改效果。
Private Sub btnEdit_Click()
Dim iRow As Integer
iRow = ListView1.ListItems.Item(ListView1.SelectedItem.Index).Index
'修改值
Sheet1.Cells(iRow, 1) = txtValue.Value
'更新项
ListView1.ListItems.Item(ListView1.SelectedItem.Index).SubItems(1) = txtValue.Value
End Sub
四、VBALISTVIEW分页查询
VBALISTVIEW控件支持分页功能,可以根据需要自定义每页数据行数。在这里,我们是通过把所有数据分割到不同的框架中,然后根据选择的框架来动态加载不同的数据实现的分页控制。
Private Sub UserForm_Initialize()
'设置VBALISTVIEW中的数据源
Set lv = ListView1
'设置VBALISTVIEW中的字段
With lv.ColumnHeaders
.Add , "Key", "ID"
.Add , "Value", "Value"
End With
'设置分页
nRecPerPage = 10
nTotalRecords = Sheet1.Range("A2").End(xlDown).Row - 1
nPages = WorksheetFunction.RoundUp(nTotalRecords / nRecPerPage, 0)
TotalPages.Caption = nPages
For i = 1 To nPages
frmPages.AddItem "Page " & i
Next i
End Sub
Private Sub frmPages_Click()
'每次点击框架更新VBALISTVIEW中的数据
lv.ListItems.Clear
For j = 1 To nRecPerPage
If ((frmPages.Value - 1) * nRecPerPage + j) > nTotalRecords Then Exit For
Set li = lv.ListItems.Add(, , Sheet1.Cells((frmPages.Value - 1) * nRecPerPage + j + 1, 1))
li.SubItems(1) = Sheet1.Cells((frmPages.Value - 1) * nRecPerPage + j + 1, 2)
Next j
End Sub
五、VBALISTVIEW查询窗体
VBA中ListView控件还支持查询窗体功能,可以在窗体中输入关键字,然后在VBALISTVIEW中快速检索符合要求的数据项,并且可以根据需要频繁地更改查询条件。
Private Sub btnFilter_Click()
Keyword = txtKeyword.Value
'检查数据是否为空
If Len(Trim(Keyword)) = 0 Then
MsgBox ("Please enter a keyword to search.")
Exit Sub
End If
'清空VBALISTVIEW中的项
lv.ListItems.Clear
For i = 2 To Sheet1.Range("A2").End(xlDown).Row
If InStr(Sheet1.Cells(i, 2), Keyword) > 0 Then
Set li = lv.ListItems.Add(, , Sheet1.Cells(i, 1))
li.SubItems(1) = Sheet1.Cells(i, 2)
End If
Next i
End Sub
六、ListView添加数据
VBALISTVIEW控件支持添加行数据功能。在列表中添加数据是很简单的,直接在数据表的末尾添加一行,在VBALISTVIEW中插入即可。以下示例演示如何手动添加数据到VBALISTVIEW控件中。
Private Sub btnAdd_Click()
Dim li As ListItem
Set li = lv.ListItems.Add(, , Sheet1.Range("A2").End(xlDown).Row + 1)
li.SubItems(1) = txtValue.Value
End Sub
七、VBA ListView允许编辑
在VBA中,也可以定义VBALISTVIEW控件,使其支持编辑功能。通过在控件的属性设置中设置编辑为True,可以实现双击列表项进行编辑的效果。
Private Sub lv_ItemClick(ByVal Item As MSComctlLib.ListItem)
'双击项进行编辑
If lv.SelectedItem Is Nothing Then Exit Sub
lv.SelectedItem.Editable = True
End Sub
Private Sub lv_Scroll(ByVal ActionX As Long, ByVal ActionY As Long)
If lv.SelectedItem Is Nothing Then Exit Sub
lv.SelectedItem.Editable = False
End Sub
八、ListView显示数据库数据
VBA中ListView控件可以直接显示数据库中的数据。以下示例中演示了如何通过ADO连接到Access数据库,并显示其中一个表格中的数据。
'创建连接字符串
Dim connString As String
connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\Test.accdb;"
'创建连接对象
Dim conn As New ADODB.Connection
conn.Open connString
'创建Recordset对象
Dim rs As New ADODB.Recordset
rs.Open "SELECT * FROM MyTable", conn
'将数据绑定到VBALISTVIEW控件上
While Not rs.EOF
Set li = lv.ListItems.Add(, , rs.Fields("ID"))
li.SubItems(1) = rs.Fields("Value")
rs.MoveNext
Wend
'关闭连接和记录集
rs.Close
conn.Close
九、VBA中ListView获取数据
通过VBALISTVIEW控件也能够获取到对应行或列中的数据。在VBALISTVIEW的事件函数中进行操作即可。
Private Sub lv_ItemClick(ByVal Item As MSComctlLib.ListItem)
'获取第一列的值
MsgBox "Value in column 1: " & Item.Text
'获取第二列的值
MsgBox "Value in column 2: " & Item.ListSubItems(1).Text
End Sub
以上就是VBA中ListView控件的使用详解。无论是在对表格操作或对数据进行筛选,VBA中ListView控件都为我们提供了很好的解决方案。