如果组合框和列表框是多列的话,还需要设置控件的其他属性,如下面的代码所示。
#001 Private Sub UserForm_Initialize()
#002 Dim iRow As Integer
#003 Dim Arr As Variant
#004 iRow = Sheet1.Range("A65536").End(xlUp).Row
#005 Arr = Sheet1.Range("A1:G" & iRow)
#006 With Me.ListBox1
#007 .ColumnCount = 7
#008 .ColumnWidths = "45,45,45,45,45,30,45"
#009 .BoundColumn = 1
#010 .Column = Application.WorksheetFunction.Transpose(Arr)
#011 End With
#012 End Sub
代码解析:
在窗体初始化时为多列列表框添加列表项。
第4行代码,设置列表框显示的列数。ColumnCount 属性指定列表框或组合框的显示列数,语法如下:
object.ColumnCount [= Long]
参数object是必需的,一个有效的对象。
参数Long是可选的,指定需显示的列数。
如果将ColumnCount设为 -1,将显示所有列。
第8行代码,设置列表框各列的宽度。ColumnWidths 属性指定多列的组合框或列表框中的各列的宽度,语法如下:
object.ColumnWidths [= String]
参数object是必需的,一个有效的对象。
参数String是可选的,以磅为单位设置列的宽度。
如将ColumnWidths 属性设为 -1 或空,则将控件宽度等分,给予列表中的各列。设为 0 则隐藏该列,大于 0 的数值则是该列的精确宽度值。若要指定另一种不同的度量单位,设置时必须包括该度量单位。
第9行代码,设置多列列表框中的第一列为数据的来源。BoundColumn 属性标识多列组合框或列表框中的数据的来源,语法如下:
object.BoundColumn [= Variant]
参数object是必需的,一个有效的对象。
参数Variant是可选的,标识选择 BoundColumn 属性值的方法,设置值如下所示:
值 说明
0 将 ListIndex 属性的值赋予控件。
1 或者大于 1 将指定列中的值赋予控件。当采用此属性时,列从 1 开始计数(默认值)。
当选择了多列列表框的一行时,BoundColumn 属性标识出将该行的哪一条目作为控件的值存储。BoundColumn属性设为 0,将所选行的行号赋予控件,作为控件的值。如果BoundColumn属性设为1 或者大于 1,则将指定列中的值赋予控件。
第10行代码,设置多列列表框中列表的来源。在设置列表来源可以使用Column属性指定列表框中的一个或多个条目,Column属性语法如下:
object.Column( column, row ) [= Variant]
参数object是必需的,一个有效对象。
参数column是可选的,取值范围为0到总列数减1之间的数值。
参数row是可选的,取值范围为0到总行数减1之间的数值。
参数Variant是可选的,指定欲加载到列表框的一个值、一列值或一个二维数组。
注意 当从一个二维数组中复制数据时,使用Column属性将转置控件中数组的内容,所以在加载时需使用Transpose函数对数组进行转置。
在把多列列表框的写入工作表中时,只能把BoundColumn属性所指定列中的值写入工作表中,不能把选中的整行内容写入到工作表中。如果需要把多列列表框中选中行的整行内容写入工作表中,可以使用循环语句将列表框各列的写入工作表,如下面的代码所示。
#001 Private Sub UserForm_Initialize()
#002 Dim iRow As Integer
#003 iRow = Sheet2.Range("A65536").End(xlUp).Row
#004 With Me.ListBox1
#005 .ColumnCount = 7
#006 .ColumnWidths = "45,45,45,45,45,30,45"
#007 .BoundColumn = 1
#008 .ColumnHeads = True
#009 .RowSource = Sheet2.Range("A2:G" & iRow).Address(External:=True)
#010 End With
#011 End Sub
#012 Private Sub ListBox1_Click()
#013 Dim iRow As Integer
#014 Dim i As Byte
#015 iRow = Sheet1.Range("A65536").End(xlUp).Row + 1
#016 For i = 1 To ListBox1.ColumnCount
#017 Sheet1.Cells(iRow, i) = ListBox1.Column(i - 1)
#018 Next
#019 End Sub
代码解析:
第1行到第11行代码窗体的Initialize事件过程,在窗体初始化时为多列列表框添加列表项。
第8行代码,设置多列列表框中的第一行为列标题行。ColumnHeads 属性显示列表框、组合框及接受列题注的对象中的列标题行,语法如下:
object.ColumnHeads [= Boolean]
参数object是必需的,一个有效的对象。
参数Boolean是可选的,指定是否显示列标题。
将ColumnHeads 属性设置为True,多列列表框的第一行显示为列标题,默认值为False,不显示列标题。
需要注意的是,当数据项中的第一行作为列标题时,则不可选中该行。
第9行代码,使用RowSource属性设置多列列表框中列表的来源。
注意 如果已将多列列表框中列表项来源的第一行设置为列标题,在设置RowSource属性时应从列表项来源的第二行开始设置。
第12行到第19行代码列表框的Click事件,单击多列列表框时把选中行的整行内容写入工作表中。其中第17行代码,使用循环语句将多列列表框选中行的各列的值写入工作表对应的单元格中。在本例中没有指定row参数,所以是把当前选中行的内容写入工作表。
运行窗体后,单击列表框将选中的整行内容写入工作表中。