【问题标题】:How to add multiple checkboxes in multiple columns (VBA)如何在多列中添加多个复选框(VBA)
【发布时间】:2019-04-05 04:32:54
【问题描述】:

我有一个包含多列的 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添加可以实现本栏目吗?

【问题讨论】:

  • 据我了解,每一行都是 ListBox 中的一条记录,因此您可以选择一条记录,而不是子记录。基于此,我认为这是不可能的。
  • @ib11 不可能。必须可以在多个列中添加多个复选框。
  • 在输入框中输入 $A$1:$c$10 的范围。~Sub InsertCheckBoxes() Dim Rng As Range Dim WorkRng As Range Dim Ws As Worksheet On Error Resume Next xTitleId = "New_Experiments" Set WorkRng = Application.Selection Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8) Set Ws = Application.ActiveSheet Application.ScreenUpdating = False 对于 WorkRng 中的每个 Rng 使用 Ws.CheckBoxes.Add(Rng .Left, Rng.Top, Rng.Width, Rng.Height) .Characters.Text = Rng.Value End With Next WorkRng.ClearContents WorkRng.Select Application.ScreenUpdating = True End Sub
  • 我已经提到了在工作表范围内创建多列复选框的代码。也许其中涉及的概念可以适应您的情况。它适用于我,并在工作表范围内的每个单元格中创建复选框。
  • @skkakkar 感谢您的 cmets。但是我在我的基于 excel 的应用程序中使用了 UserForms。在此 UserForm 中称为 ListView,其中包含一个列表。

标签: vba excel listview checkbox


【解决方案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

【讨论】:

  • 感谢您的回答。我会试试你的方法。你能解释一下ListBox1.MultiSelect = fmMultiSelectExtended的目的吗?为什么我需要多选?
  • @yuro 嗯,你可以查看帮助,我非常喜欢VBA的上下文帮助(F1)。我几乎从中学到了一切。突出显示要查找的单词并按 F1。但是MultiSelect 只是为您提供了让用户同时选择更多行的选项。尝试一下,你会看到的。现在我发布了一个有趣的新代码,在最后一列中放置了一个自定义复选框!
  • 非常感谢您的支持。如果对我的示例有帮助,我会尝试并标记您的答案! :)
  • 好吧,我的理解是,可以在多个列中添加复选框,而不仅仅是在一个列中,例如 ListView,对吧?
  • 回答您关于ListView 的问题。我认为您不能简单地将其放在 VBA 用户窗体上。我对此了解不多,但您可以在msdn.microsoft.com/en-us/library/windows/desktop/… 上阅读它,我认为您仍然需要对其进行自定义。我想我只是不明白你真正想做什么。我希望允许用户在 ListBox 中选择单个单元格,那么它就是一个 DataGrid。但它不是 VBA。见social.msdn.microsoft.com/Forums/en-US/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
相关资源
最近更新 更多