對于多行多列數(shù)據(jù),基本使用Worksheet中的Range就可以處理了,。但是在UserForm類型的應(yīng)用中,,也時(shí)常需要處理多行多列的數(shù)據(jù)。在UserForm中,,顯示和處理多列數(shù)據(jù),,通常可以有的選擇有以下幾種:DataGrid,,ListView,,ListBox。前面兩類相當(dāng)強(qiáng)大,,但是也比較復(fù)雜,,一般的簡單應(yīng)用中用不到。 DataGrid DataGrid控件天生就是為了處理像Recordset這種數(shù)據(jù)而準(zhǔn)備的,,與它類似的數(shù)據(jù)控件(其它公司提供的數(shù)據(jù)控件)也還有其它幾種,,這里并不是重點(diǎn),所以簡單介紹一下,。默認(rèn)情況下,,VBE中是看不到這個(gè)控件的,需要下載DATGDCHS.dll并放到C:\winnt\system32\下,,然后運(yùn)行命令“regsvr32 DATGDCHS.dll”注冊,。注冊完成后,選擇'Tools'菜單下的'Additional Controls...'菜單項(xiàng),,添加對應(yīng)的控件到工具箱中就可以了,。 DataGrid最重要的屬性就是DataSource屬性,就是設(shè)置表格的數(shù)據(jù)源。其它的也可以設(shè)置列的一些屬性,,這里就不詳細(xì)介紹了,。需要的同學(xué)請自備Google并自行搜索。 ListView ListView也是處理這類型數(shù)據(jù)的一個(gè)選擇,,功能也比較強(qiáng)大,,特別是可以設(shè)置圖標(biāo),在很多時(shí)候還是很適合使用的,。下面的偽代碼介紹了常用的屬性和方法: Dim currentItem As ListItem '清除listview1中的標(biāo)題 ListView1.ColumnHeaders.Clear '清除listview1中的內(nèi)容 ListView1.ListItems.Clear With Sheets(1) '添加列標(biāo)題 ListView1.ColumnHeaders.Add 1, , .Cells(1, 1), ListView1.Width / 9 ListView1.ColumnHeaders.Add 2, , .Cells(1, 2), ListView1.Width / 9 '顯示為報(bào)表視圖 ListView1.View = lvwReport '選取整行 ListView1.FullRowSelect = True '復(fù)選框 ListView1.CheckBoxes = True ListView1.BackColor = RGB(255, 199, 9) For i = 5 To .[A65536].End(xlUp).Row '為listview1控件里面的行添加內(nèi)容 Set currentItem = ListView1.ListItems.Add() currentItem.Text = .Cells(i, 1) '為行標(biāo)賦值 currentItem.SubItems(1) = .Cells(i, 2) currentItem.SubItems(2) = .Cells(i, 3) currentItem.SubItems(3) = .Cells(i, 4) '為里面的第三列調(diào)整相應(yīng)的字體大小及顏色 With currentItem.ListSubItems.Item(2) If .Text < 2 Then .ForeColor = RGB(255, 0, 0) Else .Bold = True .ForeColor = RGB(0, 0, 255) End If End With Next i End With 默認(rèn)情況下,,ListView不會(huì)出現(xiàn)在工具箱中,需要在“Tools”菜單中,,點(diǎn)擊“Additional Controls...”菜單,,打開對話框,勾選“Microsoft ListView Control,,version 6.0”,,然后在工具箱中就可以使用了。 經(jīng)典的ListView雙擊列頭排序的方法如下(使用了'^'與'v'去標(biāo)示了排序的順序,,如果使用圖片的話也是可以的): Private Sub lstAllocatonList_ColumnClick(ByVal columnHeader As MSComctlLib.columnHeader) SetSortMark columnHeader With lstAllocatonList If (columnHeader.Index - 1) = .SortKey Then .SortOrder = (.SortOrder + 1) Mod 2 Else .Sorted = False .SortOrder = 0 .SortKey = columnHeader.Index - 1 .Sorted = True End If End With End Sub Private Sub SetSortMark(columnHeader As MSComctlLib.columnHeader) Dim i As Integer Dim suffix As String suffix = IIf(Right(columnHeader.text, 2) = ' v', ' ^', ' v') With lstAllocatonList.ColumnHeaders For i = 1 To .Count .Item(i).text = Replace(.Item(i).text, ' ^', '') .Item(i).text = Replace(.Item(i).text, ' v', '') Next End With columnHeader.text = columnHeader.text + suffix End Sub ListBox 雖然上面的兩種選擇很強(qiáng)大,,但是設(shè)置也比較復(fù)雜,而且在很多時(shí)候,,客戶并不允許去下載相關(guān)的控件,。而且在通常情況下,使用ListBox也可以達(dá)到相同的效果了,。所以ListBox是最常用的方式,,這里也重點(diǎn)介紹一下。使用ListBox常見的任務(wù)如下所示: 任務(wù)1:給ListBox綁定集合: List - 代表所有行,,可以直接賦給一個(gè)集合,,也可以使用List(i,j)的形式給每個(gè)格賦值。 Column - 代表所有列,,可以直接賦給一個(gè)集合,,也可以使用Column (i,j)的形式給每個(gè)格賦值。 RowSource - 代表所有數(shù)據(jù),,可以直接賦給一個(gè)集合,。 注意給List賦值,行列都會(huì)按正常排列,,給Column賦值的時(shí)候,,行列會(huì)顛倒過來,一般需要使用Application.Transpose方法配合,。而RowSource需要一個(gè)字符串,,通??梢允褂肦ange的Address方法獲得,當(dāng)然直接給地址或者Range的Name也行,。下面是常見的賦值方式,,注意其中的格式: '直接給RowSource賦值的形式 ListBox1.RowSource = '=Sheet1!A1:B5' '直接使用數(shù)組的形式 Dim arr(1 To 4, 1 To 2) 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 任務(wù)2:編輯ListBox中的元素 AddItem - 添加一個(gè)新元素,參數(shù)是一個(gè)String,,如果是多列的話,,這個(gè)方法只會(huì)添加到第一列中,一般需要配合List(i,j)方法填充其他列的值,。 RemoveItem - 移除一個(gè)元素,,參數(shù)是一個(gè)Index值(從0開始),。 Clear - 清空ListBox,。 注意使用List(i,j),Column(j,i)的形式也可以獲得或設(shè)置給每一個(gè)格的值,,注意行列的Index都是從0開始的,。例如下面是對一個(gè)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 任務(wù)3:獲取ListBox中行列的總數(shù) ListCount - 行總數(shù),遍歷的時(shí)候很有用,。 ColumnCount - 獲取或設(shè)置列的數(shù)目,。 需要使用多列的時(shí)候,一般需要先設(shè)置ColumnCount為期望的數(shù)目,。 任務(wù)4:獲取ListBox中當(dāng)前選中的行列 ListIndex - 當(dāng)前選中的行的Index值,。如果是可以多選的話,這個(gè)值有可能不太可靠,,一般采用Selected遍歷整個(gè)集合來確定選中的行,。 Value - 當(dāng)前選中的行的值,如果是多列的話,,只返回第一列的值,。 Selected - 判斷某行是否被選中。 任務(wù)5:設(shè)置ListBox的表頭 這個(gè)問題,,常見的只有一種解法,,那就是使用RowSource綁定集合。 這個(gè)時(shí)候A2上面一行的內(nèi)容會(huì)作為ListBox的表頭使用,。 基本使用上面這些屬性就可以達(dá)到顯示和處理多行多列數(shù)據(jù)的目的了,。 其它ListBox的屬性可以參看相關(guān)資料。 |
|