1

我在 VBA (Excel) 中遇到了 MultiSelect ListBox 的问题。我希望用户在 ListBox 中选择多个选项,但他还需要能够同时切换窗口以在另一个程序中查找选项。当用户切换窗口并返回 Excel 时会出现此问题。当他选择一个选项时,在切换窗口之前被选择为最后一个选项的选项会改变状态(如果选择了最后一个操作,则取消选择该选项;如果取消选择最后一个操作,则选择该选项)。

例子

例子

我选择 A 和 B。我切换窗口,然后返回 Excel。我单击 D 并且 B 未被选中(切换窗口之前最后选择的选项)。这真的让用户感到困惑。

任何人都知道这个问题的原因是什么?有没有办法来解决这个问题?

所有列表框代码:

Private Sub Worksheet_Activate()

  Worksheets(1).ListBox1.Clear

  ile = Worksheets(2).Range("b1").Value

  For i = 1 To ile
    Worksheets(1).ListBox1.AddItem (Worksheets(2).Range("b" + CStr(i + 2)))
  Next i

End Sub


Private Sub ListBox1_GotFocus()

  Application.ScreenUpdating = False

  Range("a1").Select

End Sub

焦点消失但问题未解决

http://imgur.com/Flzpq6N

4

1 回答 1

0

excel的另一个奇怪行为就在那里

您可以将用户选择存储在您不太可能使用的某些工作表的某个模糊范围内(例如 sheet3),因此当它失去焦点时,它不会忘记选择的内容

Private Sub ListBox1_Change()
    Dim i As Long, ii As Long
    With Sheet3.[ObscureRange]
        For i = 0 To ListBox1.listCount - 1
            If ListBox1.Selected(i) = False Then
            For ii = 1 To 250
                If ListBox1.List(i) = .Offset(ii, 0) Then _
                .Offset(ii, 0).Delete xlShiftUp
            If "" = .Offset(ii, 0) Then Exit For
            Next
            Else
            For ii = 1 To 250
                If XcludeList(ListBox1.List(i)) = False Then _
                If "" = .Offset(ii, 0) Then _
                .Offset(ii, 0) = ListBox1.List(i): Exit For
            Next
            End If
        Next
    End With
End Sub

XcludeList 子

Function XcludeList(strVal As String) As Boolean
    Dim i As Long
    With Sheet3.[ObscureRange]
    For i = 1 To 250
        If strVal = .Offset(i, 0) Then XcludeList = True: Exit For
        If .Offset(i, 0).Value = "" Then XcludeList = False: Exit For
    Next
    End With
End Function

这样做的另一个优点是它仍然记住用户关闭用户窗体后的选择,如果您认为这是一个优势:D

于 2013-02-12T03:46:44.333 回答