【问题标题】:MultiSelect ListBox alters options when switching windows in Excel多选列表框在 Excel 中切换窗口时更改选项
【发布时间】:2013-02-12 14:07:59
【问题描述】:

我在 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

【问题讨论】:

  • 在窗口或列表框获得焦点时是否编写了任何代码?
  • 是真的被取消了,还是只是高亮显示有问题?
  • at shahkalpesh 有代码:Private Sub ListBox1_GotFocus() Application.ScreenUpdating = False Range("a1").Select End Sub 焦点消失但问题未解决 |在 Sean Cheshire 高亮的选项真的被选中了,所以高亮是对的。
  • 您能否提供更多代码来提供帮助?有很多地方可以更改选择,即使是在表单代码之外的代码(即来自调用/显示表单的代码等),这取决于您如何设置所有内容。

标签: vba excel


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多