如何保留MultiSelection列表框中的复选框选择?

时间:2016-07-21 21:25:17

标签: excel vba userform checkedlistbox

我有一个带有选项样式的多选列表框(左侧是复选框)。

我有以下代码将所选数据传输到工作表(这必须是动态的,因为列表框本身由动态命名范围提供)。

Private Sub cmdRun_Click()

Dim i As Integer

i = 0

Do While i < lstProperties.ListCount + 1
    If lstProperties.Selected(i) = True Then
    Sheet7.Cells(i + 1, 1) = lstProperties.List(i)
    End If
    i = i + 1
Loop

End Sub

它似乎想要工作,但我认为当我运行命令时,它在第一个循环之后取消选择列表框数据,因此只转换列表框中的第一个选择。

2 个答案:

答案 0 :(得分:1)

我意识到这是一个老话题,但这是我可以在该主题上找到的唯一话题,而且从未解决过。

我的用户表单遇到了完全相同的问题(只有列表中的第一个选定项才返回到工作表,因为它似乎在循环遍历其余项之前取消了对列表框数据的选择),但是在阅读了此线程之后,我能够提出解决方案。

问题在于RowSource是动态命名范围(“ FilterData”),当第一个选定项返回到工作表时,它会触发工作簿重新计算所有公式,包括动态命名范围的公式,因此刷新列表框RowSource并清除选定的项目,然后才有机会遍历所有项目。

解决方案是在您的“ Do While循环”语句之前关闭自动公式计算(然后将其重新打开……非常重要),如下所示:

Application.Calculation = xlCalculateManual
Do While i < lstProperties.ListCount
    If lstProperties.Selected(i) = True Then
        Sheet7.Cells(Rw, 1) = lstProperties.List(i)
        Rw = Rw + 1
    End If
    i = i + 1
Loop
Application.Calculation = xlCalculateAutomatic

希望能帮助其他人寻找相同问题的解决方案。

干杯!

答案 1 :(得分:0)

您需要为行引用使用单独的变量,以便只有在选中列表框中的项目时才能增加它...

Private Sub cmdRun_Click()

Dim Rw As Integer
Dim i As Integer

Sheet7.Columns(1).ClearContents

Rw = 1
i = 0
Do While i < lstProperties.ListCount
    If lstProperties.Selected(i) = True Then
        Sheet7.Cells(Rw, 1) = lstProperties.List(i)
        Rw = Rw + 1
    End If
    i = i + 1
Loop

End Sub