如何在多列(VBA)中添加多个复选框

时间:2016-06-02 06:47:27

标签: vba excel-vba listview checkbox excel

我有一个包含多列的ListView。更准确地说,ListView包含8列。其中2个应填充复选框。

目前只有第一列包含复选框。它的定义如下:

While Not rs.EOF
   //first column with checkboxes
   ListViewCustomer.ListItems.Add , , rs("Id")
   ListViewCustomer.ListItems(ListViewCustomer.ListItems.Count).tag = rs("Status")
   //second column etc.     
   ListViewCustomer.ListItems(ListViewCustomer.ListItems.Count).ListSubItems.Add , , rs("name")
   ....
   //Here is the second column, which doesn't display the checkboxes
   ListViewCustomer.ListItems(ListViewCustomer.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs("date_from")), "", rs("date_from"))
   ListViewCustomer.ListItems(ListViewCustomer.ListItems.Count).tag = rs("Status2")
Wend

有人知道如何在最后一栏添加复选框吗?

编辑:

是否可以通过添加.Controls来实现此列?

1 个答案:

答案 0 :(得分:1)

ListViewmore expanded version of the ListBox control.ListBox control on msdn as well

它们都显示行记录(ListView具有更高级的格式化选项)。然而,这意味着记录是一行。因此,在选择其中一个项目时选择一行。

复选框的功能是允许用户标记他选择的记录行。

因此,每行只有一个复选框,位于行的前面。

考虑这段代码(这是Excel 2003 VBA,但是给你的想法):

Private Sub UserForm_Initialize()

    Dim MyArray(6, 8)
    'Array containing column values for ListBox.

    ListBox1.ColumnCount = 8
    ListBox1.MultiSelect = fmMultiSelectExtended

    'Load integer values MyArray
    For i = 0 To 5
        MyArray(i, 0) = i
        For j = 1 To 7
            MyArray(i, j) = Rnd
        Next j
    Next i

    'Load ListBox1
    ListBox1.List() = MyArray

End Sub

如果您真的想要,可以自定义ListBoxListView。您可以创建一个框架并在其上放置标签和复选框。这是在我测试的Excel2003中执行此操作的唯一方法。 ListBox对象没有Controls个孩子。

但这更像是一个数据网格而不是ListBoxListView,根据定义,它们是记录(行)的列表。

<强>更新

我看到了您的更新,并且您确实希望将CheckBox放在行的末尾。

如果您只想在最后一行选中一个复选框,则可以执行此自定义复选框。同样,这是为ListBox编写的,因此如果您愿意,需要将其转换为ListView

仍然需要自定义处理,但我有一些时间,所以我做了这个代码。看看你是否喜欢它:

Private Sub ListBox1_Change()

For i = 0 To ListBox1.ListCount - 1
    ListBox1.List(i, 3) = ChrW(&H2610)
Next i

ListBox1.List(ListBox1.ListIndex, 3) = ChrW(&H2611)

End Sub

Private Sub UserForm_Initialize()

Dim MyArray(5, 3)
'Array containing column values for ListBox.

ListBox1.ColumnCount = 4
ListBox1.MultiSelect = 0
ListBox1.ListStyle = 0


    'Load integer values MyArray
    For i = 0 To 5
        MyArray(i, 0) = i
        For j = 1 To 2
            MyArray(i, j) = Rnd
        Next j
        MyArray(i, 3) = ChrW(&H2610)
    Next i

    'Load ListBox1
    ListBox1.List() = MyArray

End Sub