VBA - 预先选择与逗号分隔的字符串匹配的Userform列表框值

时间:2017-04-07 21:22:43

标签: excel-vba listbox userform vba excel

1)我有一列数据填充用户表单中的多选列表框。值是一周中的几天"星期一" - "星期天"

Dim ListsSheet As Worksheet
Dim LastRow As Long
Dim aCell As Range

Set ListsSheet = Sheets("Lists")
With ListsSheet
    'Fills Days
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
    For Each aCell In .Range("A2:A" & LastRow)
        If aCell.value <> "" Then
        Me.Day.AddItem aCell.value
        End If
    Next

2)我能够收集多个选定的值并将其传输到工作表进行操作。假设用户选择了几天&#34;星期二&#34; +&#34;星期三&#34;,我在单元格中的数据=&#34;星期二,星期三和#34;

3)我尝试重新创建用户最初选择的列表框。我可以使用.additem再次生成日期列表,但我不确定如何根据初始选择选择正确的.listindex值

1 个答案:

答案 0 :(得分:0)

您在列表框中所做的选择记录在一个从零开始的布尔数组中,该数组的列表框中包含的项目数量与列表框一样多。列表框的读/写Selected属性可以访问此数组。在您的情况下,ListBox1.Selected(0)指的是“星期一”,ListBox1.Selected(6)指的是星期日。

ListBox1.Selected(0)将为True或False,具体取决于是否选择星期一。当您关闭表单并在再次显示表单时设置ListBox1.Selected(0) = True(或False)重新建立相同的设置时,您可以阅读此属性。

由于您在A2:A8中有工作日名称,您可以使用ListBox1_Change事件将Selected()数组实时写入B2:B8,并在工作表上使用此范围并重置ListBox。

顺便说一句,您设置列表的方式并不是最有效的。首先,您总是需要列表中的7个项目。因此

LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

会导致比预防更多的错误。另一方面,Excel的VBA提供了Rowsource属性。您可以通过设置该属性来设置列表。以下两个例子都是正确的。

ListBox1.RowSource = ActiveSheet.Range("A2:A8").Address
ListBox1.RowSource = "DaysList"     ' where DaysList is a named range

如果您从工作表中调用表单并因此知道当时哪个表单处于活动状态,则使用ActiveSheet是安全的。或者您可以将数组直接应用于List属性,如下所示: -

ListBox1.List = Split("Mon Tue Wed Thu Fri Sat Sun", " ")