您的位置:

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