使用列表框多选从列表返回多个索引时出错
Error with returning multiple index from a list using listbox multiselect
VBA 的新手,有些沮丧。试图为我的老师们制作一个表格来简化文书工作。
我有一个表单列表
1.苹果
2. 橙色
3. 葡萄
如果用户要从列表中 select 苹果和葡萄,我希望单元格只有索引。所以要在单元格中打印 (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 总是被覆盖。
(我是编码新手,我必须评论所有内容,所以我觉得我知道自己在做什么)
试试这个,看看如何在循环中引用当前项目:
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
你的循环迭代器已经是你的项目位置:只需添加一个来管理基于 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
放在每个模块的最顶部并显式声明所有变量的习惯:这既可以节省大量调试时间,又可以让您更好地控制代码
VBA 的新手,有些沮丧。试图为我的老师们制作一个表格来简化文书工作。
我有一个表单列表
1.苹果
2. 橙色
3. 葡萄
如果用户要从列表中 select 苹果和葡萄,我希望单元格只有索引。所以要在单元格中打印 (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 总是被覆盖。 (我是编码新手,我必须评论所有内容,所以我觉得我知道自己在做什么)
试试这个,看看如何在循环中引用当前项目:
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
你的循环迭代器已经是你的项目位置:只需添加一个来管理基于 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
放在每个模块的最顶部并显式声明所有变量的习惯:这既可以节省大量调试时间,又可以让您更好地控制代码