【问题标题】:How to correctly retrieve each selected value from a multiselect listbox array (VBA)如何从多选列表框数组(VBA)中正确检索每个选定的值
【发布时间】:2019-07-29 13:47:41
【问题描述】:

我有一个多选列表框,当更新 cbo 框(选择出借人的名称)时,该列表框会填充连接值(由出借项目的项目 ID 号和项目名称组成)。

基本上,我希望能够回忆或参考每个选定列表项的第一个连接值。以下代码是我尝试将列表框的值保存在数组中,同时尝试仅调用每个选择的第一个串联值。

此代码起作用,但由于某种原因,它只调用最后选择的值。例如,如果选择了以下列表框项; "1:Anthropometric Tape Measure""2:Anthropometric Measuring Kit" 然后报告的值(在 msgbox 中用于故障排除)是 "2,2" 如果最后选择了第二项,而不是 "1,2"

奇怪的是,如果我使用数组代码而不只引用第一个连接值,(tmpArray(selCount) = lbox.List(i) 而不是Split(lbox.List(lbox.ListIndex), ":")(0))代码正常运行。

非常感谢任何有关解决此问题的建议,谢谢!

Public Function GetSelectedItems(lbox As Object)

Dim tmpArray() As Variant
Dim i As Integer
Dim selCount As Integer
    selCount = -1

    For i = 0 To lbox.ListCount - 1

        If lbox.Selected(i) = True Then

            selCount = selCount + 1
            ReDim Preserve tmpArray(selCount)
            tmpArray(selCount) = Split(lbox.List(lbox.ListIndex), ":")(0)
        End If
    Next

    If selCount = -1 Then

        GetSelectedItems = ""
    Else:
        GetSelectedItems = Join(tmpArray, ", ")
    End If

End Function

我正在使用以下代码将数组召回到消息框(仅供参考)。

Dim mySentence As String

mySentence = GetSelectedItems(Me.ListItem)

  Msg = "You selected" & vbNewLine & mySentence

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    问题:

    • 使用Lbox.ListIndex

    答案:

    • 而必须使用i。以上参考了单选列表框中的选定项。我将在多项选择中给出所选项目的正确索引。

    代码:

    Public Function GetSelectedItems(lbox As Object)
    
    Dim tmpArray() As Variant
    Dim i As Integer
    Dim selCount As Integer
        selCount = -1
    
        For i = 0 To lbox.ListCount - 1
    
            If lbox.Selected(i) = True Then
    
                selCount = selCount + 1
                ReDim Preserve tmpArray(selCount)
                tmpArray(selCount) = Split(lbox.list(i), ":")(0)
    
                Set fnd = Worksheets("Sheet7").Range("B11:B19").Find(Split(lbox.list(i), ":")(0))
    
                If Not fnd Is Nothing Then
    
                      fnd.Offset(0, 1).Value = "Selected"
    
                End If
    
    
            End If
        Next
    
        If selCount = -1 Then
    
            GetSelectedItems = ""
        Else:
            GetSelectedItems = Join(tmpArray, ", ")
        End If
    
    End Function
    

    更改工作表名称和范围

    演示:

    【讨论】:

    • 嗯,这很容易。再次感谢 Mikku,非常感谢。抱歉这么简单的错误。
    • 如果我想直接引用检索到的每个单独的值;例如上面的例子 - 如果我想说将适当的项目 12 从“On Loan”(在库存电子表格中)更新为“Available”,我是否需要编写某种循环而不是回忆一次所有选定的值? The code works perfectly for individual values, but it doesn't like it when there are multiple values selected - not even when I remove the comma, or place them on separate lines.
    • 您可以为此编写一个循环,或者将其包含在您当前在上述函数中的循环中。
    • @JoelMcWilliam,我添加了另一个可能对你有帮助的循环。
    • 感谢@Mikku!但是,它现在只注册列表中的第一个值。如果我选择了12,它只会识别出1 被选中。太令人费解了。
    猜你喜欢
    • 2019-11-23
    • 2019-06-08
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多