【问题标题】:Re-Focusing on an Excel Userform ComboBox重新关注 Excel 用户表单组合框
【发布时间】:2013-03-04 18:29:30
【问题描述】:

用户正在向组合框的编辑区域输入数据

ComboBox 的 Change Event 用于运行以下代码;

    AppActivate "Microsoft Excel"
        :
    'Do some stuff
        :
    UserForm1.Show
    UserForm1.ComboBox1.SetFocus

这工作正常,但是;即使组合框现在再次获得焦点(无论如何根据 Userform.ActiveControl),它也没有插入指针来指示这一事实,用户必须重新选择组合框才能继续输入数据

我想要它,以便插入指针重新出现,用户可以继续直接输入数据,而不必重新选择组合框

添加以下代码行

    SendKeys "{TAB}+{TAB}{RIGHT}"

是一种解决方案,但它很混乱(它会生成 ComboBox 事件,如果可能的话最好避免使用 SendKeys)

谁能提出更好的解决方案?

问。为什么黑羊吃的比白羊少?

A.因为没有那么多

【问题讨论】:

    标签: excel vba controls focus userform


    【解决方案1】:

    问题是,用户表单本身可能没有关注工作表或其他用户表单。

    试试这个代码:

    with UserForm1.ComboBox1
        .Visible = False
        .Visible = True
        .setfocus
    end with
    

    或者更一般地设置正确的焦点,调用这个子:

    Sub Focus_ControlOfUserForm(ByRef Obj As Object) 'from the Userform, call Focus_ControlOfUserForm(Me)
    Dim ctl As Control
    With Obj
        Set ctl = .ActiveControl
        If TypeName(ctl) = "MultiPage" Or TypeName(ctl) = "Frame" Then
            Set ctl = ctl.SelectedItem.ActiveControl.Name
        End If
    
        With ctl
            Dim Af As Boolean
            With Application
                Af = .ScreenUpdating
                .ScreenUpdating = False
            End With
            '.SetFocus
            .Visible = False
            .Visible = True
            .SetFocus 
            If Af Then Application.ScreenUpdating = True
        End With
    End With
    End Sub
    

    当我需要在悬停时显示 ControlTipText 时,我还使用这种代码将焦点移到表单上。如果表单没有焦点,则鼠标悬停时不会显示文本气泡...

    【讨论】:

    • +1 重置.Visible 然后.SetFocus 工作! UserForm 初始化后,我很难开始在 ComboBox 中输入内容。
    【解决方案2】:

    之后

    UserForm1.ComboBox1.SetFocus
    

    添加

    UserForm1.ComboBox1.SelStart = 0 'set the selected text starting position to 0
    

    【讨论】:

    • 你能把剩下的进程贴出来吗@@'Do some stuff 可能有其他原因导致它无法工作。
    【解决方案3】:

    在用户窗体更改事件的末尾添加代码:

    Application.OnTime Now + TimeValue("00:00:01"), "GetComboBoxFocus", , True
    

    在模块内添加代码:

    Sub GetComboBoxFocus()
        UserForm1.ComboBox1.SetFocus
    End Sub
    

    我遇到过好几次了。由于某种原因,它会在从模块调用时起作用。一秒钟对最终用户来说几乎是不明显的。如果您愿意,您也可以在事件代码的前面添加它,它会等到当前例程完成然后立即运行(1 秒 - 剩余代码所用的时间)。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 2018-09-27
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多