首页 > 解决方案 > 用户窗体列表框多选计数以隐藏/取消隐藏其他控件的数量

问题描述

我有一个由一个范围填充的列表框,其中启用了多选 (1)。选定的项目(最多 10 个)然后填充具有相邻组合框和文本框的 Label.Captions,需要用户提供更多信息。我正在寻找计算从列表框中选择的数量(1 到 10 之间)然后隐藏我的相对组合框和文本框(同样,1 到 10)的代码。因此,如果在列表框中进行了 4 个选择,则只有组合/文本框 1 到 4 是可见的(组合/文本框 5 到 10 是隐藏的)。

我有一些我认为需要但无法完成完整过程的代码元素。

For lstbxCount = 1 To 10
  If lstbxCount = 1 Then
    UserForm2.Controls("ComboBox" & lstbxCount).Visible = True
    UserForm2.Controls("TextBox" & lstbxCount).Visible = True
Next intCount

但是上面,如果它有效,我认为只会显示一个具有最高计数的组合框,并且会隐藏所有其他组合框。我正在寻找一个从组合框 1 循环到 lstbxCount 数字并显示这些数字的代码,并隐藏高于 lstbxCount 整数的任何内容。

谢谢。

标签: comboboxcountlistboxhideuserform

解决方案


您的代码在正确的路径上,但是确实需要进行一些调整才能使其正常工作。

目前,您怀疑您的代码仅在存在 ListBox 项目 1 时才会显示您的控件。

下面的代码将根据选定的 ListBox 项显示/隐藏用户窗体控件。

注意:在我的测试中,我创建了:

  1. 一个名为的用户窗体UserForm1
  2. 一个名为的列表框ListBox1
  3. 三个标签命名Label1Label2&Label3
  4. TextBox1三个名为, TextBox2&的TextBoxTextBox3

该代码已分配给 UserForm 模块中的 ListBox Change 事件,因此每次 ListBox 发生更改时,它将显示/隐藏相关控件。

Private Sub ListBox1_Change()

Dim i As Long

For i = 0 To Me.ListBox1.ListCount - 1
    If Me.ListBox1.Selected(i) = True Then
        i = i + 1
        Me.Controls("Label" & i).Visible = True
        Me.Controls("TextBox" & i).Visible = True
        i = i - 1
    ElseIf Me.ListBox1.Selected(i) = False Then
        i = i + 1
        Me.Controls("Label" & i).Visible = False
        Me.Controls("TextBox" & i).Visible = False
        i = i - 1
    End If
Next

End Sub

解释:

该变量i表示我用作计数器的整数。

For...Next语句从 0 循环到 ListBox 项计数减 1。这是因为 ListBox 项具有从零开始的索引,这意味着列表框中的第一项是索引号 0,第二项是索引号 1,依此类推。所以,我们从 0(第一个列表框项)循环直到ListCount值减 1。

注意:为了澄清,列表框项索引编号是从零开始的(从 0 开始),而ListCount属性不是(从 1 开始)。这也将进一步解释。

If Me.ListBox1.Selected(i) = True Then使用我们的计数器变量作为每个 ListBox 项的索引号(从 0 开始并在每次循环迭代时增加 1)来确定它是否被选中。

如果它被选中或未选中,i = i + 1则用于将我们的计数器增加 1。一旦我们的计数器值增加,我们现在可以引用正确的控件来显示/隐藏。一旦我们这样做了,我们将计数器减少 1 ( i = i - 1),因为每次循环迭代的值都会i增加。如果我们在下一次循环迭代之前不减少i它,我们将跳过列表项,这意味着有些项目要显示/隐藏控件,有些则不会。



为了详细说明,让我们删除变量i并以循环的第一次迭代为例

第一次迭代将转化为:

Private Sub ListBox1_Change()

For 0 To Me.ListBox1.ListCount - 1
    If Me.ListBox1.Selected(0) = True Then
        Me.Controls("Label1").Visible = True
        Me.Controls("TextBox1").Visible = True
    ElseIf Me.ListBox1.Selected(i) = False Then
        Me.Controls("Label1").Visible = False
        Me.Controls("TextBox1").Visible = False
    End If
Next

End Sub

我将留给您调整代码以适合您的变量并引用对象/控件的正确名称。


推荐阅读