【问题标题】:Error with returning multiple index from a list using listbox multiselect使用列表框多选从列表中返回多个索引时出错
【发布时间】:2019-04-14 00:22:37
【问题描述】:

VBA 新手,有点沮丧。试图为我的老师们制作一个表格来简化文书工作。

我有一个表格中的列表 1. 苹果
2. 橙色
3.葡萄

如果用户要从列表中选择苹果和葡萄,我希望单元格只有索引。所以要在单元格中打印 (1,3)。我不想要这些话。

我当前的代码

Private Sub SpedAccomAddBtn_Click()

'variable to count multiple selections'
VarSped = " "

'loop to keep track of indexes of selected items'
For X = 0 To Me.SpedListBx.ListCount - 1 'count through list
    If Me.SpedListBx.Selected(X) Then    
        If VarSped = " " Then  'if blank then record first item'
            VarSped = Me.SpedListBx.ListIndex + 1 'first selected item. +1 because excel is a 0 based index'
        Else 'if not the first selection add a , between selections'
            VarSped = VarSped & "," & Me.SpedListBx.ListIndex + 1
        End If
    End If
Next X

ThisWorkbook.Sheets("Master SPED Sheet").Range("c4") = VarSped 'print to cell'

如果我使用前面选择 Apple 和 Grape 的示例,我会得到 (3,3) 而不是 (1,3)。我不明白为什么 VarSped 不断被覆盖。 (我是编码新手,我必须评论所有内容,所以我觉得我知道自己在做什么)

【问题讨论】:

    标签: excel vba listbox


    【解决方案1】:

    试试这个,看看如何在循环中引用当前项目:

    Private Sub SpedAccomAddBtn_Click()
    
    Dim VarSped As String
    Dim x As Integer
    
    'variable to count multiple selections'
    VarSped = " "
    
    'loop to keep track of indexes of selected items'
    For x = 0 To Me.SpedListBx.ListCount - 1 'count through list
        If Me.SpedListBx.Selected(x) Then
            If VarSped = " " Then  'if blank then record first item'
                VarSped = Me.SpedListBx.List(x) 'first selected item. +1 because excel is a 0 based index'
            Else 'if not the first selection add a , between selections'
                VarSped = VarSped & "," & Me.SpedListBx.List(x)
            End If
        End If
    Next x
    
    ThisWorkbook.Sheets("Master SPED Sheet").Range("c4") = VarSped 'print to cell'
    
    End Sub
    

    【讨论】:

    • 这对我来说返回值 (1. apple, 3.grape) 而不是 (1,3)
    【解决方案2】:

    您的循环迭代器已经是您的项目位置:只需添加一个即可管理基于 0 的列表:

    Option Explicit
    
    Private Sub SpedAccomAddBtn_Click()
        Dim VarSped As String ' a string is always initialized with a null string, i.e. with a "" string. hence no need for a 'VarSped = ""' statement
    
        Dim X As Long
        For X = 0 To Me.SpedListBx.ListCount - 1 'count through list
            If Me.SpedListBx.Selected(X) Then VarSped = VarSped & "," & X + 1
        Next
    
        If VarSped <> vbNullString Then ThisWorkbook.Sheets("Master SPED Sheet").Range("c4") = Mid$(VarSped, 2) ' print 'VarSped' only if user selected something (i.e. 'VarSped' is not a not string). Mid$() function is used to skip the first character which is a colon 
    End Sub
    

    养成将Option Explicit 放在每个模块的最顶层并显式声明所有变量的习惯:这样既可以节省大量调试时间,又可以让您更好地控制代码

    【讨论】:

    • 我想我理解代码。所以 selected(x) 命令返回索引,我使用了错误的命令。谢谢。
    • 不客气。 Selected(X) 返回是否选择了 Xth 元素,其中 X 是索引本身
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多