VBA中ListView控件的使用详解

发布时间:2023-05-18

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控件都为我们提供了很好的解决方案。