ExcelVBA学习总结-多⾏多列数据展⽰
对于多⾏多列数据,基本使⽤Worksheet中的Range就可以处理了。但是在UserForm类型的应⽤中,也时常需要处理多⾏多列的数据。在UserForm中,显⽰和处理多列数据,通常可以有的选择有以下⼏种:DataGrid,ListView,ListBox。前⾯两类相当强⼤,但是也⽐较复杂,⼀般的简单应⽤中⽤不到。
DataGrid
DataGrid控件天⽣就是为了处理像Recordset这种数据⽽准备的,与它类似的数据控件(其它公司提供的数据控件)也还有其它⼏种,这⾥并不是重点,所以简单介绍⼀下。默认情况下,VBE中是看不到这个控件的,需要下载DATGDCHS.dll并放到C:\winnt\system32\下,然后运⾏命令“regsvr32 DATGDCHS.dll”注册。注册完成后,选择"Tools"菜单下的""菜单项,添加对应的控件到⼯具箱中就可以了。
DataGrid最重要的属性就是DataSource属性,就是设置表格的数据源。其它的也可以设置列的⼀些属性,这⾥就不详细介绍了。需要的同学请⾃备Google并⾃⾏搜索。
ListView
ListView也是处理这类型数据的⼀个选择,功能也⽐较强⼤,特别是可以设置图标,在很多时候还是很
适合使⽤的。下⾯的伪代码介绍了常⽤的属性和⽅法:
Dim currentItem As ListItem
'清除listview1中的标题
ListView1.ColumnHeaders.Clear
'清除listview1中的内容
ListView1.ListItems.Clear
With Sheets(1)
'添加列标题
ListView1.ColumnHeaders.Add 1, , .Cells(1, 1), ListView1.Width / 9
ListView1.ColumnHeaders.Add 2, , .Cells(1, 2), ListView1.Width / 9
'显⽰为报表视图
ListView1.View = lvwReport
'选取整⾏
ListView1.FullRowSelect = True
'复选框
ListView1.CheckBoxes = True
ListView1.BackColor = RGB(255, 199, 9)
For i = 5To .[A65536].End(xlUp).Row
'为listview1控件⾥⾯的⾏添加内容
Set currentItem = ListView1.ListItems.Add()
currentItem.Text = .Cells(i, 1) '为⾏标赋值
currentItem.SubItems(1) = .Cells(i, 2)
currentItem.SubItems(2) = .Cells(i, 3)
currentItem.SubItems(3) = .Cells(i, 4)
'为⾥⾯的第三列调整相应的字体⼤⼩及颜⾊
With currentItem.ListSubItems.Item(2)
If .Text < 2Then
.ForeColor = RGB(255, 0, 0)
Else
.Bold = True
.ForeColor = RGB(0, 0, 255)
End If
End With
Next i
End With
默认情况下,ListView不会出现在⼯具箱中,需要在“Tools”菜单中,点击“”菜单,打开对话框,勾选“Microsoft ListView Control,version 6.0”,然后在⼯具箱中就可以使⽤了。
经典的ListView双击列头排序的⽅法如下(使⽤了"^"与"v"去标⽰了排序的顺序,如果使⽤图⽚的话也是可以的):
Private Sub lstAllocatonList_ColumnClick(ByVal columnHeader lumnHeader)
SetSortMark columnHeader
With lstAllocatonList
If (columnHeader.Index - 1) = .SortKey Then
.SortOrder = (.SortOrder + 1) Mod2
Else
.Sorted = False
.SortOrder = 0
.SortKey = columnHeader.Index - 1
.Sorted = True
End If
End With
End Sub
Private Sub SetSortMark(columnHeader lumnHeader)
Dim i As Integer
Dim suffix As String
suffix = IIf(, 2) = " v", " ^", " v")
With lstAllocatonList.ColumnHeaders
For i = 1To .Count
.Item(i).text = Replace(.Item(i).text, " ^", "")
.Item(i).text = Replace(.Item(i).text, " v", "")
Next
End With
< = + suffix
End Sub
ListBox
虽然上⾯的两种选择很强⼤,但是设置也⽐较复杂,⽽且在很多时候,客户并不允许去下载相关的控件。⽽且在通常情况下,使⽤ListBox也可以达到相同的效果了。所以ListBox是最常⽤的⽅式,这⾥也重点介绍⼀下。使⽤ListBox常见的任务如下所⽰:
vba自学好学吗任务1:给ListBox绑定集合:
List - 代表所有⾏,可以直接赋给⼀个集合,也可以使⽤List(i,j)的形式给每个格赋值。
Column - 代表所有列,可以直接赋给⼀个集合,也可以使⽤Column (i,j)的形式给每个格赋值。
RowSource - 代表所有数据,可以直接赋给⼀个集合。
注意给List赋值,⾏列都会按正常排列,给Column赋值的时候,⾏列会颠倒过来,⼀般需要使⽤Application.Transpose⽅法配合。⽽RowSource需要⼀个字符串,通常可以使⽤Range的Address⽅法获得,当然直接给地址或者Range的Name也⾏。下⾯是常见的赋值⽅式,注意其中的格式:
'直接给RowSource赋值的形式
ListBox1.RowSource = "=Sheet1!A1:B5"
'直接使⽤数组的形式
Dim arr(1To4, 1To2) As String
arr(1, 1) = Cells(1, 1)
'省略赋值的过程...
arr(4, 2) = Cells(4, 2)
ListBox2.List = arr
ListBox3.Column = Application.WorksheetFunction.Transpose(arr)
'使⽤单元格的形式
Dim source As Variant
'source = Range("A1:B4")
source = [A1:B4]
ListBox4.List = source
任务2:编辑ListBox中的元素
AddItem - 添加⼀个新元素,参数是⼀个String,如果是多列的话,这个⽅法只会添加到第⼀列中,⼀般需要配合List(i,j)⽅法填充其他列的值。
RemoveItem - 移除⼀个元素,参数是⼀个Index值(从0开始)。
Clear - 清空ListBox。
注意使⽤List(i,j),Column(j,i)的形式也可以获得或设置给每⼀个格的值,注意⾏列的Index都是从0开始的。例如下⾯是对⼀个2列的列表操作:
'添加⼀⾏
ListBox1.AddItem TextBox1.Text
ListBox1.List(ListBox1.ListCount - 1, 1) = TextBox2.Text
'删除选中⾏
If ListBox1.ListIndex <> -1 Then
ListBox1.RemoveItem ListBox1.ListIndex
End If
'清空ListBox
ListBox1.Clear
任务3:获取ListBox中⾏列的总数
ListCount - ⾏总数,遍历的时候很有⽤。
ColumnCount - 获取或设置列的数⽬。
需要使⽤多列的时候,⼀般需要先设置ColumnCount为期望的数⽬。
任务4:获取ListBox中当前选中的⾏列
ListIndex - 当前选中的⾏的Index值。如果是可以多选的话,这个值有可能不太可靠,⼀般采⽤Selected遍历整个集合来确定选中的⾏。Value - 当前选中的⾏的值,如果是多列的话,只返回第⼀列的值。
Selected - 判断某⾏是否被选中。
任务5:设置ListBox的表头
这个问题,常见的只有⼀种解法,那就是使⽤RowSource绑定集合。
ListBox1.RowSource = Range("A2:B4").Address
这个时候A2上⾯⼀⾏的内容会作为ListBox的表头使⽤。
基本使⽤上⾯这些属性就可以达到显⽰和处理多⾏多列数据的⽬的了。其它ListBox的属性可以参看相关资料。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论