【问题标题】:Excel form listbox issue when using locked property使用锁定属性时的 Excel 表单列表框问题
【发布时间】:2016-12-15 22:33:04
【问题描述】:

我遇到了列表框在 Excel 表单上的行为方式的问题。重现问题的步骤:

  • 使用一个列表框控件创建用户表单
  • 在此用户表单中使用以下代码:

    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
        Me.ListBox1.Locked = True
        Me.ListBox1.Locked = False
    End Sub
    
    Private Sub UserForm_Initialize()
        Dim i As Integer
        For i = 1 To 10
            Me.ListBox1.AddItem i
        Next i
    End Sub
    

当表单首次显示时,我可以使用箭头键和翻页键正常浏览列表框。但是,在触发双击事件后,所有键盘导航都不起作用,包括切换到其他控件(如果它们在表单上)。单击列表框似乎确实有效,并且焦点轮廓显示正确,但是列表框锁定然后解锁后处理焦点的方式有问题。怎么回事?

使用 Office 2013 32 位版本。

【问题讨论】:

  • 并不是说这特别有用,但我也在使用 Office 2013 32 位版本,并且它在 Excel 中正确运行。
  • 你的意思是双击后可以通过键盘选择列表框上的项目?
  • @A.S.H.你的答案去哪儿了?在尝试了您的代码后,我注意到使列表框不可见会将焦点移到下一个控件。如果没有可用的制表位控件,则焦点再次“挂起”,使列表框的.SetFocus 方法成为强制性的。因此,看起来避免这个键盘“挂起”的最可靠方法是将焦点移动到另一个控件,然后将其设置回列表框。
  • 是的,我可以在双击后使用键盘选择列表框上的项目。
  • @OpiesDad 呵呵,那么有些不同了。在工作中运行 Windows 7 32 位,在家里运行 Office 2016 / Windows 10 64 位,并且在两台机器上都 100% 重复。

标签: excel forms vba listbox locked


【解决方案1】:

我设法复制了这个问题,并在锁定和解锁列表框之前将焦点设置在其他地方对我有用:

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
     Me.TextBox1.SetFocus 'or some other control.
     Me.ListBox1.Locked = True
     Me.ListBox1.Locked = False
     Me.ListBox1.SetFocus
End Sub

【讨论】:

    【解决方案2】:

    我测试过的 2 个允许您使用箭头键导航的解决方案。

    1. 鉴于没有单击事件处理程序,请尝试在 DblClick 之后调用单击事件(一直有效):

      Private Sub ListBox1_Click()
          Debug.Print "ListBox1_Click()"
      End Sub
      
      Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
          Debug.Print "ListBox1_DblClick()"
          With Me.ListBox1
              .Locked = True
              .Locked = False
          End With
          ListBox1_Click
      End Sub
      
      Private Sub UserForm_Initialize()
          Dim i As Integer
          For i = 1 To 10
              Me.ListBox1.AddItem i
          Next i
      End Sub
      
    2. 在 DblClick 的末尾设置Cancel = False。 (有时不起作用!)

      Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
          Debug.Print "ListBox1_DblClick()"
          With Me.ListBox1
              .Locked = True
              .Locked = False
          End With
          Cancel = False
      End Sub
      
      Private Sub UserForm_Initialize()
          Dim i As Integer
          For i = 1 To 10
              Me.ListBox1.AddItem i
          Next i
      End Sub
      

    【讨论】:

    • 抱歉,这两种解决方法都不适合我。表单仍然对键盘导航没有响应。
    【解决方案3】:

    更改列表框对我有用的工作表的缩放比例。

    Private Sub Worksheet_Activate()
    Dim temp As Double
    Application.ScreenUpdating = False
    'Change worksheet zoom setting for the active window
    temp = ActiveWindow.Zoom
    ActiveWindow.Zoom = temp + 10
    ActiveWindow.Zoom = temp
    Application.ScreenUpdating = True
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      相关资源
      最近更新 更多